Merge "Truncate tag filter descriptions"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 21 Feb 2018 12:52:22 +0000 (12:52 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 21 Feb 2018 12:52:23 +0000 (12:52 +0000)
592 files changed:
.phpcs.xml
.travis.yml
Gruntfile.js
RELEASE-NOTES-1.31
autoload.php
composer.json
docs/globals.txt
docs/hooks.txt
includes/CategoryFinder.php
includes/DefaultSettings.php
includes/DevelopmentSettings.php [new file with mode: 0644]
includes/EditPage.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HistoryBlob.php
includes/Html.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/Message.php
includes/MovePage.php
includes/OutputPage.php
includes/Revision.php
includes/ServiceWiring.php
includes/Setup.php
includes/SiteStats.php
includes/SiteStatsInit.php [new file with mode: 0644]
includes/Storage/RevisionStore.php
includes/WebRequest.php
includes/api/ApiBase.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiMain.php
includes/api/ApiParse.php
includes/api/ApiQueryImageInfo.php
includes/api/i18n/ar.json
includes/api/i18n/ba.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/hu.json
includes/api/i18n/it.json
includes/api/i18n/ksh.json
includes/api/i18n/lb.json
includes/api/i18n/lt.json
includes/api/i18n/mk.json
includes/api/i18n/nb.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sv.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/auth/AuthPluginPrimaryAuthenticationProvider.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/MessageCache.php
includes/cache/localisation/LocalisationCache.php
includes/changes/EnhancedChangesList.php
includes/changes/RecentChange.php
includes/clientpool/SquidPurgeClient.php
includes/clientpool/SquidPurgeClientPool.php
includes/context/RequestContext.php
includes/db/DatabaseOracle.php
includes/debug/logger/LegacyLogger.php
includes/deferred/DeferredUpdates.php
includes/deferred/SiteStatsUpdate.php
includes/diff/DifferenceEngine.php
includes/exception/MWException.php
includes/exception/MWExceptionHandler.php
includes/filerepo/FileRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/http/CurlHttpRequest.php
includes/import/ImportStreamSource.php
includes/import/ImportableOldRevision.php [new file with mode: 0644]
includes/import/ImportableOldRevisionImporter.php [new file with mode: 0644]
includes/import/ImportableUploadRevision.php [new file with mode: 0644]
includes/import/ImportableUploadRevisionImporter.php [new file with mode: 0644]
includes/import/OldRevisionImporter.php [new file with mode: 0644]
includes/import/UploadRevisionImporter.php [new file with mode: 0644]
includes/import/WikiRevision.php
includes/installer/DatabaseInstaller.php
includes/installer/Installer.php
includes/installer/SqliteInstaller.php
includes/installer/i18n/ast.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/cs.json
includes/installer/i18n/es-formal.json
includes/installer/i18n/fi.json
includes/installer/i18n/ia.json
includes/installer/i18n/mk.json
includes/installer/i18n/nan.json
includes/installer/i18n/nb.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/sv.json
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/jobqueue/jobs/UserGroupExpiryJob.php [new file with mode: 0644]
includes/libs/CryptRand.php
includes/libs/DeferredStringifier.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/HTTPFileStreamer.php
includes/libs/filebackend/MemoryFileBackend.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/filebackend/fileop/StoreFileOp.php
includes/libs/filebackend/fsfile/FSFile.php
includes/libs/filebackend/fsfile/TempFSFile.php
includes/libs/lockmanager/FSLockManager.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/objectcache/IExpiringStore.php
includes/libs/objectcache/MemcachedClient.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/position/MySQLMasterPos.php
includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php
includes/libs/rdbms/encasing/Blob.php
includes/libs/rdbms/encasing/MssqlBlob.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
includes/libs/xmp/XMP.php
includes/logging/LogEntry.php
includes/mail/UserMailer.php
includes/media/Bitmap.php
includes/media/DjVu.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/ExifBitmap.php
includes/media/GIF.php
includes/media/GIFMetadataExtractor.php
includes/media/IPTC.php
includes/media/ImageHandler.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaHandler.php
includes/media/PNG.php
includes/media/PNGMetadataExtractor.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/WebP.php
includes/media/XCF.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/WikiPage.php
includes/parser/DateFormatter.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_DOM.php
includes/parser/Sanitizer.php
includes/registration/ExtensionJsonValidator.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/registration/VersionChecker.php
includes/resourceloader/ResourceLoaderModule.php
includes/search/SearchMySQL.php
includes/search/SearchSqlite.php
includes/session/SessionBackend.php
includes/skins/MediaWikiI18N.php
includes/skins/QuickTemplate.php
includes/skins/Skin.php
includes/sparql/SparqlClient.php [new file with mode: 0644]
includes/sparql/SparqlException.php [new file with mode: 0644]
includes/specials/SpecialExport.php
includes/specials/SpecialLockdb.php
includes/specials/SpecialLog.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnlockdb.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/upload/UploadBase.php
includes/user/ExternalUserNames.php
includes/user/UserGroupMembership.php
includes/utils/ExecutableFinder.php
includes/utils/FileContentsHasher.php
includes/utils/UIDGenerator.php
includes/watcheditem/NoWriteWatchedItemStore.php
includes/watcheditem/WatchedItemStoreInterface.php
jsduck.json
languages/Language.php
languages/data/Names.php
languages/i18n/ace.json
languages/i18n/ady-cyrl.json
languages/i18n/af.json
languages/i18n/ais.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bo.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/bto.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ch.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/cu.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de-ch.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dty.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es-formal.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.json
languages/i18n/ig.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kaa.json
languages/i18n/kab.json
languages/i18n/kiu.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/kum.json
languages/i18n/ky.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lki.json
languages/i18n/lmo.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lus.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/lzz.json
languages/i18n/mai.json
languages/i18n/map-bms.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/mwl.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl-informal.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pdc.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/pnt.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdc.json
languages/i18n/se.json
languages/i18n/sei.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/shn.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tay.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tly.json
languages/i18n/to.json
languages/i18n/tpi.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/tzm.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/vro.json
languages/i18n/wa.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zea.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesEs_formal.php [new file with mode: 0644]
maintenance/Maintenance.php
maintenance/benchmarks/benchmarkJSMinPlus.php
maintenance/checkLess.php
maintenance/cleanupUsersWithNoId.php
maintenance/dumpTextPass.php
maintenance/findHooks.php
maintenance/importImages.php
maintenance/install.php
maintenance/jsparse.php
maintenance/language/StatOutputs.php
maintenance/migrateComments.php
maintenance/rebuildFileCache.php
maintenance/sqlite.php
maintenance/storage/fixT22757.php
maintenance/storage/recompressTracked.php
resources/Resources.php
resources/src/jquery/jquery.byteLimit.js
resources/src/mediawiki.language/mediawiki.cldr.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.js
resources/src/startup.js
tests/integration/includes/http/MWHttpRequestTestCase.php
tests/integration/includes/shell/FirejailCommandTest.php
tests/parser/ParserTestResultNormalizer.php
tests/parser/ParserTestRunner.php
tests/parser/PhpunitTestRecorder.php
tests/parser/editTests.php
tests/parser/fuzzTest.php
tests/phpunit/MediaWikiPHPUnitTestListener.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/registration/bad_spdx.json [new file with mode: 0644]
tests/phpunit/data/registration/good.json [new file with mode: 0644]
tests/phpunit/data/registration/invalid.json [new file with mode: 0644]
tests/phpunit/data/registration/newer_manifest_version.json [new file with mode: 0644]
tests/phpunit/data/registration/no_manifest_version.json [new file with mode: 0644]
tests/phpunit/data/registration/notjson.txt [new file with mode: 0644]
tests/phpunit/data/registration/old_manifest_version.json [new file with mode: 0644]
tests/phpunit/includes/CommentStoreTest.php
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfArrayFilterTest.php
tests/phpunit/includes/MediaWikiVersionFetcherTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SanitizerValidateEmailTest.php
tests/phpunit/includes/SiteStatsTest.php
tests/phpunit/includes/TitleArrayFromResultTest.php
tests/phpunit/includes/WikiReferenceTest.php
tests/phpunit/includes/XmlJsTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiPageSetTest.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php
tests/phpunit/includes/config/EtcdConfigTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/debug/logger/monolog/AvroFormatterTest.php
tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php
tests/phpunit/includes/deferred/MWCallableUpdateTest.php
tests/phpunit/includes/deferred/TransactionRoundDefiningUpdateTest.php
tests/phpunit/includes/exception/BadTitleErrorTest.php
tests/phpunit/includes/exception/ThrottledErrorTest.php
tests/phpunit/includes/externalstore/ExternalStoreFactoryTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/htmlform/HTMLRestrictionsFieldTest.php
tests/phpunit/includes/jobqueue/JobQueueMemoryTest.php
tests/phpunit/includes/libs/ArrayUtilsTest.php
tests/phpunit/includes/libs/DeferredStringifierTest.php
tests/phpunit/includes/libs/DnsSrvDiscovererTest.php
tests/phpunit/includes/libs/GenericArrayObjectTest.php
tests/phpunit/includes/libs/HashRingTest.php
tests/phpunit/includes/libs/HtmlArmorTest.php
tests/phpunit/includes/libs/IEUrlExtensionTest.php
tests/phpunit/includes/libs/IPTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/libs/MWMessagePackTest.php
tests/phpunit/includes/libs/MapCacheLRUTest.php
tests/phpunit/includes/libs/MemoizedCallableTest.php
tests/phpunit/includes/libs/ProcessCacheLRUTest.php
tests/phpunit/includes/libs/SamplingStatsdClientTest.php
tests/phpunit/includes/libs/StringUtilsTest.php
tests/phpunit/includes/libs/TimingTest.php
tests/phpunit/includes/libs/XhprofDataTest.php
tests/phpunit/includes/libs/XhprofTest.php
tests/phpunit/includes/libs/XmlTypeCheckTest.php
tests/phpunit/includes/libs/http/HttpAcceptNegotiatorTest.php
tests/phpunit/includes/libs/http/HttpAcceptParserTest.php
tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php
tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php
tests/phpunit/includes/libs/rdbms/database/DBConnRefTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
tests/phpunit/includes/libs/xmp/XMPTest.php
tests/phpunit/includes/libs/xmp/XMPValidateTest.php
tests/phpunit/includes/objectcache/RedisBagOStuffTest.php
tests/phpunit/includes/parser/ParserIntegrationTest.php
tests/phpunit/includes/parser/ParserOptionsTest.php
tests/phpunit/includes/parser/ParserOutputTest.php
tests/phpunit/includes/registration/ExtensionJsonValidatorTest.php [new file with mode: 0644]
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/registration/ExtensionRegistryTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php
tests/phpunit/includes/resourceloader/DerivativeResourceLoaderContextTest.php
tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderSkinModuleTest.php
tests/phpunit/includes/search/SearchSuggestionSetTest.php
tests/phpunit/includes/services/ServiceContainerTest.php
tests/phpunit/includes/session/PHPSessionHandlerTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/phpunit/includes/session/SessionTest.php
tests/phpunit/includes/shell/CommandFactoryTest.php
tests/phpunit/includes/shell/CommandTest.php
tests/phpunit/includes/shell/FirejailCommandTest.php
tests/phpunit/includes/shell/ShellTest.php
tests/phpunit/includes/site/FileBasedSiteLookupTest.php
tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php
tests/phpunit/includes/site/SiteExporterTest.php
tests/phpunit/includes/site/SiteImporterTest.php
tests/phpunit/includes/site/SitesCacheFileBuilderTest.php
tests/phpunit/includes/sparql/SparqlClientTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/AvroValidatorTest.php
tests/phpunit/includes/utils/ClassCollectorTest.php
tests/phpunit/includes/utils/FileContentsHasherTest.php
tests/phpunit/includes/utils/MWCryptHashTest.php
tests/phpunit/includes/utils/MWRestrictionsTest.php
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/includes/utils/ZipDirectoryReaderTest.php
tests/phpunit/includes/watcheditem/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/languages/LanguageCodeTest.php
tests/phpunit/maintenance/BenchmarkerTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/phpunit.php
tests/phpunit/structure/ApiStructureTest.php
tests/phpunit/structure/AutoLoaderTest.php
tests/phpunit/structure/AvailableRightsTest.php
tests/phpunit/structure/ExtensionJsonValidationTest.php
tests/phpunit/structure/StructureTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
thumb.php

index 7f90f27..cd55428 100644 (file)
@@ -7,7 +7,6 @@
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingReturn" />
-               <exclude name="MediaWiki.Commenting.FunctionComment.ParamNameNoMatch" />
                <exclude name="MediaWiki.Commenting.FunctionComment.ExtraParamComment" />
                <exclude name="MediaWiki.Commenting.FunctionComment.WrongStyle" />
                <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentStart" />
@@ -29,6 +28,8 @@
                <exclude name="MediaWiki.Commenting.FunctionComment.SpacingDocTag" />
                <exclude name="Squiz.Scope.MethodScope.Missing" />
                <exclude name="Squiz.Scope.MemberVarScope.Missing" />
+               <exclude name="MediaWiki.Commenting.MissingCovers.MissingCovers" />
+               <exclude name="MediaWiki.Usage.AssignmentInReturn.AssignmentInReturn" />
        </rule>
        <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
                <properties>
index b06d9f4..a28dac0 100644 (file)
@@ -69,6 +69,8 @@ before_script:
       --dbuser "$dbuser"
       --dbpass ""
       --scriptpath "/w"
+  - echo -en "\n\nrequire_once __DIR__ . '/includes/DevelopmentSettings.php';\n" >> ./LocalSettings.php
+  - php -l ./LocalSettings.php
 
 script:
   - php tests/phpunit/phpunit.php
index d1ef72f..cb9a20d 100644 (file)
@@ -98,8 +98,8 @@ module.exports = function ( grunt ) {
                        chromium: {
                                browsers: [ 'Chromium' ]
                        },
-                       more: {
-                               browsers: [ 'Chrome', 'Firefox' ]
+                       firefox: {
+                               browsers: [ 'Firefox' ]
                        }
                },
                copy: {
index 88d927e..2c071b5 100644 (file)
@@ -26,6 +26,8 @@ production.
   default mode.
 * CACHE_ACCEL now only supports APC(u) or WinCache. XCache support was removed
   as upstream is inactive and has no plans to move to PHP 7.
+* The old CategorizedRecentChanges feature, including its related configuration
+  option $wgAllowCategorizedRecentChanges, has been removed.
 
 === New features in 1.31 ===
 * Wikimedia\Rdbms\IDatabase->select() and similar methods now support
@@ -46,6 +48,9 @@ production.
   initial page text for file uploads.
 * (T181651) The info page for File pages now displays the file's base-16 SHA1
   hash value in the table of basic information.
+* Style tags with a 'data-mw-deduplicate' attribute will be deduplicated as a
+  ParserOutput::getText() post-cache transformation. This may be disabled by
+  passing 'deduplicateStyles' => false to that method.
 
 === External library changes in 1.31 ===
 
@@ -60,6 +65,7 @@ production.
 * Updated wikimedia/running-stat from 1.1.0 to 1.2.0.
 * Updated wikimedia/wrappedstring from 2.2.0 to 2.3.0.
 * Updated mediawiki/at-ease from 1.1.0 to 1.2.0.
+* Updated wikimedia/php-session-serializer from 1.0.4 to 1.0.5.
 * …
 
 ==== New external libraries ====
@@ -97,6 +103,7 @@ changes to languages because of Phabricator reports.
 * (T186359) New language support: Siberian Tatar [cебертатар] (sty).
 * (T186635) New language support: Guianan Creole (gcr).
 * (T186647) New language support: Kumyk [къумукъ] (kum).
+* (T187750) New language support: Spanish formal address (es-formal).
 
 === Other changes in 1.31 ===
 * Introducing multi-content-revision capability into the storage layer. For details,
@@ -230,6 +237,10 @@ changes to languages because of Phabricator reports.
   * CommentStore::getCommentLegacy
   * CommentStore::insert
   * CommentStore::insertWithTemplate
+* The method ResourceLoaderModule::getPosition(), deprecated in 1.29, has been removed.
+* The DeferredStringifier class is deprecated, use Message::listParam() instead.
+* The type string for the parameter $lang of DateFormatter::getInstance is
+  deprecated.
 
 == Compatibility ==
 MediaWiki 1.31 requires PHP 5.5.9 or later. Although HHVM 3.18.5 or later is supported,
index 9618a8f..7f90d47 100644 (file)
@@ -647,6 +647,10 @@ $wgAutoloadLocalClasses = [
        'ImportStringSource' => __DIR__ . '/includes/import/ImportStringSource.php',
        'ImportTextFiles' => __DIR__ . '/maintenance/importTextFiles.php',
        'ImportTitleFactory' => __DIR__ . '/includes/title/ImportTitleFactory.php',
+       'ImportableOldRevision' => __DIR__ . '/includes/import/ImportableOldRevision.php',
+       'ImportableOldRevisionImporter' => __DIR__ . '/includes/import/ImportableOldRevisionImporter.php',
+       'ImportableUploadRevision' => __DIR__ . '/includes/import/ImportableUploadRevision.php',
+       'ImportableUploadRevisionImporter' => __DIR__ . '/includes/import/ImportableUploadRevisionImporter.php',
        'IncludableSpecialPage' => __DIR__ . '/includes/specialpage/IncludableSpecialPage.php',
        'IndexPager' => __DIR__ . '/includes/pager/IndexPager.php',
        'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
@@ -939,6 +943,8 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Shell\\Result' => __DIR__ . '/includes/shell/Result.php',
        'MediaWiki\\Shell\\Shell' => __DIR__ . '/includes/shell/Shell.php',
        'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
+       'MediaWiki\\Sparql\\SparqlClient' => __DIR__ . '/includes/sparql/SparqlClient.php',
+       'MediaWiki\\Sparql\\SparqlException' => __DIR__ . '/includes/sparql/SparqlException.php',
        'MediaWiki\\Storage\\BlobAccessException' => __DIR__ . '/includes/Storage/BlobAccessException.php',
        'MediaWiki\\Storage\\BlobStore' => __DIR__ . '/includes/Storage/BlobStore.php',
        'MediaWiki\\Storage\\BlobStoreFactory' => __DIR__ . '/includes/Storage/BlobStoreFactory.php',
@@ -1073,6 +1079,7 @@ $wgAutoloadLocalClasses = [
        'ObjectFactory' => __DIR__ . '/includes/compat/ObjectFactory.php',
        'OldChangesList' => __DIR__ . '/includes/changes/OldChangesList.php',
        'OldLocalFile' => __DIR__ . '/includes/filerepo/file/OldLocalFile.php',
+       'OldRevisionImporter' => __DIR__ . '/includes/import/OldRevisionImporter.php',
        'OracleInstaller' => __DIR__ . '/includes/installer/OracleInstaller.php',
        'OracleUpdater' => __DIR__ . '/includes/installer/OracleUpdater.php',
        'OrderedStreamingForkController' => __DIR__ . '/includes/OrderedStreamingForkController.php',
@@ -1361,7 +1368,7 @@ $wgAutoloadLocalClasses = [
        'SiteLookup' => __DIR__ . '/includes/site/SiteLookup.php',
        'SiteSQLStore' => __DIR__ . '/includes/site/SiteSQLStore.php',
        'SiteStats' => __DIR__ . '/includes/SiteStats.php',
-       'SiteStatsInit' => __DIR__ . '/includes/SiteStats.php',
+       'SiteStatsInit' => __DIR__ . '/includes/SiteStatsInit.php',
        'SiteStatsUpdate' => __DIR__ . '/includes/deferred/SiteStatsUpdate.php',
        'SiteStore' => __DIR__ . '/includes/site/SiteStore.php',
        'SitesCacheFileBuilder' => __DIR__ . '/includes/site/SitesCacheFileBuilder.php',
@@ -1568,6 +1575,7 @@ $wgAutoloadLocalClasses = [
        'UploadFromStash' => __DIR__ . '/includes/upload/UploadFromStash.php',
        'UploadFromUrl' => __DIR__ . '/includes/upload/UploadFromUrl.php',
        'UploadLogFormatter' => __DIR__ . '/includes/logging/UploadLogFormatter.php',
+       'UploadRevisionImporter' => __DIR__ . '/includes/import/UploadRevisionImporter.php',
        'UploadSourceAdapter' => __DIR__ . '/includes/import/UploadSourceAdapter.php',
        'UploadSourceField' => __DIR__ . '/includes/specials/formfields/UploadSourceField.php',
        'UploadStash' => __DIR__ . '/includes/upload/UploadStash.php',
@@ -1589,6 +1597,7 @@ $wgAutoloadLocalClasses = [
        'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php',
        'UserCache' => __DIR__ . '/includes/cache/UserCache.php',
        'UserDupes' => __DIR__ . '/maintenance/userDupes.inc',
+       'UserGroupExpiryJob' => __DIR__ . '/includes/jobqueue/jobs/UserGroupExpiryJob.php',
        'UserGroupMembership' => __DIR__ . '/includes/user/UserGroupMembership.php',
        'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php',
        'UserNamePrefixSearch' => __DIR__ . '/includes/user/UserNamePrefixSearch.php',
index c3ff8d6..c96374f 100644 (file)
@@ -37,7 +37,7 @@
                "wikimedia/html-formatter": "1.0.1",
                "wikimedia/ip-set": "1.2.0",
                "wikimedia/object-factory": "1.0.0",
-               "wikimedia/php-session-serializer": "1.0.4",
+               "wikimedia/php-session-serializer": "1.0.5",
                "wikimedia/purtle": "1.0.6",
                "wikimedia/relpath": "2.1.1",
                "wikimedia/remex-html": "1.0.2",
@@ -55,7 +55,7 @@
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a",
                "justinrainbow/json-schema": "~5.2",
-               "mediawiki/mediawiki-codesniffer": "15.0.0",
+               "mediawiki/mediawiki-codesniffer": "16.0.0",
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "3.1.3",
                "nmred/kafka-php": "0.1.5",
index 8b4c755..5bdb31c 100644 (file)
@@ -9,7 +9,7 @@ in a much more flexible way. Consider the elegance of:
     # Generate the article HTML as if viewed by a web request
     $article = new Article( Title::newFromText( $t ) );
     $article->view();
+
 versus
 
     # Save current globals
index 7084b51..4e8474b 100644 (file)
@@ -2333,6 +2333,7 @@ $wikiPage: the WikiPage edited
 $rev: the new revision
 $baseID: the revision ID this was based off, if any
 $user: the editing user
+&$tags: tags to apply to the edit and recent change
 
 'OldChangesListRecentChangesLine': Customize entire recent changes line, or
 return false to omit the line from RecentChanges and Watchlist special pages.
index 3561f7f..7446b59 100644 (file)
@@ -42,6 +42,8 @@ use Wikimedia\Rdbms\IDatabase;
  *     $a = $cf->run();
  *     print implode( ',' , $a );
  * @endcode
+ *
+ * @deprecated since 1.31
  */
 class CategoryFinder {
        /** @var int[] The original article IDs passed to the seed function */
index a6a3686..ae5cef5 100644 (file)
@@ -6673,9 +6673,9 @@ $wgGitBin = '/usr/bin/git';
  */
 $wgGitRepositoryViewers = [
        'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' =>
-               'https://phabricator.wikimedia.org/r/revision/%R;%H',
+               'https://gerrit.wikimedia.org/g/%R/+/%H',
        'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' =>
-               'https://phabricator.wikimedia.org/r/revision/%R;%H',
+               'https://gerrit.wikimedia.org/g/%R/+/%H',
 ];
 
 /** @} */ # End of maintenance }
@@ -6953,11 +6953,6 @@ $wgShowUpdatedMarker = true;
  */
 $wgDisableAnonTalk = false;
 
-/**
- * Enable filtering of categories in Recentchanges
- */
-$wgAllowCategorizedRecentChanges = false;
-
 /**
  * Allow filtering by change tag in recentchanges, history, etc
  * Has no effect if no tags are defined in valid_tag.
@@ -7459,6 +7454,7 @@ $wgJobClasses = [
        'clearUserWatchlist' => ClearUserWatchlistJob::class,
        'cdnPurge' => CdnPurgeJob::class,
        'enqueue' => EnqueueJob::class, // local queue for multi-DC setups
+       'userGroupExpiry' => UserGroupExpiryJob::class,
        'null' => NullJob::class,
 ];
 
diff --git a/includes/DevelopmentSettings.php b/includes/DevelopmentSettings.php
new file mode 100644 (file)
index 0000000..96ed56b
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Extra settings useful for MediaWiki development.
+ *
+ * To enable built-in debug and development settings, add the
+ * following to your LocalSettings.php file.
+ *
+ *     require "$IP/includes/DevelopmentSettings.php";
+ *
+ * Alternatively, if running phpunit.php (or another Maintenance script),
+ * you can use the --mwdebug option to automatically load these settings.
+ *
+ * @file
+ */
+
+/**
+ * Debugging: PHP
+ */
+
+// Enable showing of errors
+error_reporting( -1 );
+ini_set( 'display_errors', 1 );
+
+/**
+ * Debugging: MediaWiki
+ */
+global $wgDevelopmentWarnings, $wgShowDBErrorBacktrace, $wgShowExceptionDetails,
+       $wgShowSQLErrors, $wgDebugRawPage,
+       $wgDebugComments, $wgDebugDumpSql, $wgDebugTimestamps,
+       $wgCommandLineMode, $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
+
+// Use of wfWarn() should cause tests to fail
+$wgDevelopmentWarnings = true;
+
+// Enable showing of errors
+$wgShowDBErrorBacktrace = true;
+$wgShowExceptionDetails = true;
+$wgShowSQLErrors = true;
+$wgDebugRawPage = true; // T49960
+
+// Enable log files
+$logDir = getenv( 'MW_LOG_DIR' );
+if ( $logDir ) {
+       if ( $wgCommandLineMode ) {
+               $wgDebugLogFile = "$logDir/mw-debug-cli.log";
+       } else {
+               $wgDebugLogFile = "$logDir/mw-debug-www.log";
+       }
+       $wgDBerrorLog = "$logDir/mw-dberror.log";
+       $wgDebugLogGroups['ratelimit'] = "$logDir/mw-ratelimit.log";
+       $wgDebugLogGroups['exception'] = "$logDir/mw-exception.log";
+       $wgDebugLogGroups['error'] = "$logDir/mw-error.log";
+}
+unset( $logDir );
index 6fbeed7..f9c7fb2 100644 (file)
@@ -325,7 +325,7 @@ class EditPage {
        /** @var bool Has a summary been preset using GET parameter &summary= ? */
        public $hasPresetSummary = false;
 
-       /** @var Revision|bool */
+       /** @var Revision|bool|null */
        public $mBaseRevision = false;
 
        /** @var bool */
@@ -2369,7 +2369,7 @@ ERROR;
        /**
         * @note: this method is very poorly named. If the user opened the form with ?oldid=X,
         *        one might think of X as the "base revision", which is NOT what this returns.
-        * @return Revision Current version when the edit was started
+        * @return Revision|null Current version when the edit was started
         */
        public function getBaseRevision() {
                if ( !$this->mBaseRevision ) {
@@ -4028,7 +4028,6 @@ ERROR;
                        $this->mTitle, $pstContent, $user );
                $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions );
                ScopedCallback::consume( $scopedCallback );
-               $parserOutput->setEditSectionTokens( false ); // no section edit links
                return [
                        'parserOutput' => $parserOutput,
                        'html' => $parserOutput->getText( [
index fb75c25..6270b27 100644 (file)
@@ -306,9 +306,9 @@ class GitInfo {
                        $config = "{$this->basedir}/config";
                        $url = false;
                        if ( is_readable( $config ) ) {
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                $configArray = parse_ini_file( $config, true );
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
                                $remote = false;
 
                                // Use the "origin" remote repo if available or any other repo if not.
index a06d721..884c3f0 100644 (file)
@@ -877,9 +877,9 @@ function wfParseUrl( $url ) {
        if ( $wasRelative ) {
                $url = "http:$url";
        }
-       MediaWiki\suppressWarnings();
+       Wikimedia\suppressWarnings();
        $bits = parse_url( $url );
-       MediaWiki\restoreWarnings();
+       Wikimedia\restoreWarnings();
        // parse_url() returns an array without scheme for some invalid URLs, e.g.
        // parse_url("%0Ahttp://example.com") == [ 'host' => '%0Ahttp', 'path' => 'example.com' ]
        if ( !$bits || !isset( $bits['scheme'] ) ) {
@@ -2009,19 +2009,19 @@ function wfNegotiateType( $cprefs, $sprefs ) {
 /**
  * Reference-counted warning suppression
  *
- * @deprecated since 1.26, use MediaWiki\suppressWarnings() directly
+ * @deprecated since 1.26, use Wikimedia\suppressWarnings() directly
  * @param bool $end
  */
 function wfSuppressWarnings( $end = false ) {
-       MediaWiki\suppressWarnings( $end );
+       Wikimedia\suppressWarnings( $end );
 }
 
 /**
- * @deprecated since 1.26, use MediaWiki\restoreWarnings() directly
+ * @deprecated since 1.26, use Wikimedia\restoreWarnings() directly
  * Restore error level to previous value
  */
 function wfRestoreWarnings() {
-       MediaWiki\restoreWarnings();
+       Wikimedia\restoreWarnings();
 }
 
 /**
@@ -2150,9 +2150,9 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
        }
 
        // Turn off the normal warning, we're doing our own below
-       MediaWiki\suppressWarnings();
+       Wikimedia\suppressWarnings();
        $ok = mkdir( $dir, $mode, true ); // PHP5 <3
-       MediaWiki\restoreWarnings();
+       Wikimedia\restoreWarnings();
 
        if ( !$ok ) {
                // directory may have been created on another request since we last checked
@@ -2412,9 +2412,9 @@ function wfMerge( $old, $mine, $yours, &$result, &$mergeAttemptResult = null ) {
 
        # This check may also protect against code injection in
        # case of broken installations.
-       MediaWiki\suppressWarnings();
+       Wikimedia\suppressWarnings();
        $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
-       MediaWiki\restoreWarnings();
+       Wikimedia\restoreWarnings();
 
        if ( !$haveDiff3 ) {
                wfDebug( "diff3 not found\n" );
@@ -2496,9 +2496,9 @@ function wfDiff( $before, $after, $params = '-u' ) {
        }
 
        global $wgDiff;
-       MediaWiki\suppressWarnings();
+       Wikimedia\suppressWarnings();
        $haveDiff = $wgDiff && file_exists( $wgDiff );
-       MediaWiki\restoreWarnings();
+       Wikimedia\restoreWarnings();
 
        # This check may also protect against code injection in
        # case of broken installations.
@@ -2754,7 +2754,7 @@ function wfSetupSession( $sessionId = false ) {
        if ( session_id() !== $session->getId() ) {
                session_id( $session->getId() );
        }
-       MediaWiki\quietCall( 'session_start' );
+       Wikimedia\quietCall( 'session_start' );
 }
 
 /**
@@ -3122,15 +3122,15 @@ function wfMemoryLimit() {
                $conflimit = wfShorthandToInteger( $wgMemoryLimit );
                if ( $conflimit == -1 ) {
                        wfDebug( "Removing PHP's memory limit\n" );
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        ini_set( 'memory_limit', $conflimit );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        return $conflimit;
                } elseif ( $conflimit > $memlimit ) {
                        wfDebug( "Raising PHP's memory limit to $conflimit bytes\n" );
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        ini_set( 'memory_limit', $conflimit );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        return $conflimit;
                }
        }
@@ -3283,9 +3283,9 @@ function wfUnpack( $format, $data, $length = false ) {
                }
        }
 
-       MediaWiki\suppressWarnings();
+       Wikimedia\suppressWarnings();
        $result = unpack( $format, $data );
-       MediaWiki\restoreWarnings();
+       Wikimedia\restoreWarnings();
 
        if ( $result === false ) {
                // If it cannot extract the packed data.
index 26a6d45..1d4f6e4 100644 (file)
@@ -519,9 +519,9 @@ class DiffHistoryBlob implements HistoryBlob {
        function diff( $t1, $t2 ) {
                # Need to do a null concatenation with warnings off, due to bugs in the current version of xdiff
                # "String is not zero-terminated"
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $diff = xdiff_string_rabdiff( $t1, $t2 ) . '';
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                return $diff;
        }
 
@@ -532,9 +532,9 @@ class DiffHistoryBlob implements HistoryBlob {
         */
        function patch( $base, $diff ) {
                if ( function_exists( 'xdiff_string_bpatch' ) ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $text = xdiff_string_bpatch( $base, $diff ) . '';
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        return $text;
                }
 
index dfd80a8..3bcf131 100644 (file)
@@ -589,9 +589,12 @@ class Html {
         *
         * @param string $contents CSS
         * @param string $media A media type string, like 'screen'
+        * @param array $attribs (since 1.31) Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         * @return string Raw HTML
         */
-       public static function inlineStyle( $contents, $media = 'all' ) {
+       public static function inlineStyle( $contents, $media = 'all', $attribs = [] ) {
                // Don't escape '>' since that is used
                // as direct child selector.
                // Remember, in css, there is no "x" for hexadecimal escapes, and
@@ -609,7 +612,7 @@ class Html {
 
                return self::rawElement( 'style', [
                        'media' => $media,
-               ], $contents );
+               ] + $attribs, $contents );
        }
 
        /**
index 371f2cb..6c932d2 100644 (file)
@@ -1031,7 +1031,7 @@ class MediaWiki {
                        $port = $info['port'];
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $sock = $host ? fsockopen(
                        $host,
                        $port,
@@ -1040,7 +1040,7 @@ class MediaWiki {
                        // If it takes more than 100ms to connect to ourselves there is a problem...
                        0.100
                ) : false;
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $invokedWithSuccess = true;
                if ( $sock ) {
index 9077666..59f194d 100644 (file)
@@ -690,6 +690,30 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'ReadOnlyMode' );
        }
 
+       /**
+        * @since 1.31
+        * @return \UploadRevisionImporter
+        */
+       public function getWikiRevisionUploadImporter() {
+               return $this->getService( 'UploadRevisionImporter' );
+       }
+
+       /**
+        * @since 1.31
+        * @return \OldRevisionImporter
+        */
+       public function getWikiRevisionOldRevisionImporter() {
+               return $this->getService( 'OldRevisionImporter' );
+       }
+
+       /**
+        * @since 1.31
+        * @return \OldRevisionImporter
+        */
+       public function getWikiRevisionOldRevisionImporterNoUpdates() {
+               return $this->getService( 'WikiRevisionOldRevisionImporterNoUpdates' );
+       }
+
        /**
         * @since 1.30
         * @return CommandFactory
index fac9a59..7d05f41 100644 (file)
@@ -1105,7 +1105,7 @@ class Message implements MessageSpecifier, Serializable {
        public static function listParam( array $list, $type = 'text' ) {
                if ( !isset( self::$listTypeMap[$type] ) ) {
                        throw new InvalidArgumentException(
-                               "Invalid type '$type'. Known types are: " . join( ', ', array_keys( self::$listTypeMap ) )
+                               "Invalid type '$type'. Known types are: " . implode( ', ', array_keys( self::$listTypeMap ) )
                        );
                }
                return [ 'list' => $list, 'type' => $type ];
index fe82465..fc9f6a6 100644 (file)
@@ -597,7 +597,12 @@ class MovePage {
 
                                $redirectArticle->doEditUpdates( $redirectRevision, $user, [ 'created' => true ] );
 
-                               ChangeTags::addTags( $changeTags, null, $redirectRevId, null );
+                               // make a copy because of log entry below
+                               $redirectTags = $changeTags;
+                               if ( in_array( 'mw-new-redirect', ChangeTags::getSoftwareTags() ) ) {
+                                       $redirectTags[] = 'mw-new-redirect';
+                               }
+                               ChangeTags::addTags( $redirectTags, null, $redirectRevId, null );
                        }
                }
 
index e6345ba..f95327a 100644 (file)
@@ -287,11 +287,6 @@ class OutputPage extends ContextSource {
         */
        private $mEnableTOC = false;
 
-       /**
-        * @var bool Whether parser output should contain section edit links
-        */
-       private $mEnableSectionEditLinks = true;
-
        /**
         * @var string|null The URL to send in a <link> element with rel=license
         */
@@ -493,7 +488,7 @@ class OutputPage extends ContextSource {
         * Filter an array of modules to remove insufficiently trustworthy members, and modules
         * which are no longer registered (eg a page is cached before an extension is disabled)
         * @param array $modules
-        * @param string|null $position If not null, only return modules with this position
+        * @param string|null $position Unused
         * @param string $type
         * @return array
         */
@@ -506,7 +501,6 @@ class OutputPage extends ContextSource {
                        $module = $resourceLoader->getModule( $val );
                        if ( $module instanceof ResourceLoaderModule
                                && $module->getOrigin() <= $this->getAllowedModules( $type )
-                               && ( is_null( $position ) || $module->getPosition() == $position )
                        ) {
                                if ( $this->mTarget && !in_array( $this->mTarget, $module->getTargets() ) ) {
                                        $this->warnModuleTargetFilter( $module->getName() );
@@ -537,7 +531,7 @@ class OutputPage extends ContextSource {
         * Get the list of modules to include on this page
         *
         * @param bool $filter Whether to filter out insufficiently trustworthy modules
-        * @param string|null $position If not null, only return modules with this position
+        * @param string|null $position Unused
         * @param string $param
         * @param string $type
         * @return array Array of module names
@@ -547,7 +541,7 @@ class OutputPage extends ContextSource {
        ) {
                $modules = array_values( array_unique( $this->$param ) );
                return $filter
-                       ? $this->filterModules( $modules, $position, $type )
+                       ? $this->filterModules( $modules, null, $type )
                        : $modules;
        }
 
@@ -566,11 +560,11 @@ class OutputPage extends ContextSource {
         * Get the list of module JS to include on this page
         *
         * @param bool $filter
-        * @param string|null $position
+        * @param string|null $position Unused
         * @return array Array of module names
         */
        public function getModuleScripts( $filter = false, $position = null ) {
-               return $this->getModules( $filter, $position, 'mModuleScripts',
+               return $this->getModules( $filter, null, 'mModuleScripts',
                        ResourceLoaderModule::TYPE_SCRIPTS
                );
        }
@@ -590,11 +584,11 @@ class OutputPage extends ContextSource {
         * Get the list of module CSS to include on this page
         *
         * @param bool $filter
-        * @param string|null $position
+        * @param string|null $position Unused
         * @return array Array of module names
         */
        public function getModuleStyles( $filter = false, $position = null ) {
-               return $this->getModules( $filter, $position, 'mModuleStyles',
+               return $this->getModules( $filter, null, 'mModuleStyles',
                        ResourceLoaderModule::TYPE_STYLES
                );
        }
@@ -777,9 +771,9 @@ class OutputPage extends ContextSource {
                # this breaks strtotime().
                $clientHeader = preg_replace( '/;.*$/', '', $clientHeader );
 
-               MediaWiki\suppressWarnings(); // E_STRICT system time bitching
+               Wikimedia\suppressWarnings(); // E_STRICT system time bitching
                $clientHeaderTime = strtotime( $clientHeader );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$clientHeaderTime ) {
                        wfDebug( __METHOD__
                                . ": unable to parse the client's If-Modified-Since header: $clientHeader\n" );
@@ -1548,7 +1542,6 @@ class OutputPage extends ContextSource {
                        // Someone is trying to set a bogus pre-$wgUser PO. Check if it has
                        // been changed somehow, and keep it if so.
                        $anonPO = ParserOptions::newFromAnon();
-                       $anonPO->setEditSection( false );
                        $anonPO->setAllowUnsafeRawHtml( false );
                        if ( !$options->matches( $anonPO ) ) {
                                wfLogWarning( __METHOD__ . ': Setting a changed bogus ParserOptions: ' . wfGetAllCallers( 5 ) );
@@ -1562,7 +1555,6 @@ class OutputPage extends ContextSource {
                                // ParserOptions for it. And don't cache this ParserOptions
                                // either.
                                $po = ParserOptions::newFromAnon();
-                               $po->setEditSection( false );
                                $po->setAllowUnsafeRawHtml( false );
                                $po->isBogus = true;
                                if ( $options !== null ) {
@@ -1572,7 +1564,6 @@ class OutputPage extends ContextSource {
                        }
 
                        $this->mParserOptions = ParserOptions::newFromContext( $this->getContext() );
-                       $this->mParserOptions->setEditSection( false );
                        $this->mParserOptions->setAllowUnsafeRawHtml( false );
                }
 
@@ -1822,7 +1813,7 @@ class OutputPage extends ContextSource {
                // so that extensions may modify ParserOutput to toggle TOC.
                // This cannot be moved to addParserOutputText because that is not
                // called by EditPage for Preview.
-               if ( $parserOutput->getTOCEnabled() && $parserOutput->getTOCHTML() ) {
+               if ( $parserOutput->getTOCHTML() ) {
                        $this->mEnableTOC = true;
                }
        }
@@ -1868,17 +1859,6 @@ class OutputPage extends ContextSource {
         */
        function addParserOutput( $parserOutput, $poOptions = [] ) {
                $this->addParserOutputMetadata( $parserOutput );
-
-               // Touch section edit links only if not previously disabled
-               if ( $parserOutput->getEditSectionTokens() ) {
-                       $parserOutput->setEditSectionTokens( $this->mEnableSectionEditLinks );
-               }
-               if ( !$this->mEnableSectionEditLinks
-                       && !array_key_exists( 'enableSectionEditLinks', $poOptions )
-               ) {
-                       $poOptions['enableSectionEditLinks'] = false;
-               }
-
                $this->addParserOutputText( $parserOutput, $poOptions );
        }
 
@@ -2977,8 +2957,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * JS stuff to put at the bottom of the `<body>`. These are modules with position 'bottom',
-        * legacy scripts ($this->mScripts), and user JS.
+        * JS stuff to put at the bottom of the `<body>`.
+        * These are legacy scripts ($this->mScripts), and user JS.
         *
         * @return string|WrappedStringList HTML
         */
@@ -3896,7 +3876,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.31, use $poOptions to addParserOutput() instead.
         */
        public function enableSectionEditLinks( $flag = true ) {
-               $this->mEnableSectionEditLinks = $flag;
+               wfDeprecated( __METHOD__, '1.31' );
        }
 
        /**
@@ -3905,7 +3885,8 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.31, use $poOptions to addParserOutput() instead.
         */
        public function sectionEditLinksEnabled() {
-               return $this->mEnableSectionEditLinks;
+               wfDeprecated( __METHOD__, '1.31' );
+               return true;
        }
 
        /**
index eba563c..d9d3149 100644 (file)
@@ -906,6 +906,11 @@ class Revision implements IDBAccessObject {
                        return $this->mRecord->getContent( 'main', $audience, $user );
                }
                catch ( RevisionAccessException $e ) {
+                       wfDebugLog(
+                               'T184670',
+                               __METHOD__ . ": Cannot get content: " . $e->getMessage() .
+                               "\n" . $e->getTraceAsString()
+                       );
                        return null;
                }
        }
index 8b0452d..dab9fb9 100644 (file)
@@ -442,6 +442,29 @@ return [
                );
        },
 
+       'UploadRevisionImporter' => function ( MediaWikiServices $services ) {
+               return new ImportableUploadRevisionImporter(
+                       $services->getMainConfig()->get( 'EnableUploads' ),
+                       LoggerFactory::getInstance( 'UploadRevisionImporter' )
+               );
+       },
+
+       'OldRevisionImporter' => function ( MediaWikiServices $services ) {
+               return new ImportableOldRevisionImporter(
+                       true,
+                       LoggerFactory::getInstance( 'OldRevisionImporter' ),
+                       $services->getDBLoadBalancer()
+               );
+       },
+
+       'WikiRevisionOldRevisionImporterNoUpdates' => function ( MediaWikiServices $services ) {
+               return new ImportableOldRevisionImporter(
+                       false,
+                       LoggerFactory::getInstance( 'OldRevisionImporter' ),
+                       $services->getDBLoadBalancer()
+               );
+       },
+
        'ShellCommandFactory' => function ( MediaWikiServices $services ) {
                $config = $services->getMainConfig();
 
index c9fe8d0..cc6915a 100644 (file)
@@ -528,9 +528,9 @@ $wgJsMimeType = 'text/javascript';
 $wgFileExtensions = array_values( array_diff( $wgFileExtensions, $wgFileBlacklist ) );
 
 if ( $wgInvalidateCacheOnLocalSettingsChange ) {
-       MediaWiki\suppressWarnings();
+       Wikimedia\suppressWarnings();
        $wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', filemtime( "$IP/LocalSettings.php" ) ) );
-       MediaWiki\restoreWarnings();
+       Wikimedia\restoreWarnings();
 }
 
 if ( $wgNewUserLog ) {
@@ -717,9 +717,9 @@ wfMemoryLimit();
  * explicitly set. Inspired by phpMyAdmin's treatment of the problem.
  */
 if ( is_null( $wgLocaltimezone ) ) {
-       MediaWiki\suppressWarnings();
+       Wikimedia\suppressWarnings();
        $wgLocaltimezone = date_default_timezone_get();
-       MediaWiki\restoreWarnings();
+       Wikimedia\restoreWarnings();
 }
 
 date_default_timezone_set( $wgLocaltimezone );
@@ -874,7 +874,7 @@ if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
        ) {
                // Start the PHP-session for backwards compatibility
                session_id( $session->getId() );
-               MediaWiki\quietCall( 'session_start' );
+               Wikimedia\quietCall( 'session_start' );
        }
 
        unset( $session );
index f10e6a2..745c891 100644 (file)
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Static accessor class for site_stats and related things
  */
 class SiteStats {
-       /** @var bool|stdClass */
+       /** @var stdClass */
        private static $row;
 
-       /** @var bool */
-       private static $loaded = false;
-       /** @var int[] */
-       private static $pageCount = [];
-
-       static function unload() {
-               self::$loaded = false;
-       }
-
-       static function recache() {
-               self::load( true );
-       }
-
        /**
-        * @param bool $recache
+        * Trigger a reload next time a field is accessed
         */
-       static function load( $recache = false ) {
-               if ( self::$loaded && !$recache ) {
-                       return;
-               }
-
-               self::$row = self::loadAndLazyInit();
+       public static function unload() {
+               self::$row = null;
+       }
 
-               self::$loaded = true;
+       protected static function load() {
+               if ( self::$row === null ) {
+                       self::$row = self::loadAndLazyInit();
+               }
        }
 
        /**
-        * @return bool|stdClass
+        * @return stdClass
         */
-       static function loadAndLazyInit() {
-               global $wgMiserMode;
+       protected static function loadAndLazyInit() {
+               $config = MediaWikiServices::getInstance()->getMainConfig();
 
+               $lb = self::getLB();
+               $dbr = $lb->getConnection( DB_REPLICA );
                wfDebug( __METHOD__ . ": reading site_stats from replica DB\n" );
-               $row = self::doLoad( wfGetDB( DB_REPLICA ) );
-
-               if ( !self::isSane( $row ) ) {
-                       $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
-                       if ( $lb->hasOrMadeRecentMasterChanges() ) {
-                               // Might have just been initialized during this request? Underflow?
-                               wfDebug( __METHOD__ . ": site_stats damaged or missing on replica DB\n" );
-                               $row = self::doLoad( wfGetDB( DB_MASTER ) );
-                       }
+               $row = self::doLoadFromDB( $dbr );
+
+               if ( !self::isRowSane( $row ) && $lb->hasOrMadeRecentMasterChanges() ) {
+                       // Might have just been initialized during this request? Underflow?
+                       wfDebug( __METHOD__ . ": site_stats damaged or missing on replica DB\n" );
+                       $row = self::doLoadFromDB( $lb->getConnection( DB_MASTER ) );
                }
 
-               if ( !self::isSane( $row ) ) {
-                       if ( $wgMiserMode ) {
+               if ( !self::isRowSane( $row ) ) {
+                       if ( $config->get( 'MiserMode' ) ) {
                                // Start off with all zeroes, assuming that this is a new wiki or any
                                // repopulations where done manually via script.
                                SiteStatsInit::doPlaceholderInit();
@@ -86,88 +73,73 @@ class SiteStats {
                                // broken, however, for instance when importing from a dump into a
                                // clean schema with mwdumper.
                                wfDebug( __METHOD__ . ": initializing damaged or missing site_stats\n" );
-                               SiteStatsInit::doAllAndCommit( wfGetDB( DB_REPLICA ) );
+                               SiteStatsInit::doAllAndCommit( $dbr );
                        }
 
-                       $row = self::doLoad( wfGetDB( DB_MASTER ) );
+                       $row = self::doLoadFromDB( $lb->getConnection( DB_MASTER ) );
                }
 
-               if ( !self::isSane( $row ) ) {
+               if ( !self::isRowSane( $row ) ) {
                        wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" );
-
-                       $row = (object)array_fill_keys( self::selectFields(), 0 );
+                       // Always return a row-like object
+                       $row = self::salvageInsaneRow( $row );
                }
 
                return $row;
        }
 
        /**
-        * @param IDatabase $db
-        * @return bool|stdClass
-        */
-       static function doLoad( $db ) {
-               return $db->selectRow( 'site_stats', self::selectFields(), [], __METHOD__ );
-       }
-
-       /**
-        * Return the total number of page views. Except we don't track those anymore.
-        * Stop calling this function, it will be removed some time in the future. It's
-        * kept here simply to prevent fatal errors.
-        *
-        * @deprecated since 1.25
         * @return int
         */
-       static function views() {
-               wfDeprecated( __METHOD__, '1.25' );
-               return 0;
-       }
-
-       /**
-        * @return int
-        */
-       static function edits() {
+       public static function edits() {
                self::load();
-               return self::$row->ss_total_edits;
+
+               return (int)self::$row->ss_total_edits;
        }
 
        /**
         * @return int
         */
-       static function articles() {
+       public static function articles() {
                self::load();
-               return self::$row->ss_good_articles;
+
+               return (int)self::$row->ss_good_articles;
        }
 
        /**
         * @return int
         */
-       static function pages() {
+       public static function pages() {
                self::load();
-               return self::$row->ss_total_pages;
+
+               return (int)self::$row->ss_total_pages;
        }
 
        /**
         * @return int
         */
-       static function users() {
+       public static function users() {
                self::load();
-               return self::$row->ss_users;
+
+               return (int)self::$row->ss_users;
        }
 
        /**
         * @return int
         */
-       static function activeUsers() {
+       public static function activeUsers() {
                self::load();
-               return self::$row->ss_active_users;
+
+               return (int)self::$row->ss_active_users;
        }
 
        /**
         * @return int
         */
-       static function images() {
+       public static function images() {
                self::load();
-               return self::$row->ss_images;
+
+               return (int)self::$row->ss_images;
        }
 
        /**
@@ -175,17 +147,17 @@ class SiteStats {
         * @param string $group Name of group
         * @return int
         */
-       static function numberingroup( $group ) {
+       public static function numberingroup( $group ) {
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+
                return $cache->getWithSetCallback(
                        $cache->makeKey( 'SiteStats', 'groupcounts', $group ),
                        $cache::TTL_HOUR,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) {
-                               $dbr = wfGetDB( DB_REPLICA );
-
+                               $dbr = self::getLB()->getConnection( DB_REPLICA );
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
-                               return $dbr->selectField(
+                               return (int)$dbr->selectField(
                                        'user_groups',
                                        'COUNT(*)',
                                        [
@@ -203,8 +175,9 @@ class SiteStats {
         * Total number of jobs in the job queue.
         * @return int
         */
-       static function jobs() {
+       public static function jobs() {
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+
                return $cache->getWithSetCallback(
                        $cache->makeKey( 'SiteStats', 'jobscount' ),
                        $cache::TTL_MINUTE,
@@ -222,20 +195,27 @@ class SiteStats {
 
        /**
         * @param int $ns
-        *
         * @return int
         */
-       static function pagesInNs( $ns ) {
-               if ( !isset( self::$pageCount[$ns] ) ) {
-                       $dbr = wfGetDB( DB_REPLICA );
-                       self::$pageCount[$ns] = (int)$dbr->selectField(
-                               'page',
-                               'COUNT(*)',
-                               [ 'page_namespace' => $ns ],
-                               __METHOD__
-                       );
-               }
-               return self::$pageCount[$ns];
+       public static function pagesInNs( $ns ) {
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'SiteStats', 'page-in-namespace', $ns ),
+                       $cache::TTL_HOUR,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $ns ) {
+                               $dbr = self::getLB()->getConnection( DB_REPLICA );
+                               $setOpts += Database::getCacheSetOptions( $dbr );
+
+                               return (int)$dbr->selectField(
+                                       'page',
+                                       'COUNT(*)',
+                                       [ 'page_namespace' => $ns ],
+                                       __METHOD__
+                               );
+                       },
+                       [ 'pcTTL' => $cache::TTL_PROC_LONG ]
+               );
        }
 
        /**
@@ -243,7 +223,6 @@ class SiteStats {
         */
        public static function selectFields() {
                return [
-                       'ss_row_id',
                        'ss_total_edits',
                        'ss_good_articles',
                        'ss_total_pages',
@@ -253,16 +232,28 @@ class SiteStats {
                ];
        }
 
+       /**
+        * @param IDatabase $db
+        * @return stdClass|bool
+        */
+       private static function doLoadFromDB( IDatabase $db ) {
+               return $db->selectRow(
+                       'site_stats',
+                       self::selectFields(),
+                       [ 'ss_row_id' => 1 ],
+                       __METHOD__
+               );
+       }
+
        /**
         * Is the provided row of site stats sane, or should it be regenerated?
         *
         * Checks only fields which are filled by SiteStatsInit::refresh.
         *
         * @param bool|object $row
-        *
         * @return bool
         */
-       private static function isSane( $row ) {
+       private static function isRowSane( $row ) {
                if ( $row === false
                        || $row->ss_total_pages < $row->ss_good_articles
                        || $row->ss_total_edits < $row->ss_total_pages
@@ -277,167 +268,34 @@ class SiteStats {
                        'ss_users',
                        'ss_images',
                ] as $member ) {
-                       if ( $row->$member > 2000000000 || $row->$member < 0 ) {
+                       if ( $row->$member < 0 ) {
                                return false;
                        }
                }
-               return true;
-       }
-}
-
-/**
- * Class designed for counting of stats.
- */
-class SiteStatsInit {
-
-       // Database connection
-       private $db;
 
-       // Various stats
-       private $mEdits = null, $mArticles = null, $mPages = null;
-       private $mUsers = null, $mFiles = null;
-
-       /**
-        * @param bool|IDatabase $database
-        * - bool: Whether to use the master DB
-        * - IDatabase: Database connection to use
-        */
-       public function __construct( $database = false ) {
-               if ( $database instanceof IDatabase ) {
-                       $this->db = $database;
-               } elseif ( $database ) {
-                       $this->db = wfGetDB( DB_MASTER );
-               } else {
-                       $this->db = wfGetDB( DB_REPLICA, 'vslow' );
-               }
-       }
-
-       /**
-        * Count the total number of edits
-        * @return int
-        */
-       public function edits() {
-               $this->mEdits = $this->db->selectField( 'revision', 'COUNT(*)', '', __METHOD__ );
-               $this->mEdits += $this->db->selectField( 'archive', 'COUNT(*)', '', __METHOD__ );
-               return $this->mEdits;
-       }
-
-       /**
-        * Count pages in article space(s)
-        * @return int
-        */
-       public function articles() {
-               global $wgArticleCountMethod;
-
-               $tables = [ 'page' ];
-               $conds = [
-                       'page_namespace' => MWNamespace::getContentNamespaces(),
-                       'page_is_redirect' => 0,
-               ];
-
-               if ( $wgArticleCountMethod == 'link' ) {
-                       $tables[] = 'pagelinks';
-                       $conds[] = 'pl_from=page_id';
-               } elseif ( $wgArticleCountMethod == 'comma' ) {
-                       // To make a correct check for this, we would need, for each page,
-                       // to load the text, maybe uncompress it, maybe decode it and then
-                       // check if there's one comma.
-                       // But one thing we are sure is that if the page is empty, it can't
-                       // contain a comma :)
-                       $conds[] = 'page_len > 0';
-               }
-
-               $this->mArticles = $this->db->selectField( $tables, 'COUNT(DISTINCT page_id)',
-                       $conds, __METHOD__ );
-               return $this->mArticles;
-       }
-
-       /**
-        * Count total pages
-        * @return int
-        */
-       public function pages() {
-               $this->mPages = $this->db->selectField( 'page', 'COUNT(*)', '', __METHOD__ );
-               return $this->mPages;
-       }
-
-       /**
-        * Count total users
-        * @return int
-        */
-       public function users() {
-               $this->mUsers = $this->db->selectField( 'user', 'COUNT(*)', '', __METHOD__ );
-               return $this->mUsers;
-       }
-
-       /**
-        * Count total files
-        * @return int
-        */
-       public function files() {
-               $this->mFiles = $this->db->selectField( 'image', 'COUNT(*)', '', __METHOD__ );
-               return $this->mFiles;
+               return true;
        }
 
        /**
-        * Do all updates and commit them. More or less a replacement
-        * for the original initStats, but without output.
-        *
-        * @param IDatabase|bool $database
-        * - bool: Whether to use the master DB
-        * - IDatabase: Database connection to use
-        * @param array $options Array of options, may contain the following values
-        * - activeUsers bool: Whether to update the number of active users (default: false)
+        * @param stdClass|bool $row
+        * @return stdClass
         */
-       public static function doAllAndCommit( $database, array $options = [] ) {
-               $options += [ 'update' => false, 'activeUsers' => false ];
-
-               // Grab the object and count everything
-               $counter = new SiteStatsInit( $database );
-
-               $counter->edits();
-               $counter->articles();
-               $counter->pages();
-               $counter->users();
-               $counter->files();
-
-               $counter->refresh();
-
-               // Count active users if need be
-               if ( $options['activeUsers'] ) {
-                       SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
+       private static function salvageInsaneRow( $row ) {
+               $map = $row ? (array)$row : [];
+               // Fill in any missing values with zero
+               $map += array_fill_keys( self::selectFields(), 0 );
+               // Convert negative values to zero
+               foreach ( $map as $field => $value ) {
+                       $map[$field] = max( 0, $value );
                }
-       }
 
-       /**
-        * Insert a dummy row with all zeroes if no row is present
-        */
-       public static function doPlaceholderInit() {
-               $dbw = wfGetDB( DB_MASTER );
-               if ( $dbw->selectRow( 'site_stats', '1', [], __METHOD__ ) === false ) {
-                       $dbw->insert(
-                               'site_stats',
-                               array_fill_keys( SiteStats::selectFields(), 0 ),
-                               __METHOD__,
-                               [ 'IGNORE' ]
-                       );
-               }
+               return (object)$row;
        }
 
        /**
-        * Refresh site_stats
+        * @return LoadBalancer
         */
-       public function refresh() {
-               $values = [
-                       'ss_row_id' => 1,
-                       'ss_total_edits' => ( $this->mEdits === null ? $this->edits() : $this->mEdits ),
-                       'ss_good_articles' => ( $this->mArticles === null ? $this->articles() : $this->mArticles ),
-                       'ss_total_pages' => ( $this->mPages === null ? $this->pages() : $this->mPages ),
-                       'ss_users' => ( $this->mUsers === null ? $this->users() : $this->mUsers ),
-                       'ss_images' => ( $this->mFiles === null ? $this->files() : $this->mFiles ),
-               ];
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->upsert( 'site_stats', $values, [ 'ss_row_id' ], $values, __METHOD__ );
+       private static function getLB() {
+               return MediaWikiServices::getInstance()->getDBLoadBalancer();
        }
 }
diff --git a/includes/SiteStatsInit.php b/includes/SiteStatsInit.php
new file mode 100644 (file)
index 0000000..f527cb2
--- /dev/null
@@ -0,0 +1,209 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+use Wikimedia\Rdbms\IDatabase;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Class designed for counting of stats.
+ */
+class SiteStatsInit {
+       /* @var IDatabase */
+       private $dbr;
+       /** @var int */
+       private $edits;
+       /** @var int */
+       private $articles;
+       /** @var int */
+       private $pages;
+       /** @var int */
+       private $users;
+       /** @var int */
+       private $files;
+
+       /**
+        * @param bool|IDatabase $database
+        * - bool: Whether to use the master DB
+        * - IDatabase: Database connection to use
+        */
+       public function __construct( $database = false ) {
+               if ( $database instanceof IDatabase ) {
+                       $this->dbr = $database;
+               } elseif ( $database ) {
+                       $this->dbr = self::getDB( DB_MASTER );
+               } else {
+                       $this->dbr = self::getDB( DB_REPLICA, 'vslow' );
+               }
+       }
+
+       /**
+        * Count the total number of edits
+        * @return int
+        */
+       public function edits() {
+               $this->edits = $this->dbr->selectField( 'revision', 'COUNT(*)', '', __METHOD__ );
+               $this->edits += $this->dbr->selectField( 'archive', 'COUNT(*)', '', __METHOD__ );
+
+               return $this->edits;
+       }
+
+       /**
+        * Count pages in article space(s)
+        * @return int
+        */
+       public function articles() {
+               $config = MediaWikiServices::getInstance()->getMainConfig();
+
+               $tables = [ 'page' ];
+               $conds = [
+                       'page_namespace' => MWNamespace::getContentNamespaces(),
+                       'page_is_redirect' => 0,
+               ];
+
+               if ( $config->get( 'ArticleCountMethod' ) == 'link' ) {
+                       $tables[] = 'pagelinks';
+                       $conds[] = 'pl_from=page_id';
+               } elseif ( $config->get( 'ArticleCountMethod' ) == 'comma' ) {
+                       // To make a correct check for this, we would need, for each page,
+                       // to load the text, maybe uncompress it, maybe decode it and then
+                       // check if there's one comma.
+                       // But one thing we are sure is that if the page is empty, it can't
+                       // contain a comma :)
+                       $conds[] = 'page_len > 0';
+               }
+
+               $this->articles = $this->dbr->selectField(
+                       $tables,
+                       'COUNT(DISTINCT page_id)',
+                       $conds,
+                       __METHOD__
+               );
+
+               return $this->articles;
+       }
+
+       /**
+        * Count total pages
+        * @return int
+        */
+       public function pages() {
+               $this->pages = $this->dbr->selectField( 'page', 'COUNT(*)', '', __METHOD__ );
+
+               return $this->pages;
+       }
+
+       /**
+        * Count total users
+        * @return int
+        */
+       public function users() {
+               $this->users = $this->dbr->selectField( 'user', 'COUNT(*)', '', __METHOD__ );
+
+               return $this->users;
+       }
+
+       /**
+        * Count total files
+        * @return int
+        */
+       public function files() {
+               $this->files = $this->dbr->selectField( 'image', 'COUNT(*)', '', __METHOD__ );
+
+               return $this->files;
+       }
+
+       /**
+        * Do all updates and commit them. More or less a replacement
+        * for the original initStats, but without output.
+        *
+        * @param IDatabase|bool $database
+        * - bool: Whether to use the master DB
+        * - IDatabase: Database connection to use
+        * @param array $options Array of options, may contain the following values
+        * - activeUsers bool: Whether to update the number of active users (default: false)
+        */
+       public static function doAllAndCommit( $database, array $options = [] ) {
+               $options += [ 'update' => false, 'activeUsers' => false ];
+
+               // Grab the object and count everything
+               $counter = new self( $database );
+
+               $counter->edits();
+               $counter->articles();
+               $counter->pages();
+               $counter->users();
+               $counter->files();
+
+               $counter->refresh();
+
+               // Count active users if need be
+               if ( $options['activeUsers'] ) {
+                       SiteStatsUpdate::cacheUpdate( self::getDB( DB_MASTER ) );
+               }
+       }
+
+       /**
+        * Insert a dummy row with all zeroes if no row is present
+        */
+       public static function doPlaceholderInit() {
+               $dbw = self::getDB( DB_MASTER );
+               $exists = $dbw->selectField( 'site_stats', '1', [ 'ss_row_id' => 1 ],  __METHOD__ );
+               if ( $exists === false ) {
+                       $dbw->insert(
+                               'site_stats',
+                               [ 'ss_row_id' => 1 ] + array_fill_keys( SiteStats::selectFields(), 0 ),
+                               __METHOD__,
+                               [ 'IGNORE' ]
+                       );
+               }
+       }
+
+       /**
+        * Refresh site_stats
+        */
+       public function refresh() {
+               $values = [
+                       'ss_row_id' => 1,
+                       'ss_total_edits' => $this->edits === null ? $this->edits() : $this->edits,
+                       'ss_good_articles' => $this->articles === null ? $this->articles() : $this->articles,
+                       'ss_total_pages' => $this->pages === null ? $this->pages() : $this->pages,
+                       'ss_users' => $this->users === null ? $this->users() : $this->users,
+                       'ss_images' => $this->files === null ? $this->files() : $this->files,
+               ];
+
+               self::getDB( DB_MASTER )->upsert(
+                       'site_stats',
+                       $values,
+                       [ 'ss_row_id' ],
+                       $values,
+                       __METHOD__
+               );
+       }
+
+       /**
+        * @param int $index
+        * @param string[] $groups
+        * @return IDatabase
+        */
+       private static function getDB( $index, $groups = [] ) {
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+
+               return $lb->getConnection( $index, $groups );
+       }
+}
index d832104..e7c9060 100644 (file)
@@ -252,7 +252,7 @@ class RevisionStore
                        if ( $title ) {
                                $this->logger->info(
                                        __METHOD__ . ' fell back to READ_LATEST and got a Title.',
-                                       [ 'trace' => wfDebugBacktrace() ]
+                                       [ 'trace' => wfBacktrace() ]
                                );
                                return $title;
                        }
index 7bfb5a4..0a7f416 100644 (file)
@@ -123,9 +123,9 @@ class WebRequest {
                        if ( !preg_match( '!^https?://!', $url ) ) {
                                $url = 'http://unused' . $url;
                        }
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $a = parse_url( $url );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $a ) {
                                $path = isset( $a['path'] ) ? $a['path'] : '';
 
index 62d73f4..228d319 100644 (file)
@@ -897,7 +897,7 @@ abstract class ApiBase extends ContextSource {
 
                if ( $badParams ) {
                        $this->dieWithError(
-                               [ 'apierror-mustpostparams', join( ', ', $badParams ), count( $badParams ) ]
+                               [ 'apierror-mustpostparams', implode( ', ', $badParams ), count( $badParams ) ]
                        );
                }
        }
@@ -1152,7 +1152,7 @@ abstract class ApiBase extends ContextSource {
                                if ( $multi ) {
                                        // This loses the potential $wgContLang->checkTitleEncoding() transformation
                                        // done by WebRequest for $_GET. Let's call that a feature.
-                                       $value = join( "\x1f", $request->normalizeUnicode( explode( "\x1f", $rawValue ) ) );
+                                       $value = implode( "\x1f", $request->normalizeUnicode( explode( "\x1f", $rawValue ) ) );
                                } else {
                                        $this->dieWithError( 'apierror-badvalue-notmultivalue', 'badvalue_notmultivalue' );
                                }
@@ -1829,7 +1829,7 @@ abstract class ApiBase extends ContextSource {
                $msgs = [ $this->msg( 'api-usage-mailinglist-ref' ) ];
                Hooks::run( 'ApiDeprecationHelp', [ &$msgs ] );
                if ( count( $msgs ) > 1 ) {
-                       $key = '$' . join( ' $', range( 1, count( $msgs ) ) );
+                       $key = '$' . implode( ' $', range( 1, count( $msgs ) ) );
                        $msg = ( new RawMessage( $key ) )->params( $msgs );
                } else {
                        $msg = reset( $msgs );
index 2a80dd5..e5dba8f 100644 (file)
@@ -169,16 +169,6 @@ class ApiFeedRecentChanges extends ApiBase {
                        'showlinkedto' => false,
                ];
 
-               if ( $config->get( 'AllowCategorizedRecentChanges' ) ) {
-                       $ret += [
-                               'categories' => [
-                                       ApiBase::PARAM_TYPE => 'string',
-                                       ApiBase::PARAM_ISMULTI => true,
-                               ],
-                               'categories_any' => false,
-                       ];
-               }
-
                return $ret;
        }
 
index 2c2dd9a..a7e3c1b 100644 (file)
@@ -593,7 +593,7 @@ class ApiMain extends ApiBase {
                $this->setCacheMode( 'private' );
 
                $response = $this->getRequest()->response();
-               $headerStr = 'MediaWiki-API-Error: ' . join( ', ', $errCodes );
+               $headerStr = 'MediaWiki-API-Error: ' . implode( ', ', $errCodes );
                $response->header( $headerStr );
 
                // Reset and print just the error message
@@ -1037,7 +1037,7 @@ class ApiMain extends ApiBase {
                        // None of the rest have any messages for non-error types
                } elseif ( $e instanceof UsageException ) {
                        // User entered incorrect parameters - generate error response
-                       $data = MediaWiki\quietCall( [ $e, 'getMessageArray' ] );
+                       $data = Wikimedia\quietCall( [ $e, 'getMessageArray' ] );
                        $code = $data['code'];
                        $info = $data['info'];
                        unset( $data['code'], $data['info'] );
@@ -1397,9 +1397,9 @@ class ApiMain extends ApiBase {
                        $this->getRequest()->response()->statusHeader( 304 );
 
                        // Avoid outputting the compressed representation of a zero-length body
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        ini_set( 'zlib.output_compression', 0 );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        wfClearOutputBuffers();
 
                        return false;
index 2839ab9..cbd62a9 100644 (file)
@@ -345,6 +345,7 @@ class ApiParse extends ApiBase {
                                'allowTOC' => !$params['disabletoc'],
                                'enableSectionEditLinks' => !$params['disableeditsection'],
                                'unwrap' => $params['wrapoutputclass'] === '',
+                               'deduplicateStyles' => !$params['disablestylededuplication'],
                        ] );
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text';
                }
@@ -535,7 +536,6 @@ class ApiParse extends ApiBase {
                $popts->enableLimitReport( !$params['disablepp'] && !$params['disablelimitreport'] );
                $popts->setIsPreview( $params['preview'] || $params['sectionpreview'] );
                $popts->setIsSectionPreview( $params['sectionpreview'] );
-               $popts->setEditSection( !$params['disableeditsection'] );
                if ( $params['disabletidy'] ) {
                        $popts->setTidy( false );
                }
@@ -877,6 +877,7 @@ class ApiParse extends ApiBase {
                        'disablelimitreport' => false,
                        'disableeditsection' => false,
                        'disabletidy' => false,
+                       'disablestylededuplication' => false,
                        'generatexml' => [
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_HELP_MSG => [
index fd456cb..e447f4f 100644 (file)
@@ -542,9 +542,9 @@ class ApiQueryImageInfo extends ApiQueryBase {
                }
 
                if ( $meta ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $metadata = unserialize( $file->getMetadata() );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $metadata && $version !== 'latest' ) {
                                $metadata = $file->convertMetadataVersion( $metadata, $version );
                        }
index 57d4b05..f07c6e2 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "فلتر بالوسم.",
        "apihelp-feedrecentchanges-param-target": "أحدث التغييرات في الصفحات الموصولة من هذه الصفحة فقط",
        "apihelp-feedrecentchanges-param-showlinkedto": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
-       "apihelp-feedrecentchanges-param-categories": "أظهر التغييرات في الصفحات في كل تصنيف من هذه التصنيفات فقط.",
-       "apihelp-feedrecentchanges-param-categories_any": "أظهر التغييرات في الصفحات في أي تصنيف بدلا من ذلك.",
        "apihelp-feedrecentchanges-example-simple": " اظهر التغييرات الحديثة",
        "apihelp-feedrecentchanges-example-30days": "أظهر التغييرات الأخيرة في 30 يوم.",
        "apihelp-feedwatchlist-summary": "إرجاع تغذية قائمة المراقبة.",
index da8535d..99421fe 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Тэг буйынса һөҙгөс",
        "apihelp-feedrecentchanges-param-target": "Был биттән һылтанған биттәрҙә һуңғы үҙгәртеүҙәрҙе күрһәтергә",
        "apihelp-feedrecentchanges-param-showlinkedto": "Киреһенсә, был биткә һылтанма яһаған биттәрҙәге үҙгәртеүҙәрҙе күрһәтергә",
-       "apihelp-feedrecentchanges-param-categories": "Бар категория биттәрендәге үҙгәрештәрҙе генә күрһәтергә",
-       "apihelp-feedrecentchanges-param-categories_any": "Был категориянан башҡа теләһә ҡайһы категориялар биттәрендәге үҙгәрештәрҙе генә күрһәтергә",
        "apihelp-feedrecentchanges-example-simple": "Һуңғы үҙгәртеүҙәрҙе күрһәтергә.",
        "apihelp-feedrecentchanges-example-30days": "30 көн арауығындағы һуңғы үҙгәртеүҙәрҙе күрһәтергә.",
        "apihelp-feedwatchlist-summary": "Күҙәтеү каналын ҡайтара",
index 8234691..d7648b1 100644 (file)
        "apihelp-options-example-reset": "Vrátit všechna nastavení.",
        "apihelp-parse-param-summary": "Shrnutí, které se má parsovat.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Přidává název parsovaného wikitextu.",
+       "apihelp-parse-param-disablestylededuplication": "Neodstraňovat duplicitní in-line styly ve výstupu parseru.",
        "apihelp-parse-param-preview": "Parsovat v režimu náhledu.",
        "apihelp-parse-example-page": "Parsovat stránku.",
        "apihelp-parse-example-text": "Parsovat wikitext.",
index 4da9509..bbee4fa 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Nach Markierung filtern.",
        "apihelp-feedrecentchanges-param-target": "Nur Änderungen an Seiten anzeigen, die von dieser Seite verlinkt sind.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Zeige Änderungen an Seiten die von der ausgewählten Seite verlinkt sind.",
-       "apihelp-feedrecentchanges-param-categories": "Zeigt nur Änderungen von Seiten in all diesen Kategorien.",
-       "apihelp-feedrecentchanges-param-categories_any": "Zeigt stattdessen nur Änderungen auf Seiten in einer dieser Kategorien.",
        "apihelp-feedrecentchanges-example-simple": "Letzte Änderungen anzeigen",
        "apihelp-feedrecentchanges-example-30days": "Letzte Änderungen für 30 Tage anzeigen",
        "apihelp-feedwatchlist-summary": "Gibt einen Beobachtungslisten-Feed zurück.",
        "apihelp-query+allrevisions-example-ns-main": "Liste die ersten 50 Bearbeitungen im Hauptnamensraum auf.",
        "apihelp-query+mystashedfiles-param-prop": "Welche Eigenschaften für die Dateien abgerufen werden sollen.",
        "apihelp-query+mystashedfiles-paramvalue-prop-size": "Ruft die Dateigröße und Bildabmessungen ab.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-type": "Ruft den MIME- und Medientyp der Datei ab.",
        "apihelp-query+mystashedfiles-param-limit": "Wie viele Dateien zurückgegeben werden sollen.",
        "apihelp-query+alltransclusions-summary": "Liste alle Transklusionen auf (eingebettete Seiten die &#123;&#123;x&#125;&#125; benutzen), einschließlich nicht vorhandener.",
        "apihelp-query+alltransclusions-param-from": "Der Titel der Transklusion bei dem die Auflistung beginnen soll.",
index 729c4c7..8d7a61c 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filter by tag.",
        "apihelp-feedrecentchanges-param-target": "Show only changes on pages linked from this page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Show changes on pages linked to the selected page instead.",
-       "apihelp-feedrecentchanges-param-categories": "Show only changes on pages in all of these categories.",
-       "apihelp-feedrecentchanges-param-categories_any": "Show only changes on pages in any of the categories instead.",
        "apihelp-feedrecentchanges-example-simple": "Show recent changes.",
        "apihelp-feedrecentchanges-example-30days": "Show recent changes for 30 days.",
 
        "apihelp-parse-param-disablepp": "Use <var>$1disablelimitreport</var> instead.",
        "apihelp-parse-param-disableeditsection": "Omit edit section links from the parser output.",
        "apihelp-parse-param-disabletidy": "Do not run HTML cleanup (e.g. tidy) on the parser output.",
+       "apihelp-parse-param-disablestylededuplication": "Do not deduplicate inline stylesheets in the parser output.",
        "apihelp-parse-param-generatexml": "Generate XML parse tree (requires content model <code>$1</code>; replaced by <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Parse in preview mode.",
        "apihelp-parse-param-sectionpreview": "Parse in section preview mode (enables preview mode too).",
index d2aaa77..7cbf1e1 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.",
        "apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.",
-       "apihelp-feedrecentchanges-param-categories": "Mostrar sólo cambios en las páginas en todas estas categorías.",
-       "apihelp-feedrecentchanges-param-categories_any": "Mostrar sólo cambios en las páginas en cualquiera de las categorías en lugar.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes.",
        "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días.",
        "apihelp-feedwatchlist-summary": "Devuelve el suministro de una lista de seguimiento.",
index d72b218..4c3b74d 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrer par balise.",
        "apihelp-feedrecentchanges-param-target": "Afficher uniquement les modifications sur les pages liées depuis cette page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Afficher les modifications plutôt sur les pages liées vers la page sélectionnée.",
-       "apihelp-feedrecentchanges-param-categories": "Afficher uniquement les modifications sur les pages dans toutes ces catégories",
-       "apihelp-feedrecentchanges-param-categories_any": "Afficher plutôt uniquement les modifications sur les pages dans n’importe laquelle de ces catégories.",
        "apihelp-feedrecentchanges-example-simple": "Afficher les modifications récentes",
        "apihelp-feedrecentchanges-example-30days": "Afficher les modifications récentes sur 30 jours",
        "apihelp-feedwatchlist-summary": "Renvoie un flux de liste de suivi.",
        "apihelp-parse-param-disablepp": "Utiliser <var>$1disablelimitreport</var> à la place.",
        "apihelp-parse-param-disableeditsection": "Omettre les liens de modification de section de la sortie de l’analyseur.",
        "apihelp-parse-param-disabletidy": "Ne pas exécuter de nettoyage du code HTML (par exemple,  réagencer) sur la sortie de l'analyseur.",
+       "apihelp-parse-param-disablestylededuplication": "Ne pas dupliquer les feuilles de style incluses, dans la sortie de l'analyseur.",
        "apihelp-parse-param-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu <code>$1</code> ; remplacé par <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analyser en mode aperçu.",
        "apihelp-parse-param-sectionpreview": "Analyser en mode aperçu de section (active aussi le mode aperçu).",
index 6b01875..4c66794 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostrar só os cambios nas páxinas ligadas a esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar os cambios nas páxinas ligadas coa páxina seleccionada.",
-       "apihelp-feedrecentchanges-param-categories": "Só mostrar cambios en páxinas pertencentes a todas estas categorías.",
-       "apihelp-feedrecentchanges-param-categories_any": "Só mostrar cambios en páxinas pertencentes a calquera das categorías.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar os cambios recentes",
        "apihelp-feedrecentchanges-example-30days": "Mostrar os cambios recentes limitados a 30 días",
        "apihelp-feedwatchlist-summary": "Devolve o fluxo dunha lista de vixiancia.",
index 2e68946..2064b7b 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "סינון לפי תגית.",
        "apihelp-feedrecentchanges-param-target": "הצגת שינויים שנעשו בדפים המקושרים לדף זה בלבד.",
        "apihelp-feedrecentchanges-param-showlinkedto": "להציג את השינויים בדפים שמקושרים לדף שנבחר במקום זה.",
-       "apihelp-feedrecentchanges-param-categories": "להציג רק שינויים בדפים בכל הקטגוריות האלו.",
-       "apihelp-feedrecentchanges-param-categories_any": "להציג רק שינויים בדפים בכל הקטגוריות במקום.",
        "apihelp-feedrecentchanges-example-simple": "הצגת שינויים אחרונים.",
        "apihelp-feedrecentchanges-example-30days": "הצגת שינויים אחרונים עבור 30 ימים.",
        "apihelp-feedwatchlist-summary": "החזרת הזנת רשימת מעקב.",
index 7c03097..f6f813d 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Szűrés címke szerint.",
        "apihelp-feedrecentchanges-param-target": "Csak a megadott lapról hivatkozott lapok szerkesztéseinek megjelenítése.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Inkább a megadott lap''ra'' hivatkozó lapok szerkesztéseinek megjelenítése.",
-       "apihelp-feedrecentchanges-param-categories": "Csak a megadott kategóriák mindegyikében szereplő lapok szerkesztéseinek megjelenítése.",
-       "apihelp-feedrecentchanges-param-categories_any": "Inkább a megadott kategóriák bármelyikében szereplő lapok szerkesztéseinek megjelenítése.",
        "apihelp-feedrecentchanges-example-simple": "Friss változtatások megjelenítése.",
        "apihelp-feedrecentchanges-example-30days": "Az elmúlt 30 nap friss változtatásainak megjelenítése.",
        "apihelp-feedwatchlist-summary": "A figyelőlista lekérése hírcsatornaként.",
index 25da0e6..66b0942 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtra per etichetta.",
        "apihelp-feedrecentchanges-param-target": "Mostra solo le modifiche alle pagine collegate da questa pagina.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.",
-       "apihelp-feedrecentchanges-param-categories": "Mostra solo le variazioni sulle pagine di tutte queste categorie.",
-       "apihelp-feedrecentchanges-param-categories_any": "Mostra invece solo le variazioni sulle pagine in una qualunque categoria.",
        "apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.",
        "apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.",
        "apihelp-feedwatchlist-param-feedformat": "Il formato del feed.",
index 1ed917a..b0231df 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Noh Makkehronge beschängke.",
        "apihelp-feedrecentchanges-param-target": "Zeijsch Änderonge aan Sigge, op di vun heh dä Sigg ene Lengk jeihd.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Zeijsch Änderonge aan Sigge, op di vun dä ußjesöhk Sigg ene Lengk jeihd.",
-       "apihelp-feedrecentchanges-param-categories": "Donn blohß de Änderonge aan de Zohjehüreshkeit för all heh di Saachjroppe zeije.",
-       "apihelp-feedrecentchanges-param-categories_any": "Donn deföhr blohß de Änderonge aan de Zohjehüreshkeit för öhndseijn fun heh dä Saachjroppe zeije.",
        "apihelp-feedrecentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}",
        "apihelp-feedrecentchanges-example-30days": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}} vun de läzde 30 Dähsch.",
        "apihelp-feedwatchlist-summary": "Donn ene Kannahl met dä Oppaßleß zerökjävve.",
index fc2c789..d2c7593 100644 (file)
@@ -52,8 +52,6 @@
        "apihelp-feedrecentchanges-param-hideliu": "Ännerunge vu registréierte Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ännerunge vum aktuelle Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hidecategorization": "Ännerunge vun der Memberschaft a Kategorie verstoppen.",
-       "apihelp-feedrecentchanges-param-categories": "Nëmmen Ännerunge vu Säiten aus all dëse Kategorië weisen.",
-       "apihelp-feedrecentchanges-param-categories_any": "Nëmmen Ännerunge vu Säiten aus enger vun dëse Kategorië weisen.",
        "apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen",
        "apihelp-filerevert-param-comment": "Bemierkung eroplueden.",
        "apihelp-help-example-main": "Hëllef fir den Haaptmodul.",
index 6f4c6a3..9d39405 100644 (file)
@@ -72,8 +72,6 @@
        "apihelp-feedrecentchanges-param-tagfilter": "Filtruoti pagal žymę.",
        "apihelp-feedrecentchanges-param-target": "Rodyti tik keitimus puslapiuose, pasiekiamuose iš šio puslapio.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Vietoj to, rodyti pakeitimus puslapyje, susietame su pasirinktu puslapiu.",
-       "apihelp-feedrecentchanges-param-categories": "Rodyti pakeitimus tik puslapiuose, esančiuose visuose šiuose kategorijose.",
-       "apihelp-feedrecentchanges-param-categories_any": "Vietoj to, rodyti tik pakeitimus puslapiuse, esančiuose bet kurioje iš kategorijų.",
        "apihelp-feedrecentchanges-example-simple": "Parodyti naujausius keitimus.",
        "apihelp-feedrecentchanges-example-30days": "Rodyti naujausius pakeitimus per 30 dienų.",
        "apihelp-feedwatchlist-summary": "Gražina stebimųjų sąrašo srautą.",
index a012900..3cec5d4 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Филтрирање по ознака.",
        "apihelp-feedrecentchanges-param-target": "Прикажи само промени на страници што водат од оваа.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Наместо тоа, прикажи ги промените на страниците поврзани со избраната страница.",
-       "apihelp-feedrecentchanges-param-categories": "Прикажи само промени на страниците во сите овие категории.",
-       "apihelp-feedrecentchanges-param-categories_any": "Прикажи само промени на страниците во било која од категориите.",
        "apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени",
        "apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена",
        "apihelp-feedwatchlist-summary": "Дава тековник со набљудуваните.",
index dc9fb11..c2fea1c 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrer etter tagger.",
        "apihelp-feedrecentchanges-param-target": "Vis bare endringer på sider som lenkes fra denne siden.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Vis endringer på sider som lenker til den valgte siden i stedet.",
-       "apihelp-feedrecentchanges-param-categories": "Vis bare endringer på sider i alle disse kategoriene.",
-       "apihelp-feedrecentchanges-param-categories_any": "Vis bare endringer på sider som er i noen av kategoriene i stedet.",
        "apihelp-feedrecentchanges-example-simple": "Vis siste endringer.",
        "apihelp-feedrecentchanges-example-30days": "Vis siste endringer for 30 døgn.",
        "apihelp-feedwatchlist-summary": "Returnerer en overvåkningslistemating.",
index 6c311d0..8591eba 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtruj po znacznikach.",
        "apihelp-feedrecentchanges-param-target": "Pokaż tylko zmiany na stronach linkowanych z tej strony.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Pokaż zmiany na stronach linkujących do wybranej strony.",
-       "apihelp-feedrecentchanges-param-categories": "Pokaż zmiany tylko na stronach będących we wszystkich tych kategoriach.",
-       "apihelp-feedrecentchanges-param-categories_any": "Pokaż zmiany tylko na stronach będących w jednej z tych kategorii.",
        "apihelp-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.",
        "apihelp-feedrecentchanges-example-30days": "Pokaż ostatnie zmiany z 30 dni.",
        "apihelp-feedwatchlist-summary": "Zwraca kanał listy obserwowanych.",
index 706b93c..fec224e 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por tag.",
        "apihelp-feedrecentchanges-param-target": "Mostrar apenas as alterações nas páginas vinculadas por esta página.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostra as alterações nas páginas vigiadas à página selecionada.",
-       "apihelp-feedrecentchanges-param-categories": "Mostre apenas as alterações em páginas em todas essas categorias.",
-       "apihelp-feedrecentchanges-param-categories_any": "Mostre apenas as alterações em páginas em qualquer uma das categorias.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar as mudanças recentes.",
        "apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes por 30 dias.",
        "apihelp-feedwatchlist-summary": "Retornar um feed da lista de páginas vigiadas.",
        "apihelp-parse-param-disablepp": "Use <var>$1disablelimitreport</var> em vez.",
        "apihelp-parse-param-disableeditsection": "Omita os links da seção de edição da saída do analisador.",
        "apihelp-parse-param-disabletidy": "Não executa a limpeza HTML (por exemplo, tidy) na saída do analisador.",
+       "apihelp-parse-param-disablestylededuplication": "Não desduplica as folhas de estilo inline na saída do analisador.",
        "apihelp-parse-param-generatexml": "Gerar XML parse tree (requer modelo de conteúdo <code>$1</code>, substituído por <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analisar no mode de visualização.",
        "apihelp-parse-param-sectionpreview": "Analise no modo de visualização de seção (também permite o modo de visualização).",
index aa697fb..c18160a 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostrar apenas mudanças em páginas afluentes a esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar mudanças em páginas com hiperligações para a página selecionada.",
-       "apihelp-feedrecentchanges-param-categories": "Mostrar apenas mudanças nas páginas que estão em todas estas categorias.",
-       "apihelp-feedrecentchanges-param-categories_any": "Mostrar apenas mudanças nas páginas que estão em qualquer uma das categorias.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar mudanças recentes.",
        "apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes de 30 dias.",
        "apihelp-feedwatchlist-summary": "Devolve um ''feed'' das páginas vigiadas.",
        "apihelp-parse-param-disablepp": "Em vez deste, usar <var>$1disablelimitreport</var>.",
        "apihelp-parse-param-disableeditsection": "Omitir as hiperligações para edição da secção no resultado da análise sintática.",
        "apihelp-parse-param-disabletidy": "Não fazer a limpeza do HTML (isto é, o ''tidy'') no resultado da análise sintática.",
+       "apihelp-parse-param-disablestylededuplication": "Não desduplica as folhas de estilo incluídas na saída do analisador sintático.",
        "apihelp-parse-param-generatexml": "Gerar a árvore de análise XML (requer o modelo de conteúdo <code>$1</code>; substituído por <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Executar a análise em modo de antevisão.",
        "apihelp-parse-param-sectionpreview": "Executar a análise em modo de antevisão (também ativa o modo de antevisão).",
index 1e4bfc8..fc0de4e 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "{{doc-apihelp-param|feedrecentchanges|tagfilter}}",
        "apihelp-feedrecentchanges-param-target": "{{doc-apihelp-param|feedrecentchanges|target}}",
        "apihelp-feedrecentchanges-param-showlinkedto": "{{doc-apihelp-param|feedrecentchanges|showlinkedto}}",
-       "apihelp-feedrecentchanges-param-categories": "{{doc-apihelp-param|feedrecentchanges|categories}}",
-       "apihelp-feedrecentchanges-param-categories_any": "{{doc-apihelp-param|feedrecentchanges|categories_any}}",
        "apihelp-feedrecentchanges-example-simple": "{{doc-apihelp-example|feedrecentchanges}}",
        "apihelp-feedrecentchanges-example-30days": "{{doc-apihelp-example|feedrecentchanges}}",
        "apihelp-feedwatchlist-summary": "{{doc-apihelp-summary|feedwatchlist}}",
        "apihelp-parse-param-disablepp": "{{doc-apihelp-param|parse|disablepp}}",
        "apihelp-parse-param-disableeditsection": "{{doc-apihelp-param|parse|disableeditsection}}",
        "apihelp-parse-param-disabletidy": "{{doc-apihelp-param|parse|disabletidy}}",
+       "apihelp-parse-param-disablestylededuplication": "{{doc-apihelp-param|parse|disablestylededuplication}}",
        "apihelp-parse-param-generatexml": "{{doc-apihelp-param|parse|generatexml|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}",
        "apihelp-parse-param-preview": "{{doc-apihelp-param|parse|preview}}",
        "apihelp-parse-param-sectionpreview": "{{doc-apihelp-param|parse|sectionpreview}}",
index 9ee3527..215e2ff 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Фильтр по меткам.",
        "apihelp-feedrecentchanges-param-target": "Показать только правки на страницах, на которые ссылается данная.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Показать правки на страницах, ссылающихся на данную.",
-       "apihelp-feedrecentchanges-param-categories": "Показать только правки на страницах, включённых во все данные категории.",
-       "apihelp-feedrecentchanges-param-categories_any": "Показать только правки на страницах, включённых в хотя бы одну из данных категорий.",
        "apihelp-feedrecentchanges-example-simple": "Список последних изменений.",
        "apihelp-feedrecentchanges-example-30days": "Список последних изменений за 30 дней.",
        "apihelp-feedwatchlist-summary": "Возвращает ленту списка наблюдения.",
index 8e5228a..e4cff6a 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrera efter tagg.",
        "apihelp-feedrecentchanges-param-target": "Visa endast ändringarna av sidor som den här sidan länkar till.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Visa ändringarna på sidor som är länkade till den valda sidan i stället.",
-       "apihelp-feedrecentchanges-param-categories": "Visa endast ändringar på sidor i alla dessa kategorier.",
-       "apihelp-feedrecentchanges-param-categories_any": "Visa endast ändringar på sidor i någon av kategorierna istället.",
        "apihelp-feedrecentchanges-example-simple": "Visa senaste ändringar",
        "apihelp-feedrecentchanges-example-30days": "Visa senaste ändringar för 30 dygn",
        "apihelp-feedwatchlist-summary": "Returnerar ett flöde från bevakningslistan.",
index ca0b0a8..f55f65e 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Фільтрувати за теґом.",
        "apihelp-feedrecentchanges-param-target": "Показати лише зміни на сторінках, на які посилається ця сторінка.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Показати натомість лише зміни на сторінках, які посилаються на цю сторінку.",
-       "apihelp-feedrecentchanges-param-categories": "Показати лише зміни сторінок у всіх цих категоріях.",
-       "apihelp-feedrecentchanges-param-categories_any": "Показати натомість лише зміни на сторінках у будь-якій з цих категорій.",
        "apihelp-feedrecentchanges-example-simple": "Показати нещодавні зміни.",
        "apihelp-feedrecentchanges-example-30days": "Показати нещодавні зміни за 30 днів.",
        "apihelp-feedwatchlist-summary": "Видає стрічку списку спостереження.",
index c081ffc..5eec830 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "按标签过滤。",
        "apihelp-feedrecentchanges-param-target": "仅仅显示从该页面链出的那些页面的变更。",
        "apihelp-feedrecentchanges-param-showlinkedto": "仅仅显示链入到该页面的那些页面的变更。",
-       "apihelp-feedrecentchanges-param-categories": "只显示所有这些分类中的页面上的更改。",
-       "apihelp-feedrecentchanges-param-categories_any": "只显示这些分类以外页面的更改。",
        "apihelp-feedrecentchanges-example-simple": "显示最近更改。",
        "apihelp-feedrecentchanges-example-30days": "显示最近30天的更改。",
        "apihelp-feedwatchlist-summary": "返回监视列表纲要。",
        "apihelp-parse-param-disablepp": "请改用<var>$1disablelimitreport</var>。",
        "apihelp-parse-param-disableeditsection": "从解析器输出中省略编辑段落链接。",
        "apihelp-parse-param-disabletidy": "不要在解析器输出中运行HTML清理(例如tidy)。",
+       "apihelp-parse-param-disablestylededuplication": "不要在解析器输出中删除重复的行内样式表。",
        "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型<code>$1</code>;被<kbd>$2prop=parsetree</kbd>所取代)。",
        "apihelp-parse-param-preview": "在预览模式下解析。",
        "apihelp-parse-param-sectionpreview": "在段落预览模式下解析(同时要启用预览模式)。",
index b8e36bc..cd0734d 100644 (file)
@@ -272,7 +272,7 @@ class AuthPluginPrimaryAuthenticationProvider
                        if ( $failed ) {
                                throw new \UnexpectedValueException(
                                        "AuthPlugin failed to reset password for $username in the following domains: "
-                                               . join( ' ', $failed )
+                                               . implode( ' ', $failed )
                                );
                        }
                }
index 32dc8c0..4ff1004 100644 (file)
@@ -181,11 +181,11 @@ class FileDependency extends CacheDependency {
 
        function loadDependencyValues() {
                if ( is_null( $this->timestamp ) ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        # Dependency on a non-existent file stores "false"
                        # This is a valid concept!
                        $this->timestamp = filemtime( $this->filename );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
        }
 
@@ -193,9 +193,9 @@ class FileDependency extends CacheDependency {
         * @return bool
         */
        function isExpired() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $lastmod = filemtime( $this->filename );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $lastmod === false ) {
                        if ( $this->timestamp === false ) {
                                # Still nonexistent
index f2da08a..ce5a019 100644 (file)
@@ -179,9 +179,9 @@ abstract class FileCacheBase {
         * @return void
         */
        public function clearCache() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                unlink( $this->cachePath() );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                $this->mCached = false;
        }
 
index 63c03af..71fcd8b 100644 (file)
@@ -191,13 +191,11 @@ class MessageCache {
                                // ParserOptions for it. And don't cache this ParserOptions
                                // either.
                                $po = ParserOptions::newFromAnon();
-                               $po->setEditSection( false );
                                $po->setAllowUnsafeRawHtml( false );
                                return $po;
                        }
 
                        $this->mParserOptions = new ParserOptions;
-                       $this->mParserOptions->setEditSection( false );
                        // Messages may take parameters that could come
                        // from malicious sources. As a precaution, disable
                        // the <html> parser tag when parsing messages.
@@ -302,7 +300,7 @@ class MessageCache {
                }
 
                if ( !$success ) {
-                       $cacheKey = $this->clusterCache->makeKey( 'messages', $code ); # Key in memc for messages
+                       $cacheKey = $this->clusterCache->makeKey( 'messages', $code );
                        # Try the global cache. If it is empty, try to acquire a lock. If
                        # the lock can't be acquired, wait for the other thread to finish
                        # and then try the global cache a second time.
@@ -615,7 +613,7 @@ class MessageCache {
                                // load() calls do try to refresh the cache with replica DB data
                                $this->mCache[$code]['LATEST'] = time();
                                // Pre-emptively update the local datacenter cache so things like edit filter and
-                               // blacklist changes are reflect immediately, as these often use MediaWiki: pages.
+                               // blacklist changes are reflected immediately; these often use MediaWiki: pages.
                                // The datacenter handling replace() calls should be the same one handling edits
                                // as they require HTTP POST.
                                $this->saveToCaches( $this->mCache[$code], 'all', $code );
@@ -624,19 +622,7 @@ class MessageCache {
 
                                // Relay the purge. Touching this check key expires cache contents
                                // and local cache (APC) validation hash across all datacenters.
-                               $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) );
-                               // Also delete cached sidebar... just in case it is affected
-                               // @TODO: shouldn't this be $code === $wgLanguageCode?
-                               if ( $code === 'en' ) {
-                                       // Purge all language sidebars, e.g. on ?action=purge to the sidebar messages
-                                       $codes = array_keys( Language::fetchLanguageNames() );
-                               } else {
-                                       // Purge only the sidebar for this language
-                                       $codes = [ $code ];
-                               }
-                               foreach ( $codes as $code ) {
-                                       $this->wanCache->delete( $this->wanCache->makeKey( 'sidebar', $code ) );
-                               }
+                               $this->wanCache->touchCheckKey( $this->getCheckKey( $code ) );
 
                                // Purge the message in the message blob store
                                $resourceloader = RequestContext::getMain()->getOutput()->getResourceLoader();
@@ -703,7 +689,7 @@ class MessageCache {
                $value = $this->wanCache->get(
                        $this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ),
                        $curTTL,
-                       [ $this->wanCache->makeKey( 'messages', $code ) ]
+                       [ $this->getCheckKey( $code ) ]
                );
 
                if ( $value ) {
@@ -908,7 +894,7 @@ class MessageCache {
                if ( $useDB ) {
                        $uckey = $wgContLang->ucfirst( $lckey );
 
-                       if ( !isset( $alreadyTried[ $langcode ] ) ) {
+                       if ( !isset( $alreadyTried[$langcode] ) ) {
                                $message = $this->getMsgFromNamespace(
                                        $this->getMessagePageName( $langcode, $uckey ),
                                        $langcode
@@ -917,7 +903,7 @@ class MessageCache {
                                if ( $message !== false ) {
                                        return $message;
                                }
-                               $alreadyTried[ $langcode ] = true;
+                               $alreadyTried[$langcode] = true;
                        }
                } else {
                        $uckey = null;
@@ -934,7 +920,7 @@ class MessageCache {
                        $fallbackChain = Language::getFallbacksFor( $langcode );
 
                        foreach ( $fallbackChain as $code ) {
-                               if ( isset( $alreadyTried[ $code ] ) ) {
+                               if ( isset( $alreadyTried[$code] ) ) {
                                        continue;
                                }
 
@@ -944,7 +930,7 @@ class MessageCache {
                                if ( $message !== false ) {
                                        return $message;
                                }
-                               $alreadyTried[ $code ] = true;
+                               $alreadyTried[$code] = true;
                        }
                }
 
@@ -987,13 +973,12 @@ class MessageCache {
                if ( isset( $this->mCache[$code][$title] ) ) {
                        $entry = $this->mCache[$code][$title];
                        if ( substr( $entry, 0, 1 ) === ' ' ) {
-                               // The message exists, so make sure a string is returned.
+                               // The message exists and is not '!TOO BIG'
                                return (string)substr( $entry, 1 );
                        } elseif ( $entry === '!NONEXISTENT' ) {
                                return false;
-                       } elseif ( $entry === '!TOO BIG' ) {
-                               // Fall through and try invididual message cache below
                        }
+                       // Fall through and try invididual message cache below
                } else {
                        // XXX: This is not cached in process cache, should it?
                        $message = false;
@@ -1079,11 +1064,11 @@ class MessageCache {
        /**
         * @param string $message
         * @param bool $interface
-        * @param string $language Language code
+        * @param Language $language
         * @param Title $title
         * @return string
         */
-       function transform( $message, $interface = false, $language = null, $title = null ) {
+       public function transform( $message, $interface = false, $language = null, $title = null ) {
                // Avoid creating parser if nothing to transform
                if ( strpos( $message, '{{' ) === false ) {
                        return $message;
@@ -1112,7 +1097,7 @@ class MessageCache {
        /**
         * @return Parser
         */
-       function getParser() {
+       public function getParser() {
                global $wgParser, $wgParserConf;
 
                if ( !$this->mParser && isset( $wgParser ) ) {
@@ -1176,11 +1161,11 @@ class MessageCache {
                return $res;
        }
 
-       function disable() {
+       public function disable() {
                $this->mDisable = true;
        }
 
-       function enable() {
+       public function enable() {
                $this->mDisable = false;
        }
 
@@ -1201,13 +1186,14 @@ class MessageCache {
        }
 
        /**
-        * Clear all stored messages. Mainly used after a mass rebuild.
+        * Clear all stored messages in global and local cache
+        *
+        * Mainly used after a mass rebuild
         */
        function clear() {
                $langs = Language::fetchLanguageNames( null, 'mw' );
                foreach ( array_keys( $langs ) as $code ) {
-                       # Global and local caches
-                       $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) );
+                       $this->wanCache->touchCheckKey( $this->getCheckKey( $code ) );
                }
 
                $this->mLoadedLanguages = [];
@@ -1285,6 +1271,14 @@ class MessageCache {
                }
        }
 
+       /**
+        * @param string $code Language code
+        * @return string WAN cache key usable as a "check key" against language page edits
+        */
+       public function getCheckKey( $code ) {
+               return $this->wanCache->makeKey( 'messages', $code );
+       }
+
        /**
         * @param Content|null $content Content or null if the message page does not exist
         * @return string|bool|null Returns false if $content is null and null on error
index 26382aa..dd9e8e1 100644 (file)
@@ -517,15 +517,15 @@ class LocalisationCache {
         */
        protected function readPHPFile( $_fileName, $_fileType ) {
                // Disable APC caching
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                include $_fileName;
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                ini_set( 'apc.cache_by_default', $_apcEnabled );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $_fileType == 'core' || $_fileType == 'extension' ) {
                        $data = compact( self::$allKeys );
index 0df6828..6c7666f 100644 (file)
@@ -324,7 +324,7 @@ class EnhancedChangesList extends ChangesList {
                                $first--;
                        }
                        # Get net change
-                       $charDifference = $this->formatCharacterDifference( $block[$first], $block[$last] );
+                       $charDifference = $this->formatCharacterDifference( $block[$first], $block[$last] ) ?: false;
                }
 
                $numberofWatchingusers = $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
index 678e39a..dfaa398 100644 (file)
@@ -1110,9 +1110,9 @@ class RecentChange {
        public function parseParams() {
                $rcParams = $this->getAttribute( 'rc_params' );
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $unserializedParams = unserialize( $rcParams );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                return $unserializedParams;
        }
index be802f9..3388860 100644 (file)
@@ -95,9 +95,9 @@ class SquidPurgeClient {
                }
                $this->socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
                socket_set_nonblock( $this->socket );
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $ok = socket_connect( $this->socket, $ip, $this->port );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$ok ) {
                        $error = socket_last_error( $this->socket );
                        if ( $error !== self::EINPROGRESS ) {
@@ -153,12 +153,12 @@ class SquidPurgeClient {
                        } elseif ( IP::isIPv6( $this->host ) ) {
                                throw new MWException( '$wgSquidServers does not support IPv6' );
                        } else {
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                $this->ip = gethostbyname( $this->host );
                                if ( $this->ip === $this->host ) {
                                        $this->ip = false;
                                }
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
                        }
                }
                return $this->ip;
@@ -178,11 +178,11 @@ class SquidPurgeClient {
         */
        public function close() {
                if ( $this->socket ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        socket_set_block( $this->socket );
                        socket_shutdown( $this->socket );
                        socket_close( $this->socket );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
                $this->socket = null;
                $this->readBuffer = '';
@@ -252,9 +252,9 @@ class SquidPurgeClient {
                        $buf = substr( $this->writeBuffer, 0, self::BUFFER_SIZE );
                        $flags = 0;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $bytesSent = socket_send( $socket, $buf, strlen( $buf ), $flags );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $bytesSent === false ) {
                        $error = socket_last_error( $socket );
@@ -278,9 +278,9 @@ class SquidPurgeClient {
                }
 
                $buf = '';
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $bytesRead = socket_recv( $socket, $buf, self::BUFFER_SIZE, 0 );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $bytesRead === false ) {
                        $error = socket_last_error( $socket );
                        if ( $error != self::EAGAIN && $error != self::EINTR ) {
index 7b327d6..f6109f1 100644 (file)
@@ -66,9 +66,9 @@ class SquidPurgeClientPool {
                        }
                        $exceptSockets = null;
                        $timeout = min( $startTime + $this->timeout - microtime( true ), 1 );
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $numReady = socket_select( $readSockets, $writeSockets, $exceptSockets, $timeout );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $numReady === false ) {
                                wfDebugLog( 'squid', __METHOD__ . ': Error in stream_select: ' .
                                        socket_strerror( socket_last_error() ) . "\n" );
index 6fedead..db3a7a9 100644 (file)
@@ -557,7 +557,7 @@ class RequestContext implements IContextSource, MutableContext {
                        $wgUser = $context->getUser(); // b/c
                        if ( $session && MediaWiki\Session\PHPSessionHandler::isEnabled() ) {
                                session_id( $session->getId() );
-                               MediaWiki\quietCall( 'session_start' );
+                               Wikimedia\quietCall( 'session_start' );
                        }
                        $request = new FauxRequest( [], false, $session );
                        $request->setIP( $params['ip'] );
index 90fabaf..156e315 100644 (file)
@@ -61,10 +61,10 @@ class DatabaseOracle extends Database {
        }
 
        function __destruct() {
-               if ( $this->mOpened ) {
-                       MediaWiki\suppressWarnings();
+               if ( $this->opened ) {
+                       Wikimedia\suppressWarnings();
                        $this->close();
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
        }
 
@@ -100,21 +100,21 @@ class DatabaseOracle extends Database {
                }
 
                $this->close();
-               $this->mUser = $user;
-               $this->mPassword = $password;
+               $this->user = $user;
+               $this->password = $password;
                // changed internal variables functions
                // mServer now holds the TNS endpoint
                // mDBname is schema name if different from username
                if ( !$server ) {
                        // backward compatibillity (server used to be null and TNS was supplied in dbname)
-                       $this->mServer = $dbName;
-                       $this->mDBname = $user;
+                       $this->server = $dbName;
+                       $this->dbName = $user;
                } else {
-                       $this->mServer = $server;
+                       $this->server = $server;
                        if ( !$dbName ) {
-                               $this->mDBname = $user;
+                               $this->dbName = $user;
                        } else {
-                               $this->mDBname = $dbName;
+                               $this->dbName = $dbName;
                        }
                }
 
@@ -126,53 +126,53 @@ class DatabaseOracle extends Database {
                        $this->setFlag( DBO_PERSISTENT );
                }
 
-               $session_mode = $this->mFlags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT;
+               $session_mode = $this->flags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT;
 
-               MediaWiki\suppressWarnings();
-               if ( $this->mFlags & DBO_PERSISTENT ) {
-                       $this->mConn = oci_pconnect(
-                               $this->mUser,
-                               $this->mPassword,
-                               $this->mServer,
+               Wikimedia\suppressWarnings();
+               if ( $this->flags & DBO_PERSISTENT ) {
+                       $this->conn = oci_pconnect(
+                               $this->user,
+                               $this->password,
+                               $this->server,
                                $this->defaultCharset,
                                $session_mode
                        );
-               } elseif ( $this->mFlags & DBO_DEFAULT ) {
-                       $this->mConn = oci_new_connect(
-                               $this->mUser,
-                               $this->mPassword,
-                               $this->mServer,
+               } elseif ( $this->flags & DBO_DEFAULT ) {
+                       $this->conn = oci_new_connect(
+                               $this->user,
+                               $this->password,
+                               $this->server,
                                $this->defaultCharset,
                                $session_mode
                        );
                } else {
-                       $this->mConn = oci_connect(
-                               $this->mUser,
-                               $this->mPassword,
-                               $this->mServer,
+                       $this->conn = oci_connect(
+                               $this->user,
+                               $this->password,
+                               $this->server,
                                $this->defaultCharset,
                                $session_mode
                        );
                }
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
-               if ( $this->mUser != $this->mDBname ) {
+               if ( $this->user != $this->dbName ) {
                        // change current schema in session
-                       $this->selectDB( $this->mDBname );
+                       $this->selectDB( $this->dbName );
                }
 
-               if ( !$this->mConn ) {
+               if ( !$this->conn ) {
                        throw new DBConnectionError( $this, $this->lastError() );
                }
 
-               $this->mOpened = true;
+               $this->opened = true;
 
                # removed putenv calls because they interfere with the system globaly
                $this->doQuery( 'ALTER SESSION SET NLS_TIMESTAMP_FORMAT=\'DD-MM-YYYY HH24:MI:SS.FF6\'' );
                $this->doQuery( 'ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT=\'DD-MM-YYYY HH24:MI:SS.FF6\'' );
                $this->doQuery( 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=\'.,\'' );
 
-               return $this->mConn;
+               return $this->conn;
        }
 
        /**
@@ -181,11 +181,11 @@ class DatabaseOracle extends Database {
         * @return bool
         */
        protected function closeConnection() {
-               return oci_close( $this->mConn );
+               return oci_close( $this->conn );
        }
 
        function execFlags() {
-               return $this->mTrxLevel ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS;
+               return $this->trxLevel ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS;
        }
 
        protected function doQuery( $sql ) {
@@ -215,11 +215,11 @@ class DatabaseOracle extends Database {
                        $explain_count
                );
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
 
-               $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+               $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
                if ( $stmt === false ) {
-                       $e = oci_error( $this->mConn );
+                       $e = oci_error( $this->conn );
                        $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
 
                        return false;
@@ -234,7 +234,7 @@ class DatabaseOracle extends Database {
                        }
                }
 
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $explain_count > 0 ) {
                        return $this->doQuery( 'SELECT id, cardinality "ROWS" FROM plan_table ' .
@@ -335,20 +335,20 @@ class DatabaseOracle extends Database {
        }
 
        function lastError() {
-               if ( $this->mConn === false ) {
+               if ( $this->conn === false ) {
                        $e = oci_error();
                } else {
-                       $e = oci_error( $this->mConn );
+                       $e = oci_error( $this->conn );
                }
 
                return $e['message'];
        }
 
        function lastErrno() {
-               if ( $this->mConn === false ) {
+               if ( $this->conn === false ) {
                        $e = oci_error();
                } else {
-                       $e = oci_error( $this->mConn );
+                       $e = oci_error( $this->conn );
                }
 
                return $e['code'];
@@ -470,9 +470,9 @@ class DatabaseOracle extends Database {
                }
                $sql .= ')';
 
-               $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+               $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
                if ( $stmt === false ) {
-                       $e = oci_error( $this->mConn );
+                       $e = oci_error( $this->conn );
                        $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
 
                        return false;
@@ -502,7 +502,7 @@ class DatabaseOracle extends Database {
                                }
                        } else {
                                /** @var OCI_Lob[] $lob */
-                               $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB );
+                               $lob[$col] = oci_new_descriptor( $this->conn, OCI_D_LOB );
                                if ( $lob[$col] === false ) {
                                        $e = oci_error( $stmt );
                                        throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
@@ -522,7 +522,7 @@ class DatabaseOracle extends Database {
                        }
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
 
                if ( oci_execute( $stmt, $this->execFlags() ) === false ) {
                        $e = oci_error( $stmt );
@@ -537,7 +537,7 @@ class DatabaseOracle extends Database {
                        $this->mAffectedRows = oci_num_rows( $stmt );
                }
 
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( isset( $lob ) ) {
                        foreach ( $lob as $lob_v ) {
@@ -545,8 +545,8 @@ class DatabaseOracle extends Database {
                        }
                }
 
-               if ( !$this->mTrxLevel ) {
-                       oci_commit( $this->mConn );
+               if ( !$this->trxLevel ) {
+                       oci_commit( $this->conn );
                }
 
                return oci_free_statement( $stmt );
@@ -658,13 +658,13 @@ class DatabaseOracle extends Database {
                        FROM all_sequences asq, all_tab_columns atc
                        WHERE decode(
                                        atc.table_name,
-                                       '{$this->mTablePrefix}MWUSER',
-                                       '{$this->mTablePrefix}USER',
+                                       '{$this->tablePrefix}MWUSER',
+                                       '{$this->tablePrefix}USER',
                                        atc.table_name
                                ) || '_' ||
-                               atc.column_name || '_SEQ' = '{$this->mTablePrefix}' || asq.sequence_name
-                               AND asq.sequence_owner = upper('{$this->mDBname}')
-                               AND atc.owner = upper('{$this->mDBname}')" );
+                               atc.column_name || '_SEQ' = '{$this->tablePrefix}' || asq.sequence_name
+                               AND asq.sequence_owner = upper('{$this->dbName}')
+                               AND atc.owner = upper('{$this->dbName}')" );
 
                        while ( ( $row = $result->fetchRow() ) !== false ) {
                                $this->sequenceData[$row[1]] = [
@@ -730,9 +730,9 @@ class DatabaseOracle extends Database {
                $newName = strtoupper( $newName );
                $oldName = strtoupper( $oldName );
 
-               $tabName = substr( $newName, strlen( $this->mTablePrefix ) );
+               $tabName = substr( $newName, strlen( $this->tablePrefix ) );
                $oldPrefix = substr( $oldName, 0, strlen( $oldName ) - strlen( $tabName ) );
-               $newPrefix = strtoupper( $this->mTablePrefix );
+               $newPrefix = strtoupper( $this->tablePrefix );
 
                return $this->doQuery( "BEGIN DUPLICATE_TABLE( '$tabName', " .
                        "'$oldPrefix', '$newPrefix', $temporary ); END;" );
@@ -744,7 +744,7 @@ class DatabaseOracle extends Database {
                        $listWhere = ' AND table_name LIKE \'' . strtoupper( $prefix ) . '%\'';
                }
 
-               $owner = strtoupper( $this->mDBname );
+               $owner = strtoupper( $this->dbName );
                $result = $this->doQuery( "SELECT table_name FROM all_tables " .
                        "WHERE owner='$owner' AND table_name NOT LIKE '%!_IDX\$_' ESCAPE '!' $listWhere" );
 
@@ -805,7 +805,7 @@ class DatabaseOracle extends Database {
                );
                $row = $rset->fetchRow();
                if ( !$row ) {
-                       return oci_server_version( $this->mConn );
+                       return oci_server_version( $this->conn );
                }
 
                return $row['version'];
@@ -822,7 +822,7 @@ class DatabaseOracle extends Database {
                $table = $this->tableName( $table );
                $table = strtoupper( $this->removeIdentifierQuotes( $table ) );
                $index = strtoupper( $index );
-               $owner = strtoupper( $this->mDBname );
+               $owner = strtoupper( $this->dbName );
                $sql = "SELECT 1 FROM all_indexes WHERE owner='$owner' AND index_name='{$table}_{$index}'";
                $res = $this->doQuery( $sql );
                if ( $res ) {
@@ -844,7 +844,7 @@ class DatabaseOracle extends Database {
        function tableExists( $table, $fname = __METHOD__ ) {
                $table = $this->tableName( $table );
                $table = $this->addQuotes( strtoupper( $this->removeIdentifierQuotes( $table ) ) );
-               $owner = $this->addQuotes( strtoupper( $this->mDBname ) );
+               $owner = $this->addQuotes( strtoupper( $this->dbName ) );
                $sql = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
                $res = $this->doQuery( $sql );
                if ( $res && $res->numRows() > 0 ) {
@@ -890,7 +890,7 @@ class DatabaseOracle extends Database {
                }
 
                $fieldInfoStmt = oci_parse(
-                       $this->mConn,
+                       $this->conn,
                        'SELECT * FROM wiki_field_info_full WHERE table_name ' .
                                $tableWhere . ' and column_name = \'' . $field . '\''
                );
@@ -935,25 +935,25 @@ class DatabaseOracle extends Database {
        }
 
        protected function doBegin( $fname = __METHOD__ ) {
-               $this->mTrxLevel = 1;
+               $this->trxLevel = 1;
                $this->doQuery( 'SET CONSTRAINTS ALL DEFERRED' );
        }
 
        protected function doCommit( $fname = __METHOD__ ) {
-               if ( $this->mTrxLevel ) {
-                       $ret = oci_commit( $this->mConn );
+               if ( $this->trxLevel ) {
+                       $ret = oci_commit( $this->conn );
                        if ( !$ret ) {
                                throw new DBUnexpectedError( $this, $this->lastError() );
                        }
-                       $this->mTrxLevel = 0;
+                       $this->trxLevel = 0;
                        $this->doQuery( 'SET CONSTRAINTS ALL IMMEDIATE' );
                }
        }
 
        protected function doRollback( $fname = __METHOD__ ) {
-               if ( $this->mTrxLevel ) {
-                       oci_rollback( $this->mConn );
-                       $this->mTrxLevel = 0;
+               if ( $this->trxLevel ) {
+                       oci_rollback( $this->conn );
+                       $this->trxLevel = 0;
                        $this->doQuery( 'SET CONSTRAINTS ALL IMMEDIATE' );
                }
        }
@@ -1041,15 +1041,15 @@ class DatabaseOracle extends Database {
        }
 
        function selectDB( $db ) {
-               $this->mDBname = $db;
-               if ( $db == null || $db == $this->mUser ) {
+               $this->dbName = $db;
+               if ( $db == null || $db == $this->user ) {
                        return true;
                }
                $sql = 'ALTER SESSION SET CURRENT_SCHEMA=' . strtoupper( $db );
-               $stmt = oci_parse( $this->mConn, $sql );
-               MediaWiki\suppressWarnings();
+               $stmt = oci_parse( $this->conn, $sql );
+               Wikimedia\suppressWarnings();
                $success = oci_execute( $stmt );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$success ) {
                        $e = oci_error( $stmt );
                        if ( $e['code'] != '1435' ) {
@@ -1245,9 +1245,9 @@ class DatabaseOracle extends Database {
                        $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
                }
 
-               $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+               $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
                if ( $stmt === false ) {
-                       $e = oci_error( $this->mConn );
+                       $e = oci_error( $this->conn );
                        $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
 
                        return false;
@@ -1276,7 +1276,7 @@ class DatabaseOracle extends Database {
                                }
                        } else {
                                /** @var OCI_Lob[] $lob */
-                               $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB );
+                               $lob[$col] = oci_new_descriptor( $this->conn, OCI_D_LOB );
                                if ( $lob[$col] === false ) {
                                        $e = oci_error( $stmt );
                                        throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
@@ -1296,7 +1296,7 @@ class DatabaseOracle extends Database {
                        }
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
 
                if ( oci_execute( $stmt, $this->execFlags() ) === false ) {
                        $e = oci_error( $stmt );
@@ -1311,7 +1311,7 @@ class DatabaseOracle extends Database {
                        $this->mAffectedRows = oci_num_rows( $stmt );
                }
 
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( isset( $lob ) ) {
                        foreach ( $lob as $lob_v ) {
@@ -1319,8 +1319,8 @@ class DatabaseOracle extends Database {
                        }
                }
 
-               if ( !$this->mTrxLevel ) {
-                       oci_commit( $this->mConn );
+               if ( !$this->trxLevel ) {
+                       oci_commit( $this->conn );
                }
 
                return oci_free_statement( $stmt );
@@ -1340,11 +1340,11 @@ class DatabaseOracle extends Database {
        }
 
        function getDBname() {
-               return $this->mDBname;
+               return $this->dbName;
        }
 
        function getServer() {
-               return $this->mServer;
+               return $this->server;
        }
 
        public function buildGroupConcatField(
index 06ec574..7bd505d 100644 (file)
@@ -467,7 +467,7 @@ class LegacyLogger extends AbstractLogger {
                        $transport = UDPTransport::newFromString( $file );
                        $transport->emit( $text );
                } else {
-                       \MediaWiki\suppressWarnings();
+                       \Wikimedia\suppressWarnings();
                        $exists = file_exists( $file );
                        $size = $exists ? filesize( $file ) : false;
                        if ( !$exists ||
@@ -475,7 +475,7 @@ class LegacyLogger extends AbstractLogger {
                        ) {
                                file_put_contents( $file, $text, FILE_APPEND );
                        }
-                       \MediaWiki\restoreWarnings();
+                       \Wikimedia\restoreWarnings();
                }
        }
 
index 3c4833c..9b25d53 100644 (file)
@@ -106,10 +106,10 @@ class DeferredUpdates {
         *
         * @param callable $callable
         * @param int $stage DeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)
-        * @param IDatabase|null $dbw Abort if this DB is rolled back [optional] (since 1.28)
+        * @param IDatabase|IDatabase[]|null $dbw Abort if this DB is rolled back [optional] (since 1.28)
         */
        public static function addCallableUpdate(
-               $callable, $stage = self::POSTSEND, IDatabase $dbw = null
+               $callable, $stage = self::POSTSEND, $dbw = null
        ) {
                self::addUpdate( new MWCallableUpdate( $callable, wfGetCaller(), $dbw ), $stage );
        }
index 44876a6..2f882b8 100644 (file)
@@ -25,6 +25,8 @@ use Wikimedia\Rdbms\IDatabase;
  * Class for handling updates to the site_stats table
  */
 class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
+       /** @var BagOStuff */
+       protected $stash;
        /** @var int */
        protected $edits = 0;
        /** @var int */
@@ -44,6 +46,8 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
                $this->articles = $good;
                $this->pages = $pages;
                $this->users = $users;
+
+               $this->stash = MediaWikiServices::getInstance()->getMainObjectStash();
        }
 
        public function merge( MergeableUpdate $update ) {
@@ -72,11 +76,9 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
        }
 
        public function doUpdate() {
-               global $wgSiteStatsAsyncFactor;
-
                $this->doUpdateContextStats();
 
-               $rate = $wgSiteStatsAsyncFactor; // convenience
+               $rate = MediaWikiServices::getInstance()->getMainConfig()->get( 'SiteStatsAsyncFactor' );
                // If set to do so, only do actual DB updates 1 every $rate times.
                // The other times, just update "pending delta" values in memcached.
                if ( $rate && ( $rate < 0 || mt_rand( 0, $rate - 1 ) != 0 ) ) {
@@ -91,16 +93,15 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
         * Do not call this outside of SiteStatsUpdate
         */
        public function tryDBUpdateInternal() {
-               global $wgSiteStatsAsyncFactor;
+               $services = MediaWikiServices::getInstance();
+               $config = $services->getMainConfig();
 
-               $dbw = wfGetDB( DB_MASTER );
-               $lockKey = wfWikiID() . ':site_stats'; // prepend wiki ID
+               $dbw = $services->getDBLoadBalancer()->getConnection( DB_MASTER );
+               $lockKey = $dbw->getDomainID() . ':site_stats'; // prepend wiki ID
                $pd = [];
-               if ( $wgSiteStatsAsyncFactor ) {
+               if ( $config->get( 'SiteStatsAsyncFactor' ) ) {
                        // Lock the table so we don't have double DB/memcached updates
-                       if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
-                               || !$dbw->lock( $lockKey, __METHOD__, 1 ) // 1 sec timeout
-                       ) {
+                       if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) {
                                $this->doUpdatePendingDeltas();
 
                                return;
@@ -125,7 +126,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
                        $dbw->update( 'site_stats', [ $updates ], [], __METHOD__ );
                }
 
-               if ( $wgSiteStatsAsyncFactor ) {
+               if ( $config->get( 'SiteStatsAsyncFactor' ) ) {
                        // Decrement the async deltas now that we applied them
                        $this->removePendingDeltas( $pd );
                        // Commit the updates and unlock the table
@@ -140,9 +141,11 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
         * @param IDatabase $dbw
         * @return bool|mixed
         */
-       public static function cacheUpdate( $dbw ) {
-               global $wgActiveUserDays;
-               $dbr = wfGetDB( DB_REPLICA, 'vslow' );
+       public static function cacheUpdate( IDatabase $dbw ) {
+               $services = MediaWikiServices::getInstance();
+               $config = $services->getMainConfig();
+
+               $dbr = $services->getDBLoadBalancer()->getConnection( DB_REPLICA, 'vslow' );
                # Get non-bot users than did some recent action other than making accounts.
                # If account creation is included, the number gets inflated ~20+ fold on enwiki.
                $activeUsers = $dbr->selectField(
@@ -153,8 +156,8 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
                                'rc_user != 0',
                                'rc_bot' => 0,
                                'rc_log_type != ' . $dbr->addQuotes( 'newusers' ) . ' OR rc_log_type IS NULL',
-                               'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX )
-                                       - $wgActiveUserDays * 24 * 3600 ) ),
+                               'rc_timestamp >= ' . $dbr->addQuotes(
+                                       $dbr->timestamp( time() - $config->get( 'ActiveUserDays' ) * 24 * 3600 ) ),
                        ],
                        __METHOD__
                );
@@ -208,13 +211,13 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
        }
 
        /**
-        * @param BagOStuff $cache
+        * @param BagOStuff $stash
         * @param string $type
         * @param string $sign ('+' or '-')
         * @return string
         */
-       private function getTypeCacheKey( BagOStuff $cache, $type, $sign ) {
-               return $cache->makeKey( 'sitestatsupdate', 'pendingdelta', $type, $sign );
+       private function getTypeCacheKey( BagOStuff $stash, $type, $sign ) {
+               return $stash->makeKey( 'sitestatsupdate', 'pendingdelta', $type, $sign );
        }
 
        /**
@@ -224,15 +227,14 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
         * @param int $delta Delta (positive or negative)
         */
        protected function adjustPending( $type, $delta ) {
-               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
                if ( $delta < 0 ) { // decrement
-                       $key = $this->getTypeCacheKey( $cache, $type, '-' );
+                       $key = $this->getTypeCacheKey( $this->stash, $type, '-' );
                } else { // increment
-                       $key = $this->getTypeCacheKey( $cache, $type, '+' );
+                       $key = $this->getTypeCacheKey( $this->stash, $type, '+' );
                }
 
                $magnitude = abs( $delta );
-               $cache->incrWithInit( $key, 0, $magnitude, $magnitude );
+               $this->stash->incrWithInit( $key, 0, $magnitude, $magnitude );
        }
 
        /**
@@ -240,16 +242,20 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
         * @return array Positive and negative deltas for each type
         */
        protected function getPendingDeltas() {
-               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
-
                $pending = [];
                foreach ( [ 'ss_total_edits',
                        'ss_good_articles', 'ss_total_pages', 'ss_users', 'ss_images' ] as $type
                ) {
                        // Get pending increments and pending decrements
                        $flg = BagOStuff::READ_LATEST;
-                       $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $cache, $type, '+' ), $flg );
-                       $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $cache, $type, '-' ), $flg );
+                       $pending[$type]['+'] = (int)$this->stash->get(
+                               $this->getTypeCacheKey( $this->stash, $type, '+' ),
+                               $flg
+                       );
+                       $pending[$type]['-'] = (int)$this->stash->get(
+                               $this->getTypeCacheKey( $this->stash, $type, '-' ),
+                               $flg
+                       );
                }
 
                return $pending;
@@ -260,12 +266,11 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
         * @param array $pd Result of getPendingDeltas(), used for DB update
         */
        protected function removePendingDeltas( array $pd ) {
-               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
-
                foreach ( $pd as $type => $deltas ) {
                        foreach ( $deltas as $sign => $magnitude ) {
                                // Lower the pending counter now that we applied these changes
-                               $cache->decr( $this->getTypeCacheKey( $cache, $type, $sign ), $magnitude );
+                               $key = $this->getTypeCacheKey( $this->stash, $type, $sign );
+                               $this->stash->decr( $key, $magnitude );
                        }
                }
        }
index e76bffc..fa30d68 100644 (file)
@@ -658,11 +658,6 @@ class DifferenceEngine extends ContextSource {
         */
        protected function getParserOutput( WikiPage $page, Revision $rev ) {
                $parserOptions = $page->makeParserOptions( $this->getContext() );
-
-               if ( !$rev->isCurrent() || !$rev->getTitle()->quickUserCan( 'edit', $this->getUser() ) ) {
-                       $parserOptions->setEditSection( false );
-               }
-
                $parserOutput = $page->getParserOutput( $parserOptions, $rev->getId() );
 
                return $parserOutput;
index 16f226c..b3e9422 100644 (file)
@@ -189,7 +189,7 @@ class MWException extends Exception {
                } elseif ( self::isCommandLine() ) {
                        $message = $this->getText();
                        // T17602: STDERR may not be available
-                       if ( defined( 'STDERR' ) ) {
+                       if ( !defined( 'MW_PHPUNIT_TEST' ) && defined( 'STDERR' ) ) {
                                fwrite( STDERR, $message );
                        } else {
                                echo $message;
index b125f58..78a5df9 100644 (file)
@@ -664,7 +664,7 @@ TXT;
                $catcher = self::CAUGHT_BY_HANDLER;
                // The set_error_handler callback is independent from error_reporting.
                // Filter out unwanted errors manually (e.g. when
-               // MediaWiki\suppressWarnings is active).
+               // Wikimedia\suppressWarnings is active).
                $suppressed = ( error_reporting() & $e->getSeverity() ) === 0;
                if ( !$suppressed ) {
                        $logger = LoggerFactory::getInstance( $channel );
index 6b32953..e430bc8 100644 (file)
@@ -1318,9 +1318,9 @@ class FileRepo {
                }
                // Cleanup for disk source files...
                foreach ( $sourceFSFilesToDelete as $file ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        unlink( $file ); // FS cleanup
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
 
                return $status;
index cfbd062..d4605d3 100644 (file)
@@ -2186,7 +2186,7 @@ abstract class File implements IDBAccessObject {
                        $metadata = $this->getMetadata();
 
                        if ( is_string( $metadata ) ) {
-                               $metadata = MediaWiki\quietCall( 'unserialize', $metadata );
+                               $metadata = Wikimedia\quietCall( 'unserialize', $metadata );
                        }
 
                        if ( !is_array( $metadata ) ) {
index 92b5f17..7cf2749 100644 (file)
@@ -1292,7 +1292,7 @@ class LocalFile extends File {
                $options = [];
                $handler = MediaHandler::getHandler( $props['mime'] );
                if ( $handler ) {
-                       $metadata = MediaWiki\quietCall( 'unserialize', $props['metadata'] );
+                       $metadata = Wikimedia\quietCall( 'unserialize', $props['metadata'] );
 
                        if ( !is_array( $metadata ) ) {
                                $metadata = [];
index 3da3eb3..44bdddb 100644 (file)
@@ -111,14 +111,14 @@ class CurlHttpRequest extends MWHttpRequest {
                }
 
                if ( $this->followRedirects && $this->canFollowRedirects() ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        if ( !curl_setopt( $curlHandle, CURLOPT_FOLLOWLOCATION, true ) ) {
                                $this->logger->debug( __METHOD__ . ": Couldn't set CURLOPT_FOLLOWLOCATION. " .
                                        "Probably open_basedir is set.\n" );
                                // Continue the processing. If it were in curl_setopt_array,
                                // processing would have halted on its entry
                        }
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
 
                if ( $this->profiler ) {
index 94a2b93..cf382e4 100644 (file)
@@ -53,9 +53,9 @@ class ImportStreamSource implements ImportSource {
         * @return Status
         */
        static function newFromFile( $filename ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $file = fopen( $filename, 'rt' );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$file ) {
                        return Status::newFatal( "importcantopen" );
                }
diff --git a/includes/import/ImportableOldRevision.php b/includes/import/ImportableOldRevision.php
new file mode 100644 (file)
index 0000000..6d1e242
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @since 1.31
+ */
+interface ImportableOldRevision {
+
+       /**
+        * @since 1.31
+        * @return User
+        */
+       public function getUserObj();
+
+       /**
+        * @since 1.31
+        * @return string
+        */
+       public function getUser();
+
+       /**
+        * @since 1.31
+        * @return Title
+        */
+       public function getTitle();
+
+       /**
+        * @since 1.31
+        * @return string
+        */
+       public function getTimestamp();
+
+       /**
+        * @since 1.31
+        * @return string
+        */
+       public function getComment();
+
+       /**
+        * @since 1.31
+        * @return string
+        */
+       public function getModel();
+
+       /**
+        * @since 1.31
+        * @return string
+        */
+       public function getFormat();
+
+       /**
+        * @since 1.31
+        * @return Content
+        */
+       public function getContent();
+
+       /**
+        * @since 1.31
+        * @return bool
+        */
+       public function getMinor();
+
+       /**
+        * @since 1.31
+        * @return bool|string
+        */
+       public function getSha1Base36();
+
+}
diff --git a/includes/import/ImportableOldRevisionImporter.php b/includes/import/ImportableOldRevisionImporter.php
new file mode 100644 (file)
index 0000000..33fad3e
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+
+use Psr\Log\LoggerInterface;
+use Wikimedia\Rdbms\LoadBalancer;
+
+/**
+ * @since 1.31
+ */
+class ImportableOldRevisionImporter implements OldRevisionImporter {
+
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       /**
+        * @var bool
+        */
+       private $doUpdates;
+
+       /**
+        * @var LoadBalancer
+        */
+       private $loadBalancer;
+
+       /**
+        * @param bool $doUpdates
+        * @param LoggerInterface $logger
+        * @param LoadBalancer $loadBalancer
+        */
+       public function __construct(
+               $doUpdates,
+               LoggerInterface $logger,
+               LoadBalancer $loadBalancer
+       ) {
+               $this->doUpdates = $doUpdates;
+               $this->logger = $logger;
+               $this->loadBalancer = $loadBalancer;
+       }
+
+       public function import( ImportableOldRevision $importableRevision, $doUpdates = true ) {
+               $dbw = $this->loadBalancer->getConnectionRef( DB_MASTER );
+
+               # Sneak a single revision into place
+               $user = $importableRevision->getUserObj() ?: User::newFromName( $importableRevision->getUser() );
+               if ( $user ) {
+                       $userId = intval( $user->getId() );
+                       $userText = $user->getName();
+               } else {
+                       $userId = 0;
+                       $userText = $importableRevision->getUser();
+                       $user = new User;
+               }
+
+               // avoid memory leak...?
+               Title::clearCaches();
+
+               $page = WikiPage::factory( $importableRevision->getTitle() );
+               $page->loadPageData( 'fromdbmaster' );
+               if ( !$page->exists() ) {
+                       // must create the page...
+                       $pageId = $page->insertOn( $dbw );
+                       $created = true;
+                       $oldcountable = null;
+               } else {
+                       $pageId = $page->getId();
+                       $created = false;
+
+                       // Note: sha1 has been in XML dumps since 2012. If you have an
+                       // older dump, the duplicate detection here won't work.
+                       $prior = $dbw->selectField( 'revision', '1',
+                               [ 'rev_page' => $pageId,
+                                       'rev_timestamp' => $dbw->timestamp( $importableRevision->getTimestamp() ),
+                                       'rev_sha1' => $importableRevision->getSha1Base36() ],
+                               __METHOD__
+                       );
+                       if ( $prior ) {
+                               // @todo FIXME: This could fail slightly for multiple matches :P
+                               $this->logger->debug( __METHOD__ . ": skipping existing revision for [[" .
+                                       $importableRevision->getTitle()->getPrefixedText() . "]], timestamp " .
+                                       $importableRevision->getTimestamp() . "\n" );
+                               return false;
+                       }
+               }
+
+               if ( !$pageId ) {
+                       // This seems to happen if two clients simultaneously try to import the
+                       // same page
+                       $this->logger->debug( __METHOD__ . ': got invalid $pageId when importing revision of [[' .
+                               $importableRevision->getTitle()->getPrefixedText() . ']], timestamp ' .
+                               $importableRevision->getTimestamp() . "\n" );
+                       return false;
+               }
+
+               // Select previous version to make size diffs correct
+               // @todo This assumes that multiple revisions of the same page are imported
+               // in order from oldest to newest.
+               $prevId = $dbw->selectField( 'revision', 'rev_id',
+                       [
+                               'rev_page' => $pageId,
+                               'rev_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $importableRevision->getTimestamp() ) ),
+                       ],
+                       __METHOD__,
+                       [ 'ORDER BY' => [
+                               'rev_timestamp DESC',
+                               'rev_id DESC', // timestamp is not unique per page
+                       ]
+                       ]
+               );
+
+               # @todo FIXME: Use original rev_id optionally (better for backups)
+               # Insert the row
+               $revision = new Revision( [
+                       'title' => $importableRevision->getTitle(),
+                       'page' => $pageId,
+                       'content_model' => $importableRevision->getModel(),
+                       'content_format' => $importableRevision->getFormat(),
+                       // XXX: just set 'content' => $wikiRevision->getContent()?
+                       'text' => $importableRevision->getContent()->serialize( $importableRevision->getFormat() ),
+                       'comment' => $importableRevision->getComment(),
+                       'user' => $userId,
+                       'user_text' => $userText,
+                       'timestamp' => $importableRevision->getTimestamp(),
+                       'minor_edit' => $importableRevision->getMinor(),
+                       'parent_id' => $prevId,
+               ] );
+               $revision->insertOn( $dbw );
+               $changed = $page->updateIfNewerOn( $dbw, $revision );
+
+               if ( $changed !== false && $this->doUpdates ) {
+                       $this->logger->debug( __METHOD__ . ": running updates\n" );
+                       // countable/oldcountable stuff is handled in WikiImporter::finishImportPage
+                       $page->doEditUpdates(
+                               $revision,
+                               $user,
+                               [ 'created' => $created, 'oldcountable' => 'no-change' ]
+                       );
+               }
+
+               return true;
+       }
+
+}
diff --git a/includes/import/ImportableUploadRevision.php b/includes/import/ImportableUploadRevision.php
new file mode 100644 (file)
index 0000000..3f60112
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @since 1.31
+ */
+interface ImportableUploadRevision {
+
+       /**
+        * @since 1.31
+        * @return string Archive name of a revision if archived.
+        */
+       public function getArchiveName();
+
+       /**
+        * @since 1.31
+        * @return Title
+        */
+       public function getTitle();
+
+       /**
+        * @since 1.31
+        * @return string
+        */
+       public function getTimestamp();
+
+       /**
+        * @since 1.31
+        * @return string|null HTTP source of revision to be used for downloading.
+        */
+       public function getSrc();
+
+       /**
+        * @since 1.31
+        * @return string Local file source of the revision.
+        */
+       public function getFileSrc();
+
+       /**
+        * @since 1.31
+        * @return bool Is the return of getFileSrc only temporary?
+        */
+       public function isTempSrc();
+
+       /**
+        * @since 1.31
+        * @return string|bool sha1 of the revision, false if not set or errors occour.
+        */
+       public function getSha1();
+
+       /**
+        * @since 1.31
+        * @return User
+        */
+       public function getUserObj();
+
+       /**
+        * @since 1.31
+        * @return string The username of the user that created this revision
+        */
+       public function getUser();
+
+       /**
+        * @since 1.31
+        * @return string
+        */
+       public function getComment();
+
+}
diff --git a/includes/import/ImportableUploadRevisionImporter.php b/includes/import/ImportableUploadRevisionImporter.php
new file mode 100644 (file)
index 0000000..495b3d6
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+
+use Psr\Log\LoggerInterface;
+
+/**
+ * @since 1.31
+ */
+class ImportableUploadRevisionImporter implements UploadRevisionImporter {
+
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       /**
+        * @var bool
+        */
+       private $enableUploads;
+
+       /**
+        * @param bool $enableUploads
+        * @param LoggerInterface $logger
+        */
+       public function __construct(
+               $enableUploads,
+               LoggerInterface $logger
+       ) {
+               $this->enableUploads = $enableUploads;
+               $this->logger = $logger;
+       }
+
+       /**
+        * @return StatusValue
+        */
+       private function newNotOkStatus() {
+               $statusValue = new StatusValue();
+               $statusValue->setOK( false );
+               return $statusValue;
+       }
+
+       public function import( ImportableUploadRevision $importableRevision ) {
+               # Construct a file
+               $archiveName = $importableRevision->getArchiveName();
+               if ( $archiveName ) {
+                       $this->logger->debug( __METHOD__ . "Importing archived file as $archiveName\n" );
+                       $file = OldLocalFile::newFromArchiveName( $importableRevision->getTitle(),
+                               RepoGroup::singleton()->getLocalRepo(), $archiveName );
+               } else {
+                       $file = wfLocalFile( $importableRevision->getTitle() );
+                       $file->load( File::READ_LATEST );
+                       $this->logger->debug( __METHOD__ . 'Importing new file as ' . $file->getName() . "\n" );
+                       if ( $file->exists() && $file->getTimestamp() > $importableRevision->getTimestamp() ) {
+                               $archiveName = $file->getTimestamp() . '!' . $file->getName();
+                               $file = OldLocalFile::newFromArchiveName( $importableRevision->getTitle(),
+                                       RepoGroup::singleton()->getLocalRepo(), $archiveName );
+                               $this->logger->debug( __METHOD__ . "File already exists; importing as $archiveName\n" );
+                       }
+               }
+               if ( !$file ) {
+                       $this->logger->debug( __METHOD__ . ': Bad file for ' . $importableRevision->getTitle() . "\n" );
+                       return $this->newNotOkStatus();
+               }
+
+               # Get the file source or download if necessary
+               $source = $importableRevision->getFileSrc();
+               $autoDeleteSource = $importableRevision->isTempSrc();
+               if ( !strlen( $source ) ) {
+                       $source = $this->downloadSource( $importableRevision );
+                       $autoDeleteSource = true;
+               }
+               if ( !strlen( $source ) ) {
+                       $this->logger->debug( __METHOD__ . ": Could not fetch remote file.\n" );
+                       return $this->newNotOkStatus();
+               }
+
+               $tmpFile = new TempFSFile( $source );
+               if ( $autoDeleteSource ) {
+                       $tmpFile->autocollect();
+               }
+
+               $sha1File = ltrim( sha1_file( $source ), '0' );
+               $sha1 = $importableRevision->getSha1();
+               if ( $sha1 && ( $sha1 !== $sha1File ) ) {
+                       $this->logger->debug( __METHOD__ . ": Corrupt file $source.\n" );
+                       return $this->newNotOkStatus();
+               }
+
+               $user = $importableRevision->getUserObj() ?: User::newFromName( $importableRevision->getUser() );
+
+               # Do the actual upload
+               if ( $archiveName ) {
+                       $status = $file->uploadOld( $source, $archiveName,
+                               $importableRevision->getTimestamp(), $importableRevision->getComment(), $user );
+               } else {
+                       $flags = 0;
+                       $status = $file->upload(
+                               $source,
+                               $importableRevision->getComment(),
+                               $importableRevision->getComment(),
+                               $flags,
+                               false,
+                               $importableRevision->getTimestamp(),
+                               $user
+                       );
+               }
+
+               if ( $status->isGood() ) {
+                       $this->logger->debug( __METHOD__ . ": Successful\n" );
+               } else {
+                       $this->logger->debug( __METHOD__ . ': failed: ' . $status->getHTML() . "\n" );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @deprecated DO NOT CALL ME.
+        * This method was introduced when factoring UploadImporter out of WikiRevision.
+        * It only has 1 use by the deprecated downloadSource method in WikiRevision.
+        * Do not use this in new code.
+        *
+        * @param ImportableUploadRevision $wikiRevision
+        *
+        * @return bool|string
+        */
+       public function downloadSource( ImportableUploadRevision $wikiRevision ) {
+               if ( !$this->enableUploads ) {
+                       return false;
+               }
+
+               $tempo = tempnam( wfTempDir(), 'download' );
+               $f = fopen( $tempo, 'wb' );
+               if ( !$f ) {
+                       $this->logger->debug( "IMPORT: couldn't write to temp file $tempo\n" );
+                       return false;
+               }
+
+               // @todo FIXME!
+               $src = $wikiRevision->getSrc();
+               $data = Http::get( $src, [], __METHOD__ );
+               if ( !$data ) {
+                       $this->logger->debug( "IMPORT: couldn't fetch source $src\n" );
+                       fclose( $f );
+                       unlink( $tempo );
+                       return false;
+               }
+
+               fwrite( $f, $data );
+               fclose( $f );
+
+               return $tempo;
+       }
+
+}
diff --git a/includes/import/OldRevisionImporter.php b/includes/import/OldRevisionImporter.php
new file mode 100644 (file)
index 0000000..72af43b
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @since 1.31
+ */
+interface OldRevisionImporter {
+
+       /**
+        * @since 1.31
+        *
+        * @param ImportableOldRevision $importableRevision
+        *
+        * @return bool Success
+        */
+       public function import( ImportableOldRevision $importableRevision );
+
+}
diff --git a/includes/import/UploadRevisionImporter.php b/includes/import/UploadRevisionImporter.php
new file mode 100644 (file)
index 0000000..966fc11
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @since 1.31
+ */
+interface UploadRevisionImporter {
+
+       /**
+        * @since 1.31
+        *
+        * @param ImportableUploadRevision $importableUploadRevision
+        *
+        * @return StatusValue On success, the value member contains the
+        *     archive name, or an empty string if it was a new file.
+        */
+       public function import( ImportableUploadRevision $importableUploadRevision );
+
+}
index 3513f8c..4325a1a 100644 (file)
@@ -23,6 +23,8 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Represents a revision, log entry or upload during the import process.
@@ -32,7 +34,7 @@
  *
  * @ingroup SpecialPage
  */
-class WikiRevision {
+class WikiRevision implements ImportableUploadRevision, ImportableOldRevision {
 
        /**
         * @since 1.17
@@ -170,9 +172,9 @@ class WikiRevision {
 
        /**
         * @since 1.12.2
-        * @var mixed
+        * @var string|null
         */
-       protected $src;
+       protected $src = null;
 
        /**
         * @since 1.18
@@ -298,7 +300,7 @@ class WikiRevision {
 
        /**
         * @since 1.12.2
-        * @param mixed $src
+        * @param string|null $src
         */
        public function setSrc( $src ) {
                $this->src = $src;
@@ -494,7 +496,7 @@ class WikiRevision {
 
        /**
         * @since 1.12.2
-        * @return mixed
+        * @return string|null
         */
        public function getSrc() {
                return $this->src;
@@ -511,6 +513,17 @@ class WikiRevision {
                return false;
        }
 
+       /**
+        * @since 1.31
+        * @return bool|string
+        */
+       public function getSha1Base36() {
+               if ( $this->sha1base36 ) {
+                       return $this->sha1base36;
+               }
+               return false;
+       }
+
        /**
         * @since 1.17
         * @return string
@@ -577,106 +590,16 @@ class WikiRevision {
 
        /**
         * @since 1.4.1
+        * @deprecated in 1.31. Use OldRevisionImporter::import
         * @return bool
         */
        public function importOldRevision() {
-               $dbw = wfGetDB( DB_MASTER );
-
-               # Sneak a single revision into place
-               $user = $this->getUserObj() ?: User::newFromName( $this->getUser() );
-               if ( $user ) {
-                       $userId = intval( $user->getId() );
-                       $userText = $user->getName();
-               } else {
-                       $userId = 0;
-                       $userText = $this->getUser();
-                       $user = new User;
-               }
-
-               // avoid memory leak...?
-               Title::clearCaches();
-
-               $page = WikiPage::factory( $this->title );
-               $page->loadPageData( 'fromdbmaster' );
-               if ( !$page->exists() ) {
-                       // must create the page...
-                       $pageId = $page->insertOn( $dbw );
-                       $created = true;
-                       $oldcountable = null;
+               if ( $this->mNoUpdates ) {
+                       $importer = MediaWikiServices::getInstance()->getWikiRevisionOldRevisionImporterNoUpdates();
                } else {
-                       $pageId = $page->getId();
-                       $created = false;
-
-                       // Note: sha1 has been in XML dumps since 2012. If you have an
-                       // older dump, the duplicate detection here won't work.
-                       $prior = $dbw->selectField( 'revision', '1',
-                               [ 'rev_page' => $pageId,
-                                       'rev_timestamp' => $dbw->timestamp( $this->timestamp ),
-                                       'rev_sha1' => $this->sha1base36 ],
-                               __METHOD__
-                       );
-                       if ( $prior ) {
-                               // @todo FIXME: This could fail slightly for multiple matches :P
-                               wfDebug( __METHOD__ . ": skipping existing revision for [[" .
-                                       $this->title->getPrefixedText() . "]], timestamp " . $this->timestamp . "\n" );
-                               return false;
-                       }
-               }
-
-               if ( !$pageId ) {
-                       // This seems to happen if two clients simultaneously try to import the
-                       // same page
-                       wfDebug( __METHOD__ . ': got invalid $pageId when importing revision of [[' .
-                               $this->title->getPrefixedText() . ']], timestamp ' . $this->timestamp . "\n" );
-                       return false;
+                       $importer = MediaWikiServices::getInstance()->getWikiRevisionOldRevisionImporter();
                }
-
-               // Select previous version to make size diffs correct
-               // @todo This assumes that multiple revisions of the same page are imported
-               // in order from oldest to newest.
-               $prevId = $dbw->selectField( 'revision', 'rev_id',
-                       [
-                               'rev_page' => $pageId,
-                               'rev_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $this->timestamp ) ),
-                       ],
-                       __METHOD__,
-                       [ 'ORDER BY' => [
-                                       'rev_timestamp DESC',
-                                       'rev_id DESC', // timestamp is not unique per page
-                               ]
-                       ]
-               );
-
-               # @todo FIXME: Use original rev_id optionally (better for backups)
-               # Insert the row
-               $revision = new Revision( [
-                       'title' => $this->title,
-                       'page' => $pageId,
-                       'content_model' => $this->getModel(),
-                       'content_format' => $this->getFormat(),
-                       // XXX: just set 'content' => $this->getContent()?
-                       'text' => $this->getContent()->serialize( $this->getFormat() ),
-                       'comment' => $this->getComment(),
-                       'user' => $userId,
-                       'user_text' => $userText,
-                       'timestamp' => $this->timestamp,
-                       'minor_edit' => $this->minor,
-                       'parent_id' => $prevId,
-                       ] );
-               $revision->insertOn( $dbw );
-               $changed = $page->updateIfNewerOn( $dbw, $revision );
-
-               if ( $changed !== false && !$this->mNoUpdates ) {
-                       wfDebug( __METHOD__ . ": running updates\n" );
-                       // countable/oldcountable stuff is handled in WikiImporter::finishImportPage
-                       $page->doEditUpdates(
-                               $revision,
-                               $user,
-                               [ 'created' => $created, 'oldcountable' => 'no-change' ]
-                       );
-               }
-
-               return true;
+               return $importer->import( $this );
        }
 
        /**
@@ -737,106 +660,26 @@ class WikiRevision {
 
        /**
         * @since 1.12.2
+        * @deprecated in 1.31. Use UploadImporter::import
         * @return bool
         */
        public function importUpload() {
-               # Construct a file
-               $archiveName = $this->getArchiveName();
-               if ( $archiveName ) {
-                       wfDebug( __METHOD__ . "Importing archived file as $archiveName\n" );
-                       $file = OldLocalFile::newFromArchiveName( $this->getTitle(),
-                               RepoGroup::singleton()->getLocalRepo(), $archiveName );
-               } else {
-                       $file = wfLocalFile( $this->getTitle() );
-                       $file->load( File::READ_LATEST );
-                       wfDebug( __METHOD__ . 'Importing new file as ' . $file->getName() . "\n" );
-                       if ( $file->exists() && $file->getTimestamp() > $this->getTimestamp() ) {
-                               $archiveName = $file->getTimestamp() . '!' . $file->getName();
-                               $file = OldLocalFile::newFromArchiveName( $this->getTitle(),
-                                       RepoGroup::singleton()->getLocalRepo(), $archiveName );
-                               wfDebug( __METHOD__ . "File already exists; importing as $archiveName\n" );
-                       }
-               }
-               if ( !$file ) {
-                       wfDebug( __METHOD__ . ': Bad file for ' . $this->getTitle() . "\n" );
-                       return false;
-               }
-
-               # Get the file source or download if necessary
-               $source = $this->getFileSrc();
-               $autoDeleteSource = $this->isTempSrc();
-               if ( !strlen( $source ) ) {
-                       $source = $this->downloadSource();
-                       $autoDeleteSource = true;
-               }
-               if ( !strlen( $source ) ) {
-                       wfDebug( __METHOD__ . ": Could not fetch remote file.\n" );
-                       return false;
-               }
-
-               $tmpFile = new TempFSFile( $source );
-               if ( $autoDeleteSource ) {
-                       $tmpFile->autocollect();
-               }
-
-               $sha1File = ltrim( sha1_file( $source ), '0' );
-               $sha1 = $this->getSha1();
-               if ( $sha1 && ( $sha1 !== $sha1File ) ) {
-                       wfDebug( __METHOD__ . ": Corrupt file $source.\n" );
-                       return false;
-               }
-
-               $user = $this->getUserObj() ?: User::newFromName( $this->getUser() );
-
-               # Do the actual upload
-               if ( $archiveName ) {
-                       $status = $file->uploadOld( $source, $archiveName,
-                               $this->getTimestamp(), $this->getComment(), $user );
-               } else {
-                       $flags = 0;
-                       $status = $file->upload( $source, $this->getComment(), $this->getComment(),
-                               $flags, false, $this->getTimestamp(), $user );
-               }
-
-               if ( $status->isGood() ) {
-                       wfDebug( __METHOD__ . ": Successful\n" );
-                       return true;
-               } else {
-                       wfDebug( __METHOD__ . ': failed: ' . $status->getHTML() . "\n" );
-                       return false;
-               }
+               $importer = MediaWikiServices::getInstance()->getWikiRevisionUploadImporter();
+               $statusValue = $importer->import( $this );
+               return $statusValue->isGood();
        }
 
        /**
         * @since 1.12.2
+        * @deprecated in 1.31. Use UploadImporter::downloadSource
         * @return bool|string
         */
        public function downloadSource() {
-               if ( !$this->config->get( 'EnableUploads' ) ) {
-                       return false;
-               }
-
-               $tempo = tempnam( wfTempDir(), 'download' );
-               $f = fopen( $tempo, 'wb' );
-               if ( !$f ) {
-                       wfDebug( "IMPORT: couldn't write to temp file $tempo\n" );
-                       return false;
-               }
-
-               // @todo FIXME!
-               $src = $this->getSrc();
-               $data = Http::get( $src, [], __METHOD__ );
-               if ( !$data ) {
-                       wfDebug( "IMPORT: couldn't fetch source $src\n" );
-                       fclose( $f );
-                       unlink( $tempo );
-                       return false;
-               }
-
-               fwrite( $f, $data );
-               fclose( $f );
-
-               return $tempo;
+               $importer = new ImportableUploadRevisionImporter(
+                       $this->config->get( 'EnableUploads' ),
+                       LoggerFactory::getInstance( 'UploadRevisionImporter' )
+               );
+               return $importer->downloadSource( $this );
        }
 
 }
index 62acebf..e6ee70e 100644 (file)
@@ -730,10 +730,10 @@ abstract class DatabaseInstaller {
                        return $status;
                }
                global $IP;
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $rows = file( "$IP/maintenance/interwiki.list",
                        FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                $interwikis = [];
                if ( !$rows ) {
                        return Status::newFatal( 'config-install-interwiki-list' );
index 439b370..f5e12d6 100644 (file)
@@ -445,7 +445,6 @@ abstract class Installer {
 
                $this->parserTitle = Title::newFromText( 'Installer' );
                $this->parserOptions = new ParserOptions( $wgUser ); // language will be wrong :(
-               $this->parserOptions->setEditSection( false );
                // Don't try to access DB before user language is initialised
                $this->setParserLanguage( Language::factory( 'en' ) );
        }
@@ -598,9 +597,9 @@ abstract class Installer {
                // phpcs:ignore MediaWiki.VariableAnalysis.UnusedGlobalVariables
                global $wgExtensionDirectory, $wgStyleDirectory;
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $_lsExists = file_exists( "$IP/LocalSettings.php" );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$_lsExists ) {
                        return false;
@@ -805,14 +804,14 @@ abstract class Installer {
         * @return bool
         */
        protected function envCheckPCRE() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $regexd = preg_replace( '/[\x{0430}-\x{04FF}]/iu', '', '-АБВГД-' );
                // Need to check for \p support too, as PCRE can be compiled
                // with utf8 support, but not unicode property support.
                // check that \p{Zs} (space separators) matches
                // U+3000 (Ideographic space)
                $regexprop = preg_replace( '/\p{Zs}/u', '', "-\xE3\x80\x80-" );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $regexd != '--' || $regexprop != '--' ) {
                        $this->showError( 'config-pcre-no-utf8' );
 
@@ -1205,7 +1204,7 @@ abstract class Installer {
 
                // it would be good to check other popular languages here, but it'll be slow.
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
 
                foreach ( $scriptTypes as $ext => $contents ) {
                        foreach ( $contents as $source ) {
@@ -1224,14 +1223,14 @@ abstract class Installer {
                                unlink( $dir . $file );
 
                                if ( $text == 'exec' ) {
-                                       MediaWiki\restoreWarnings();
+                                       Wikimedia\restoreWarnings();
 
                                        return $ext;
                                }
                        }
                }
 
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                return false;
        }
@@ -1564,7 +1563,7 @@ abstract class Installer {
                        $user->saveSettings();
 
                        // Update user count
-                       $ssUpdate = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
+                       $ssUpdate = SiteStatsUpdate::factory( [ 'users' => 1 ] );
                        $ssUpdate->doUpdate();
                }
                $status = Status::newGood();
@@ -1700,8 +1699,8 @@ abstract class Installer {
         * Some long-running pages (Install, Upgrade) will want to do this
         */
        protected function disableTimeLimit() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                set_time_limit( 0 );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
        }
 }
index 31718fe..6f16872 100644 (file)
@@ -160,9 +160,9 @@ class SqliteInstaller extends DatabaseInstaller {
                        # Called early on in the installer, later we just want to sanity check
                        # if it's still writable
                        if ( $create ) {
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                $ok = wfMkdirParents( $dir, 0700, __METHOD__ );
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
                                if ( !$ok ) {
                                        return Status::newFatal( 'config-sqlite-mkdir-error', $dir );
                                }
index 5b24d7c..92eef95 100644 (file)
@@ -63,7 +63,7 @@
        "config-apc": "[http://www.php.net/apc APC] ta instaláu",
        "config-apcu": "[http://www.php.net/apcu APCu] ta instaláu",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] ta instaláu",
-       "config-no-cache-apcu": "<strong>Warning:</strong> Non pudo atopase[http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl caxé d'oxetos nun ta activáu.",
+       "config-no-cache-apcu": "<strong>Atención:</strong> Nun pudo alcontrase [http://www.php.net/apcu APCu] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLa caché d'oxetos nun ta activada.",
        "config-mod-security": "<strong>Alvertencia:</strong> El to servidor web tien activáu [https://modsecurity.org/mod_security]/mod_security2 .Munches de les sos configuraciones comunes pueden causar problemes a MediaWiki o otru software que dexe a los usuarios publicar conteníu arbitrario. De ser posible, tendríes de desactivalo. Si non, consulta la  [https://modsecurity.org/documentation/ mod_security documentation] o contacta col alministrador del to servidor si atopes erros aleatorios.",
        "config-diff3-bad": "Nun s'alcontró GNU diff3.",
        "config-git": "Alcontróse'l software de control de versiones Git: <code>$1</code>.",
index 131ddbb..4c4504e 100644 (file)
        "config-cache-options": "Налады кэшаваньня аб’ектаў:",
        "config-cache-help": "Кэшаваньне аб’ектаў павялічвае хуткасьць працы MediaWiki праз кэшаваньне зьвестак, якія часта выкарыстоўваюцца.\nВельмі рэкамэндуем уключыць гэта для сярэдніх і буйных сайтаў, таксама будзе карысна для дробных сайтаў.",
        "config-cache-none": "Без кэшаваньня (ніякія магчымасьці не страчваюцца, але хуткасьць працы буйных сайтаў можа зьнізіцца)",
-       "config-cache-accel": "Кэшаваньне аб’ектаў PHP (APC, APCu, XCache ці WinCache)",
+       "config-cache-accel": "Кэшаваньне аб’ектаў PHP (APC, APCu ці WinCache)",
        "config-cache-memcached": "Выкарыстоўваць Memcached (патрабуе дадатковай канфігурацыі)",
        "config-memcached-servers": "Сэрвэры memcached:",
        "config-memcached-help": "Сьпіс IP-адрасоў, якія будуць выкарыстоўвацца Memcached.\nАдрасы павінны быць у асобным радку з пазначэньнем порту, які будзе выкарыстоўвацца. Напрыклад:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index cd5d35c..ad2b910 100644 (file)
@@ -9,7 +9,8 @@
                        "Paxt",
                        "Matěj Suchánek",
                        "LordMsz",
-                       "Seb35"
+                       "Seb35",
+                       "Ilimanaq29"
                ]
        },
        "config-desc": "Instalační program pro MediaWiki",
@@ -67,8 +68,8 @@
        "config-memory-bad": "<strong>Upozornění:</strong> <code>memory_limit</code> je v PHP nastaven na $1.\nTo je pravděpodobně příliš málo.\nInstalace může selhat!",
        "config-apc": "Je nainstalováno [http://www.php.net/apc APC]",
        "config-apcu": "Je nainstalováno [http://www.php.net/apcu APCu]",
-       "config-wincache": "Je nainstalována [https://www.iis.net/download/WinCacheForPhp WinCache]",
-       "config-no-cache-apcu": "<strong>Upozornění:</strong> Nebylo nalezeno [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache], ani [http://www.iis.net/download/WinCacheForPhp WinCache].\nKešování objektů bude vypnuto.",
+       "config-wincache": "Je nainstalováno [https://www.iis.net/download/WinCacheForPhp WinCache]",
+       "config-no-cache-apcu": "<strong>Upozornění:</strong> Nebylo nalezeno [http://www.php.net/apcu APCu], \nani [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachování objektů není povoleno.",
        "config-mod-security": "<strong>Upozornění:</strong> váš webový server má zapnuto [https://modsecurity.org/ mod_security]/mod_security2. Mnoho běžných konfigurací bude způsobovat potíže MediaWiki a dalším programům, které umožňují ukládat libovolný obsah.\nPokud je to možné, mělo by se to vypnout. Jinak se v případě, že narazíte na náhodné chyby, podívejte do [https://modsecurity.org/documentation/ dokumentace mod_security] nebo kontaktujte technickou podporu vašeho poskytovatele.",
        "config-diff3-bad": "Nebyl nalezen GNU diff3.",
        "config-git": "Nalezen software pro správu verzí Git: <code>$1</code>.",
        "config-cache-options": "Nastavení cachování objektů:",
        "config-cache-help": "Cachování objektů se používá pro vylepšení rychlosti MediaWiki tím, že se cachují často používaná data.\nStředním až velkým serverům se jeho zapnutí důrazně doporučuje, i menší servery pocítí jeho výhody.",
        "config-cache-none": "Bez cachování (o žádnou funkcionalitu nepřijdete, na větších wiki však může dojít ke zhoršení rychlosti)",
-       "config-cache-accel": "Cachování PHP objektů (APC, APCu, XCache nebo WinCache)",
+       "config-cache-accel": "Cachování PHP objektů (APC, APCu nebo WinCache)",
        "config-cache-memcached": "Použít Memcached (vyžaduje další nastavení a konfiguraci)",
        "config-memcached-servers": "Servery Memcached:",
        "config-memcached-help": "Seznam IP adres, které se mají používat pro Memcached.\nUveďte jednu na řádek spolu s portem. Například:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index b15c7f2..da63fdc 100644 (file)
@@ -2,8 +2,18 @@
        "@metadata": {
                "authors": [
                        "Dferg",
-                       "Seb35"
+                       "Seb35",
+                       "MarcoAurelio"
                ]
        },
-       "mainpagedocfooter": "Consulte usted la [https://meta.wikimedia.org/wiki/Help:Contents/es Guía de usuario] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalizar MediaWiki para su idioma]"
+       "config-localsettings-upgrade": "Se ha encontrado un archivo <code>LocalSettings.php</code>.\nPara actualizar esta instalación, escriba el valor de <code>$wgUpgradeKey</code> en el cuadro de abajo.\nLo encontrará en <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Se ha detectado un archivo <code>LocalSettings.php</code>.\nPara actualizar la instalación, en su lugar ejecute <code>update.php</code>",
+       "config-localsettings-connection-error": "Se ha producido un error al conectar con la base de datos a través de la configuración especificada en <code>LocalSettings.php</code>. Corrija estos ajustes e inténtelo de nuevo.\n\n$1",
+       "config-your-language-help": "Seleccione un idioma para usar durante el proceso de instalación.",
+       "config-page-welcome": "Le damos la bienvenida a MediaWiki.",
+       "config-page-readme": "Léame",
+       "config-help-restart": "¿Desea borrar todos los datos guardados que ha escrito y reiniciar el proceso de instalación?",
+       "config-env-good": "El entorno ha sido comprobado.\nPuede instalar MediaWiki.",
+       "config-env-bad": "El entorno ha sido comprobado.\nNo puede instalar MediaWiki.",
+       "mainpagedocfooter": "Consulte la [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guía] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki a su idioma]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda a combatir el spam en su wiki]"
 }
index c1332b1..1b9a146 100644 (file)
@@ -24,7 +24,7 @@
                        "Pyscowicz"
                ]
        },
-       "config-desc": "MediaWiki-asennin",
+       "config-desc": "Asennin MediaWikiä varten",
        "config-title": "MediaWikin version $1 asennus",
        "config-information": "Tiedot",
        "config-localsettings-upgrade": "<code>LocalSettings.php</code>-tiedosto havaittiin.\nKirjoita muuttujan <code>$wgUpgradeKey</code> arvo alla olevaan kenttään päivittääksesi asennuksen.\nLöydät sen <code>LocalSettings.php</code>-tiedostosta.",
@@ -37,7 +37,7 @@
        "config-session-error": "Istunnon aloittaminen epäonnistui: $1",
        "config-session-expired": "Istuntotietosi näyttävät olevan vanhentuneita.\nIstuntojen elinajaksi on määritelty $1.\nVoit muuttaa tätä asetusta vaihtamalla kohtaa <code>session.gc_maxlifetime</code> php.ini-tiedostossa.\nKäynnistä asennusprosessi uudelleen.",
        "config-no-session": "Istuntosi tiedot menetettiin!\nTarkista php.ini-tiedostosi ja varmista, että <code>session.save_path</code> on asetettu sopivaan kansioon.",
-       "config-your-language": "Asennuksen kieli",
+       "config-your-language": "Kielesi:",
        "config-your-language-help": "Valitse kieli, jota haluat käyttää asennuksen ajan.",
        "config-wiki-language": "Wikin kieli",
        "config-wiki-language-help": "Valitse kieli, jota wikissä tullaan etupäässä käyttämään.",
        "config-no-cli-uploads-check": "<strong>Varoitus:</strong> Tiedostojen lähetyshakemistoa (<code>$1</code>) ei ole tarkistettu haavoittuvuuksien varalta komentoriviasennuksen aikana.",
        "config-brokenlibxml": "Järjestelmässäsi on käytössä PHP:n ja libxml2:n versioyhdistelmä, joka ei toimi kunnolla ja voi aiheuttaa tiedon vahingoittumista MediaWikissä ja muissa web-sovelluksissa.\nPäivitä libxml2 versioon 2.7.3 tai uudempaan ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nAsennus keskeytetty.",
        "config-suhosin-max-value-length": "Suhosin on asennettu ja se rajoittaa GET-parametrin <code>length</code> $1 tavuun.\nMediaWikin ResourceLoader-komponentti pystyy toimimaan tämän kanssa, mutta ohjelmiston suorituskyky heikkenee.\nMikäli mahdollista, aseta muuttuja <code>suhosin.get.max_value_length</code> arvoon 1024 (tai suurempaan) tiedostossa <code>php.ini</code> ja aseta myös <code>$wgResourceLoaderMaxQueryLength</code> samaksi arvoksi tiedostossa <code>LocalSettings.php</code>.",
-       "config-db-type": "Tietokannan tyyppi",
-       "config-db-host": "Tietokantapalvelin",
+       "config-db-type": "Tietokannan tyyppi:",
+       "config-db-host": "Tietokantapalvelin:",
        "config-db-host-help": "Jos tietokantapalvelimesi sijaitsee eri palvelimella, syötä palvelimen nimi tai ip-osoite tähän.\n\nJos käytössäsi on ulkoinen palveluntarjoaja, pitäisi palvelimen nimen löytyä yrityksen ohjesivuilta.\n\nJos asennat MediaWikiä Windows-palvelimelle ja käytät MySQL:ää ei palvelimen nimi \"localhost\" välttämättä toimi. Tässä tapauksessa koita käyttää osoitetta 127.0.0.1.\n\nJos käytät PostgreSQL:ää jätä tämä kenttä tyhjäksi.",
        "config-db-host-oracle": "Tietokannan TNS:",
        "config-db-wiki-settings": "Identifioi tämä wiki",
-       "config-db-name": "Tietokannan nimi",
+       "config-db-name": "Tietokannan nimi:",
        "config-db-name-help": "Valitse wikiäsi kuvaava nimi.\nNimessä ei saa olla välilyöntejä.\n\nMikäli et pysty itse hallitsemaan tietokantojasi, pyydä palveluntarjoajaasi luomaan tietokanta tai tee se palveluntarjoajasi hallintapaneelissa.",
        "config-db-name-oracle": "Tietokannan rakenne:",
        "config-db-install-account": "Asennuksessa käytettävä käyttäjätili",
-       "config-db-username": "Tietokannan käyttäjätunnus",
-       "config-db-password": "Tietokannan salasana",
+       "config-db-username": "Tietokannan käyttäjätunnus:",
+       "config-db-password": "Tietokannan salasana:",
        "config-db-install-username": "Syötä käyttäjänimi jota käytetään muodostettaessa yhteys tietokantaan asennuksen aikana.\nTämä ei ole MediaWiki tilin käyttäjänimi; tämä on tietokannan käyttäjänimi.",
        "config-db-install-password": "Syötä salasana jota käytetään muodostettaessa yhteys tietokantaan asennuksen aikana.\nTämä ei ole MediaWiki tilin salasana; tämä on tietokannan salasana.",
        "config-db-install-help": "Anna käyttäjätunnus ja salasana, joita käytetään asennuksen aikana.",
        "config-mssql-web-auth": "Valitse varmennuksen tyyppi, jota verkkopalvelin käyttää yhdistäessään tietokantapalvelimeen wikin tavallisen toiminnan aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
        "config-mssql-sqlauth": "SQL Server varmennus",
        "config-mssql-windowsauth": "Windows-varmennus",
-       "config-site-name": "Wikin nimi",
+       "config-site-name": "Wikin nimi:",
        "config-site-name-help": "Tämä näkyy selaimen otsikkona ja muissa kohdissa.",
        "config-site-name-blank": "Kirjoita sivuston nimi.",
-       "config-project-namespace": "Projektinimiavaruus",
+       "config-project-namespace": "Projektinimiavaruus:",
        "config-ns-generic": "Projekti",
        "config-ns-site-name": "Sama kuin wikin nimi: $1",
        "config-ns-other": "Muu (määritä)",
        "config-ns-conflict": "Määritelty nimiavaruus \"<nowiki>$1</nowiki>\" on ristiriidassa MediaWikin oletusnimiavaruuksien kanssa.\nSyötä joku muu nimiavaruus.",
        "config-admin-box": "Ylläpitäjän tili",
        "config-admin-name": "Käyttäjänimesi:",
-       "config-admin-password": "Salasana",
-       "config-admin-password-confirm": "Salasana uudelleen",
+       "config-admin-password": "Salasana:",
+       "config-admin-password-confirm": "Salasana uudelleen:",
        "config-admin-help": "Syötä käyttäjänimi tähän, esimerkiksi \"Matti Meikäläinen\".\nTätä nimeä käytetään kirjauduttaessa wikiin.",
        "config-admin-name-blank": "Anna ylläpitäjän käyttäjänimi.",
        "config-admin-name-invalid": "Annettu nimi \"<nowiki>$1</nowiki>\" on virheellinen.\nSyötä toinen nimi.",
        "config-admin-password-blank": "Syötä ylläpitäjän salasana.",
        "config-admin-password-mismatch": "Antamasi salasanat eivät täsmää.",
-       "config-admin-email": "Sähköpostiosoite",
+       "config-admin-email": "Sähköpostiosoite:",
        "config-admin-email-help": "Syötä sähköpostiosoite johon vastaanotetaan viestit muilta wikin käyttäjiltä, nollataan salasana ja ilmoitetaan tarkkailulistalla olevista sivuista. Kenttä voidaan jättää myös tyhjäksi.",
        "config-admin-error-user": "Sisäinen virhe luodessa ylläpitäjää nimellä \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Sisäinen virhe asetettaessa salasanaa ylläpitäjälle \"<nowiki>$1</nowiki>\":\n<pre>$2</pre>",
        "config-upload-enable": "Ota käyttöön tiedostojen lataaminen",
        "config-upload-deleted": "Poistettujen tiedostojen hakemisto:",
        "config-upload-deleted-help": "Valitse hakemisto johon poistetut tiedostot arkistoidaan.\nHakemiston ei tulisi olla käytettävissä internetverkosta.",
-       "config-logo": "Logon URL-osoite",
+       "config-logo": "Logon URL-osoite:",
        "config-logo-help": "MediaWikin oletusulkoasussa on paikka 135x160 pikselin kokoiselle logolle sivupalkin yläpuolella.\nTallenna sopivan kokoinen kuva ja lisää URL tähän.\n\nVoit käyttää muuttujia <code>$wgStylePath</code> tai <code>$wgScriptPath</code>, jos logosi on määritelty suhteessa näihin polkuihin.\n\nJos et halua logoa, jätä tämä kenttä tyhjäksi.",
        "config-instantcommons": "Aktivoi Instant Commons",
        "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] on ominaisuus, joka antaa wikien käyttää kuvia, ääniä ja muuta mediaa [https://commons.wikimedia.org/ Wikimedia Commons] -sivustolta.\nTehdäkseen tämän MediaWiki tarvitsee Internet-yhteyden.\n\nLisätietoja tästä ominaisuudesta, mukaan lukien ohjeet, kuinka sen voi asettaa muille wikeille kuin Wikimedia Commons, löytyy [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos ohjeista].",
        "config-install-keys": "Muodostetaan salausavaimia",
        "config-insecure-keys": "<strong>Varoitus:</strong> Asennuksen aikana {{PLURAL:$2|luotu turva-avain|luodut turva-avaimet}} ($1) {{PLURAL:$2|ei|eivät}} ole täysin {{PLURAL:$2|turvallinen|turvallisia}}. Harkitse {{PLURAL:$2|sen|niiden}} muuttamista manuaalisesti.",
        "config-install-updates": "Estä tarpeettomien päivitysten asennus",
+       "config-install-updates-failed": "<strong>Virhe:</strong> Päivitysavainten lisääminen taulukoihin epäonnistui seuraavalla virheellä: $1",
        "config-install-sysop": "Luodaan ylläpitäjän tiliä",
        "config-install-subscribe-fail": "Liittyminen mediawiki-announce listalle epäonnistui: $1",
        "config-install-subscribe-notpossible": "cURL-ohjelmaa ei ole asennettu eikä <code>allow_url_fopen</code> ole saatavilla.",
        "config-install-mainpage-failed": "Etusivun lisääminen ei onnistunut: $1",
        "config-install-done": "<strong>Onnittelut!</strong>\nOlet asentanut MediaWikin.\n\nAsennusohjelma on luonut <code>LocalSettings.php</code> -tiedoston.\nSiinä on kaikki MediaWikin asetukset.\n\nLataa tiedosto ja laita se MediaWikin asennushakemistoon (sama kuin missä on index.php). Lataamisen olisi pitänyt alkaa automaattisesti.\n\nMikäli latausta ei tarjottu tai keskeytit latauksen, käynnistä se uudestaan tästä linkistä:\n\n$3\n\n<strong>Huom:</strong> Mikäli et nyt lataa tiedostoa, luotu tiedosto ei ole saatavissa myöhemmin, jos poistut asennuksesta lataamatta sitä.\n\nKun olet laittanut tiedoston oikeaan paikkaan, voit <strong>[$2 mennä wikiisi]</strong>.",
        "config-install-done-path": "<strong>Onnittelut!</strong>\nOlet asentanut MediaWikin.\n\nAsennusohjelma on luonut <code>LocalSettings.php</code> -tiedoston.\nSiinä on kaikki MediaWikin asetukset.\n\nLataa tiedosto ja laita se sijaintiin <code>$4</code>. Lataamisen olisi pitänyt alkaa automaattisesti.\n\nMikäli latausta ei tarjottu tai keskeytit latauksen, käynnistä se uudestaan tästä linkistä:\n\n$3\n\n<strong>Huom:</strong> Mikäli et nyt lataa tiedostoa, luotu tiedosto ei ole saatavissa myöhemmin, jos poistut asennuksesta lataamatta sitä.\n\nKun olet laittanut tiedoston oikeaan paikkaan, voit <strong>[$2 mennä wikiisi]</strong>.",
+       "config-install-success": "MediaWiki on asennettu onnistuneesti. Voit nyt vierailla <$1$2> katsellaksesi wikiäsi. Jos sinulla on kysyttävää, \ntutustu usein kysyttyjen kysymysten luetteloon: <https://www.mediawiki.org/wiki/Manual:FAQ> tai käytä yhtä sivulle linkitettyä tukifoorumia.",
        "config-download-localsettings": "Lataa <code>LocalSettings.php</code>",
        "config-help": "ohje",
        "config-help-tooltip": "Klikkaa laajentaaksesi",
index d20b3e7..a7ede0a 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "McDutchie",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Fanjiayi"
                ]
        },
        "config-desc": "Le installator de MediaWiki",
@@ -62,8 +63,8 @@
        "config-apc": "[http://www.php.net/apc APC] es installate",
        "config-apcu": "[http://www.php.net/apcu APCu] es installate",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] es installate",
-       "config-no-cache-apcu": "<strong>Attention:</strong> Impossibile trovar [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLe cache de objectos non es activate.",
-       "config-mod-security": "'''Attention''': [https://modsecurity.org/ mod_security] es active in tu servitor web. Si mal configurate, isto pote causar problemas pro MediaWiki o altere software que permitte al usatores de publicar contento arbitrari.\nConsulta le [https://modsecurity.org/documentation/ documentation de mod_security] o contacta le servicio de adjuta de tu host si tu incontra estranie errores.",
+       "config-no-cache-apcu": "<strong>Attention:</strong> Impossibile trovar [http://www.php.net/apcu APCu] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLe cache de objectos non es activate.",
+       "config-mod-security": "<strong>Attention</strong>: [https://modsecurity.org/ mod_security]/mod_security2 es active in tu servitor web. Multe configurationes commun de isto causa problemas pro MediaWiki o altere software que permitte al usatores de publicar contento arbitrari. Si possibile, isto deberea esser disactivate.\nAlteremente, consulta le [https://modsecurity.org/documentation/ documentation de mod_security] o contacta le servicio de adjuta de tu servitor si tu incontra estranie errores.",
        "config-diff3-bad": "GNU diff3 non trovate.",
        "config-git": "Systema de controlo de version Git trovate: <code>$1</code>",
        "config-git-bad": "Systema de controlo de version Git non trovate.",
        "config-cache-options": "Configuration del cache de objectos:",
        "config-cache-help": "Le cache de objectos es usate pro meliorar le rapiditate de MediaWiki per immagazinar le datos frequentemente usate.\nLe sitos medie o grande es multo incoragiate de activar isto, ma anque le sitos parve percipera le beneficios.",
        "config-cache-none": "Nulle cache (nulle functionalitate es removite, ma le rapiditate pote diminuer in grande sitos wiki)",
-       "config-cache-accel": "Cache de objectos PHP (APC, APCu, XCache o WinCache)",
+       "config-cache-accel": "Cache de objectos PHP (APC, APCu o WinCache)",
        "config-cache-memcached": "Usar Memcached (require additional installation e configuration)",
        "config-memcached-servers": "Servitores Memcached:",
        "config-memcached-help": "Lista de adresses IP a usar pro Memcached.\nDebe specificar un per linea e specificar le porto a usar. Per exemplo:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index 1a8c44a..a9ae2fe 100644 (file)
@@ -63,7 +63,7 @@
        "config-apc": "[http://www.php.net/apc APC] е воспоставен",
        "config-apcu": "[http://www.php.net/apcu APCu] е воспоставен",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] е воспоставен",
-       "config-no-cache-apcu": "<strong>Предупредување:</strong> Не можев да го најдам [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].\nМеѓускладирањето на објекти не е овозможено",
+       "config-no-cache-apcu": "<strong>Предупредување:</strong> Не можев да го најдам [http://www.php.net/apcu APCu] или [http://www.iis.net/download/WinCacheForPhp WinCache].",
        "config-mod-security": "'''Предупредување''': на вашиот опслужувач има овозможено [https://modsecurity.org/ mod_security]. Ако не е поставено како што треба, ова може да предизвика проблеми кај МедијаВики и други програми што им овозможуваат на корисниците да објавуваат произволни содржини.\nПогледнете ја [https://modsecurity.org/documentation/ mod_security документацијата] или обратете се кај домаќинот ако наидете на случајни грешки.",
        "config-diff3-bad": "GNU diff3 не е пронајден.",
        "config-git": "Го пронајдов Git програмот за контрола на верзии: <code>$1</code>.",
        "config-cache-options": "Нагодувања за меѓускладирање на објекти:",
        "config-cache-help": "Меѓускладирањето на објекти се користи за зголемување на брзината на МедијаВики со меѓускладирање на често употребуваните податоци.\nОва многу се препорачува на средни до големи викија, но од тоа ќе имаат полза и малите викија.",
        "config-cache-none": "Без меѓускладирање (не се остранува ниедна функција, но може да влијае на брзината кај поголеми викија)",
-       "config-cache-accel": "Меѓускладирање на PHP-објекти (APC, APCu, XCache или WinCache)",
+       "config-cache-accel": "Меѓускладирање на PHP-објекти (APC, APCu или WinCache)",
        "config-cache-memcached": "Користи Memcached (бара дополнително поставување и нагодување)",
        "config-memcached-servers": "Memcached-опслужувачи:",
        "config-memcached-help": "Список на IP-адреси за употреба во Memcached.\nТреба да се наведе по една во секој ред, како и портата што ќе се користи. На пример:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index b3aa137..953b672 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Ianbu",
-                       "唐吉訶德的侍從"
+                       "唐吉訶德的侍從",
+                       "Yoxem"
                ]
        },
        "config-desc": "MediaWiki的安裝程式",
@@ -13,7 +14,7 @@
        "config-localsettings-key": "Seng-kip--ê bi̍t-bé:",
        "config-localsettings-badkey": "Lí phah--ê bi̍t-bé bô chèng-khak.",
        "config-upgrade-key-missing": "已經有一个MediaWiki矣。若要升級,請共下面這逝加去<code>LocalSettings.php</code>的下跤:\n\n$1",
-       "config-localsettings-incomplete": "這馬的<code>LocalSettings.php</code>可能無齊全,因為無設變量$1。請佇<code>LocalSettings.php</code>設彼个變量,並且揤「{{int:Config-continue}}」。",
+       "config-localsettings-incomplete": "Chit-má--ê <code>LocalSettings.php</code> khó-lêng bô chiâu-chn̂g, in-ūi bô siat piān-liōng $1. Chhiáⁿ tī <code>LocalSettings.php</code> siat hit-ê piān-liōng, pēng-chhiá chhi̍h \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "An error was encountered when connecting to the database 用<code>LocalSettings.php</code>的設定去連接資料庫的時陣有一个錯誤發生,請改遮的設定了,才閣試。\n\n$1",
        "config-session-error": "連線開始了的錯誤:$1",
        "config-session-expired": "你連線資料已經過時矣,連線的使用期限是設做$1。你會使改共php.ini的<code>session.gc_maxlifetime</code>改較長,並且重新安裝動作。",
        "config-help-restart": "你敢欲共你拍的佮保存的資料攏清掉,並且重開始安裝的動作?",
        "config-restart": "是,重來",
        "config-welcome": "=== 環境檢測 ===\n這馬欲做基本的檢測,看環境是毋是適合裝 MediaWiki。\n若你愛有支援,才裝會起來,請共遮的資訊記起來。",
-       "config-copyright": "=== 版權聲明佮授權條款 ===\n\n$1\n\n本程式是自由軟體;你會當照自由軟體基金會所發表的 GNU 通用公共授權條款規定,共本程式重新發佈抑是修改;無論你是照本授權條款的第二版抑第二版以後的任何版本(你會當家己選) 。\n\n本程式發佈的目的是希望會當提供幫助,但是 <strong>無負任何擔保責任</strong>;抑無表示講對 <strong>販賣性</strong> 抑 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n你應該已隨本程式收著 <doclink href=\"Copying\">GNU 通用公共授權條款的副本</doclink>;若無,請寫批通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [https://www.gnu.org/copyleft/gpl.html 線頂看]。",
+       "config-copyright": "=== Pán-koân seng-bêng kap siū-koân tiâu-khoán ===\n\n$1\n\nPún têng-sek sī chū-iû nńg-thé; lí thang chiàu Chū-iû Nńg-thé Ki-kim-hoē só͘ hoat-piáu--ê GNU Thong-iōng Kong-kiōng Siū-koân Tiâu-khoán kui-tēng, kā pún têng-sek têng hoat-pò͘ iah-sī siu-kái; bô-lūn lí sī chiàu pún siū-koân tiâu-khoán--ê tē 2 pán iah koh khah sin--ê pán-pún (lí thang ka-kī kéng).\n\nPún têng-sek hoat-pò͘--ê bo̍k-tek sī ǹg-bāng ē-tàng pang-chān, m̄-koh <strong>bô hù jīm-hô tam-pó͘ chek-jīm</strong>; iah bô piáu-sī kóng tùi <strong>hoàn-bē-sèng</strong> iah <strong>te̍k-tēng iōng-tô͘--ê sek-iōng-sèng</strong>--ê chêng-hêng tam-pó͘. Siông-sè chhiáⁿ chham-khó GNU Thong-iōng Kong-kiōng Siū-koân.\n\nLí èng-kai tùi pún têng-sek siu-tio̍h <doclink href=\"Copying\">GNU Thong-iōng Kong-kiōng Siū-koân--ê Hù-pún</doclink>; nā-bô, chhiáⁿ siá-phoe thong-tī Chū-iû Nńg-thé KI-kim-hoē, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, iah-sī [https://www.gnu.org/copyleft/gpl.html soàⁿ-téng khoàⁿ].",
        "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 頭頁]\n* [www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理者指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hant 四常問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
        "config-env-good": "環境檢查已完成。\n你會當安裝 MediaWiki。",
-       "config-env-bad": "環境檢查已完成。\n你無法度安裝 MediaWiki。",
+       "config-env-bad": "Khoân-kèng kiám-cha oân-sêng--ah.\nLí bô-hoat-tō͘ an-chng MediaWiki.",
        "config-env-php": "PHP $1 已經安裝。",
        "config-unicode-using-intl": "用 [https://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。",
-       "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法度用 [https://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,所以退回用純 PHP 實作的正規化程式,這種方式處理速度較慢。\n\n若你的網站瀏覽人數誠濟,你應該先看 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
+       "config-unicode-pure-php-warning": "<strong>Kéng-kò:</strong> Bô-hoat-tō͘ iōng [https://pecl.php.net/intl intl PECL extension] chhú-lí Unicode chèng-kui-hoà, só͘-í thè kàu iōng sûn PHP si̍t-chok--ê chèng-kui-hoà têng-sek, chit khoán hong-sek chhú-lí sok-tō͘ khah bān. Nā lí--ê bāng-chām liú-lám--ê lâng chiâⁿ chē, lí èng-kai ài khoàⁿ [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode chèng-kui-hoà].",
        "config-unicode-update-warning": "<strong>警告</strong>:這馬安裝的 Unicode 正規化包裝程式用舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若你需要用 Unicode,你應該先進行 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。",
        "config-no-db": "揣無適合的資料庫驅動程式!你需要安裝 PHP 資料庫驅動程式。\n這馬支援下跤類型的資料庫: $1 。\n\n若你是家己編譯 PHP,你需要重新設定並且開資料庫客戶端,譬如:用 <code>./configure --with-mysqli</code> 指令參數。\n如你是用 Debian 或 Ubuntu 的套件安裝,你著需要閣另外安裝,例:<code>php5-mysql</code> 套件。",
-       "config-outdated-sqlite": "<strong>警告:</strong>你已經安裝 SQLite $1,毋閣伊的版本比會當裝的版本 $2閣較舊。所以你無法度用 SQLite。",
-       "config-no-fts3": "<strong>警告:</strong> SQLite 佇編譯的時陣無包括 [//sqlite.org/fts3.html FTS3 模組],後台搜揣功能就會無法度用。",
+       "config-outdated-sqlite": "<strong>Kéng-kò:</strong> Lí í-keng an-chng SQLite $1, m̄-koh i--ê pán-pún pí thang-chng--ê pán-pún $2 khah kū. Só͘-í lí bô-hoat-tō͘ ēng SQLite.",
+       "config-no-fts3": "<strong>Kéng-kò: </strong> SQLite tī pian-e̍k--ê sî-chūn bô pau-koat  [//sqlite.org/fts3.html FTS3 module], āu-tâi chhiau-chhoē kong-lêng tiō ē bô-hoat-tō͘ iōng.",
        "mainpagetext": "'''MediaWiki已經裝好矣。'''",
        "mainpagedocfooter": "請查看[https://meta.wikimedia.org/wiki/Help:Contents 用者說明書]的資料通使用wiki 軟體\n\n== 入門 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 配置的設定]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki時常問答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]"
 }
index b789480..276d8a9 100644 (file)
@@ -68,7 +68,7 @@
        "config-apc": "[http://www.php.net/apc APC] er installert",
        "config-apcu": "[http://www.php.net/apcu APCu] er installert",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] er installert",
-       "config-no-cache-apcu": "<strong>Advarsel:</strong> Kunne ikke finne [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekthurtiglagring er ikke aktivert.",
+       "config-no-cache-apcu": "<strong>Advarsel:</strong> Kunne ikke finne [http://www.php.net/apcu APCu] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekthurtiglagring er ikke aktivert.",
        "config-mod-security": "'''Advarsel''': Din web-tjener har [https://modsecurity.org/ mod_security] påslått. Hvis denne er feilinnstilt, kan det gi problemer for MediaWiki eller annen programvare som tillater brukere å poste vilkårlig innhold.\nSjekk [https://modsecurity.org/documentation/ mod_security-dokumentasjonen] eller ta kontakt med din nettleverandør hvis du opplever tilfeldige feil.",
        "config-diff3-bad": "GNU diff3 ikke funnet.",
        "config-git": "Har funnet Git version control software: <code>$1</code>.",
        "config-cache-options": "Innstillinger for objekt-mellomlagring:",
        "config-cache-help": "Objekt-mellomlagring brukes for å forbedre hastigheten for MediaWiki. Ofte forekommende data lagres for gjenbruk.\nMiddels til store nettsteder bør absolutt aktivisere mellomlagring, med også små nettsteder kan ha nytte av dette.",
        "config-cache-none": "Ingen mellomlagring (ingen funksjonalitet mistes, men hastigheten kan bli dårlig for store wikier-nettsteder)",
-       "config-cache-accel": "Mellomlagring av PHP-objekter (APC, APCu, XCache eller WinCache)",
+       "config-cache-accel": "Mellomlagring av PHP-objekter (APCu eller WinCache)",
        "config-cache-memcached": "Bruk Memcached (krever tilleggsoppsett og -konfigurering)",
        "config-memcached-servers": "Memcached-servere:",
        "config-memcached-help": "Liste av IP-adresser for bruk fra Memcached.\nDet bør angis en per linje sammen med porten som brukes. For eksempel:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index cfe01be..ba766e1 100644 (file)
@@ -22,7 +22,8 @@
                        "The Polish",
                        "Macofe",
                        "Sethakill",
-                       "Peter Bowman"
+                       "Peter Bowman",
+                       "Ankam"
                ]
        },
        "config-desc": "Instalator MediaWiki",
@@ -81,7 +82,7 @@
        "config-apc": "[Http://www.php.net/apc APC] jest zainstalowany",
        "config-apcu": "[http://www.php.net/apcu APCu] jest zainstalowany",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] jest zainstalowany",
-       "config-no-cache-apcu": "<strong>Ostrzeżenie:</strong> Nie można znaleźć [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] lub [http://www.iis.net/download/WinCacheForPhp WinCache].\nPamięć podręczna obiektów nie zostanie włączona.",
+       "config-no-cache-apcu": "<strong>Ostrzeżenie:</strong> Nie można było znaleźć [http://www.php.net/apcu APCu] ani [http://www.iis.net/download/WinCacheForPhp WinCache].\nPamięć podręczna obiektów nie została włączona.",
        "config-mod-security": "''' Ostrzeżenie ''': Serwer sieci web ma włączone [https://modsecurity.org/ mod_security]. Jeśli jest niepoprawnie skonfigurowane, może być przyczyną problemów MediaWiki lub innego oprogramowania, które pozwala użytkownikom na wysyłanie dowolnej zawartości.\nSprawdź w [https://modsecurity.org/documentation/ dokumentacji mod_security] lub skontaktuj się z obsługa hosta, jeśli wystąpią losowe błędy.",
        "config-diff3-bad": "Nie znaleziono GNU diff3.",
        "config-git": "Znaleziono oprogramowanie kontroli wersji Git: <code>$1</code>.",
        "config-cache-options": "Ustawienia buforowania obiektów:",
        "config-cache-help": "Buforowanie obiektów jest używane do przyspieszenia MediaWiki przez trzymanie w pamięci podręcznej często używanych danych.\nŚrednie oraz duże witryny są wysoce zachęcane by je włączyć, ale małe witryny również dostrzegą korzyści.",
        "config-cache-none": "Brak buforowania (wszystkie funkcje będą działać, ale mogą wystąpić kłopoty z wydajnością na dużych witrynach wiki)",
-       "config-cache-accel": "Buforowania obiektów PHP (APC, APCu, XCache lub WinCache)",
+       "config-cache-accel": "Buforowania obiektów PHP (APC, APCu lub WinCache)",
        "config-cache-memcached": "Użyj Memcached (wymaga dodatkowej instalacji i konfiguracji)",
        "config-memcached-servers": "Serwery Memcached:",
        "config-memcached-help": "Lista adresów IP do wykorzystania przez Memcached.\nAdresy powinny być umieszczane po jednym w linii i określać również wykorzystywany port. Na przykład:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index 7eb113c..1609492 100644 (file)
@@ -79,7 +79,7 @@
        "config-apc": "[http://www.php.net/apc APC] instalada",
        "config-apcu": "[http://www.php.net/apcu APCu] instalado",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] instalada",
-       "config-no-cache-apcu": "<strong>Aviso:</strong> Não foram encontrados o [http://www.php.net/apcu APCu], ou o [http://www.iis.net/download/WinCacheForPhp WinCache].\nA cache de objetos não está ativa.",
+       "config-no-cache-apcu": "<strong>Aviso:</strong> Não foi encontrado o [http://www.php.net/apcu APCu] nem o [http://www.iis.net/download/WinCacheForPhp WinCache].\nA cache de objetos não está ativa.",
        "config-mod-security": "<strong>Aviso:</strong> O seu servidor de Internet tem o [https://modsecurity.org/ mod_security]/mod_security2 ativado. Muitas das suas configurações normais podem causar problemas ao MediaWiki e a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.\nSe possível, isto deve ser desativado. Se não, consulte a [https://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
        "config-diff3-bad": "O GNU diff3 não foi encontrado.",
        "config-git": "Foi encontrado o software de controlo de versões Git: <code>$1</code>.",
        "config-cache-options": "Configuração da cache de objetos:",
        "config-cache-help": "A cache de objetos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.\nSítios de tamanho médio ou grande são altamente encorajados a ativar esta funcionalidade e os sítios pequenos também terão alguns benefícios em fazê-lo.",
        "config-cache-none": "Sem cache (não é removida nenhuma funcionalidade, mas a velocidade de operação pode ser afectada nas wikis grandes)",
-       "config-cache-accel": "Cache de objetos do PHP (APC, APCu, ou WinCache)",
+       "config-cache-accel": "Cache de objetos do PHP (APC, APCu ou WinCache)",
        "config-cache-memcached": "Usar Memcached (requer instalação e configurações adicionais)",
        "config-memcached-servers": "Servidores Memcached:",
        "config-memcached-help": "Lista de endereços IP que serão usados para o Memcached.\nDeve-se colocar um por linha e indicar a porta a utilizar. Por exemplo:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index 74b8ac1..0ca73d3 100644 (file)
@@ -68,7 +68,7 @@
        "config-apc": "[http://www.php.net/apc APC] är installerat",
        "config-apcu": "[http://www.php.net/apcu APCu] är installerat",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] är installerat",
-       "config-no-cache-apcu": "'''Varning:''' Kunde inte hitta [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.",
+       "config-no-cache-apcu": "<strong>Varning:</strong> Kunde inte hitta [http://www.php.net/apcu APCu] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.",
        "config-mod-security": "'''Varning:''' Din webbserver har [https://modsecurity.org/ mod_security] aktiverat. Om felaktigt konfigurerat kan den skapa problem för MediaWiki eller annan programvara som tillåter användaren att posta godtyckligt innehåll.\nTitta på [https://modsecurity.org/documentation/ mod_security-dokumentationen] eller kontakta din värd om du påträffar slumpmässiga fel.",
        "config-diff3-bad": "GNU diff3 hittades inte.",
        "config-git": "Hittade Git-mjukvara för versionskontroll: <code>$1</code>.",
        "config-cache-options": "Inställningar för cachelagring av objekt:",
        "config-cache-help": "Cachelagring av objekt används för att förbättra hastigheten på MediaWiki genom att cachelagra data som används ofta.\nMedelstora till stora webbplatser är starkt uppmuntrade att aktivera detta, och små webbplatser kommer även att se fördelar.",
        "config-cache-none": "Ingen cachelagring (ingen funktionalitet tas bort, men hastighet kan påverkas på större wiki-webbplatser)",
-       "config-cache-accel": "Cachelagring av PHP-objekt (APC, APCu, XCache eller WinCache)",
+       "config-cache-accel": "Cachelagring av PHP-objekt (APC, APCu eller WinCache)",
        "config-cache-memcached": "Använda Memcached (kräver ytterligare inställningar och konfiguration)",
        "config-memcached-servers": "Memcached-servrar:",
        "config-memcached-help": "Lista över IP-adresser som ska användas för Memcached.\nBör ange en per rad och specificera den port som ska användas. Till exempel:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index a92ae96..d97e4f9 100644 (file)
@@ -76,10 +76,9 @@ class RecentChangesUpdateJob extends Job {
                $lockKey = wfWikiID() . ':recentchanges-prune';
 
                $dbw = wfGetDB( DB_MASTER );
-               if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
-                       || !$dbw->lock( $lockKey, __METHOD__, 1 )
-               ) {
-                       return; // already in progress
+               if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) {
+                       // already in progress
+                       return;
                }
 
                $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
@@ -138,7 +137,7 @@ class RecentChangesUpdateJob extends Job {
                                $dbw->setSessionOptions( [ 'connTimeout' => 900 ] );
 
                                $lockKey = wfWikiID() . '-activeusers';
-                               if ( !$dbw->lockIsFree( $lockKey, __METHOD__ ) || !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+                               if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) {
                                        // Exclusive update (avoids duplicate entries)… it's usually fine to just drop out here,
                                        // if the Job is already running.
                                        return;
diff --git a/includes/jobqueue/jobs/UserGroupExpiryJob.php b/includes/jobqueue/jobs/UserGroupExpiryJob.php
new file mode 100644 (file)
index 0000000..0945e58
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Job that purges expired user group memberships.
+ *
+ * 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 3 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
+ * @ingroup JobQueue
+ */
+
+class UserGroupExpiryJob extends Job {
+       public function __construct( $params = false ) {
+               parent::__construct( 'userGroupExpiry', Title::newMainPage(), $params );
+               $this->removeDuplicates = true;
+       }
+
+       /**
+        * Run the job
+        * @return bool Success
+        */
+       public function run() {
+               UserGroupMembership::purgeExpired();
+
+               return true;
+       }
+}
index 859d58b..474c564 100644 (file)
@@ -94,9 +94,9 @@ class CryptRand {
                $files[] = dirname( __DIR__ );
 
                foreach ( $files as $file ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $stat = stat( $file );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $stat ) {
                                // stat() duplicates data into numeric and string keys so kill off all the numeric ones
                                foreach ( $stat as $k => $v ) {
@@ -310,9 +310,9 @@ class CryptRand {
                        }
                        // /dev/urandom is generally considered the best possible commonly
                        // available random source, and is available on most *nix systems.
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $urandom = fopen( "/dev/urandom", "rb" );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
 
                        // Attempt to read all our random data from urandom
                        // php's fread always does buffered reads based on the stream's chunk_size
index a6fd11a..9470413 100644 (file)
@@ -22,6 +22,7 @@
 
 /**
  * @since 1.25
+ * @deprecated since 1.31, use Message::listParam() instead
  */
 class DeferredStringifier {
        /** @var callable Callback used for result string generation */
index dba5a1c..06b263a 100644 (file)
@@ -378,9 +378,9 @@ abstract class FileBackendStore extends FileBackend {
                unset( $params['latest'] ); // sanity
 
                // Check that the specified temp file is valid...
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $ok = ( is_file( $tmpPath ) && filesize( $tmpPath ) == 0 );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$ok ) { // not present or not empty
                        $status->fatal( 'backend-fail-opentemp', $tmpPath );
 
@@ -696,9 +696,9 @@ abstract class FileBackendStore extends FileBackend {
        protected function doGetFileContentsMulti( array $params ) {
                $contents = [];
                foreach ( $this->doGetLocalReferenceMulti( $params ) as $path => $fsFile ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $contents[$path] = $fsFile ? file_get_contents( $fsFile->getPath() ) : false;
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
 
                return $contents;
index 9730acb..9f8959c 100644 (file)
@@ -84,9 +84,9 @@ class HTTPFileStreamer {
                                is_int( $header ) ? HttpStatus::header( $header ) : header( $header );
                        };
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $info = stat( $this->path );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !is_array( $info ) ) {
                        if ( $sendErrors ) {
index 0341a2a..548c85c 100644 (file)
@@ -70,9 +70,9 @@ class MemoryFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $data = file_get_contents( $params['src'] );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $data === false ) { // source doesn't exist?
                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
 
index e606162..bce8334 100644 (file)
@@ -335,9 +335,9 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $sha1Hash = sha1_file( $params['src'] );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $sha1Hash === false ) { // source doesn't exist?
                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
 
index bba762f..69ae47f 100644 (file)
@@ -77,9 +77,9 @@ class StoreFileOp extends FileOp {
        }
 
        protected function getSourceSha1Base36() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $hash = sha1_file( $this->params['src'] );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $hash !== false ) {
                        $hash = Wikimedia\base_convert( $hash, 16, 36, 31 );
                }
index dacad1c..553c9aa 100644 (file)
@@ -75,9 +75,9 @@ class FSFile {
         * @return string|bool TS_MW timestamp or false on failure
         */
        public function getTimestamp() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $timestamp = filemtime( $this->path );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $timestamp !== false ) {
                        $timestamp = wfTimestamp( TS_MW, $timestamp );
                }
@@ -168,9 +168,9 @@ class FSFile {
                        return $this->sha1Base36;
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $this->sha1Base36 = sha1_file( $this->path );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $this->sha1Base36 !== false ) {
                        $this->sha1Base36 = Wikimedia\base_convert( $this->sha1Base36, 16, 36, 31 );
index fed6812..00d2028 100644 (file)
@@ -62,9 +62,9 @@ class TempFSFile extends FSFile {
                                $tmpDirectory = self::getUsableTempDirectory();
                        }
                        $path = wfTempDir() . '/' . $prefix . $hex . $ext;
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $newFileHandle = fopen( $path, 'x' );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $newFileHandle ) {
                                fclose( $newFileHandle );
                                $tmpFile = new self( $path );
@@ -119,9 +119,9 @@ class TempFSFile extends FSFile {
         */
        public function purge() {
                $this->canDelete = false; // done
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $ok = unlink( $this->path );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                unset( self::$pathsCollect[$this->path] );
 
@@ -179,9 +179,9 @@ class TempFSFile extends FSFile {
         */
        public static function purgeAllOnShutdown() {
                foreach ( self::$pathsCollect as $path ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        unlink( $path );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
        }
 
index 7f33a0a..f2624e7 100644 (file)
@@ -122,13 +122,13 @@ class FSLockManager extends LockManager {
                        if ( isset( $this->handles[$path] ) ) {
                                $handle = $this->handles[$path];
                        } else {
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                $handle = fopen( $this->getLockPath( $path ), 'a+' );
                                if ( !$handle ) { // lock dir missing?
                                        mkdir( $this->lockDir, 0777, true );
                                        $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again
                                }
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
                        }
                        if ( $handle ) {
                                // Either a shared or exclusive lock
index 4d860bb..8d842cb 100644 (file)
@@ -643,9 +643,9 @@ EOT;
         */
        private function doGuessMimeType( $file, $ext ) {
                // Read a chunk of the file
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $f = fopen( $file, 'rb' );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$f ) {
                        return 'unknown/unknown';
@@ -833,9 +833,9 @@ EOT;
                        }
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $gis = getimagesize( $file );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $gis && isset( $gis['mime'] ) ) {
                        $mime = $gis['mime'];
index 0e09f16..7bab20a 100644 (file)
@@ -30,6 +30,7 @@
  */
 interface IExpiringStore {
        // Constants for TTL values, in seconds
+       const TTL_SECOND = 1;
        const TTL_MINUTE = 60;
        const TTL_HOUR = 3600;
        const TTL_DAY = 86400; // 24 * 3600
index b937736..59131b9 100644 (file)
@@ -788,13 +788,13 @@ class MemcachedClient {
                $timeout = $this->_connect_timeout;
                $errno = $errstr = null;
                for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        if ( $this->_persistent == 1 ) {
                                $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
                        } else {
                                $sock = fsockopen( $ip, $port, $errno, $errstr, $timeout );
                        }
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
                if ( !$sock ) {
                        $this->_error_log( "Error connecting to $host: $errstr" );
index eec766b..bcd95c1 100644 (file)
@@ -1536,7 +1536,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        }
 
        /**
-        * Locally set a key to expire soon if it is stale based on $purgeTimestamp
+        * Set a key to soon expire in the local cluster if it pre-dates $purgeTimestamp
         *
         * This sets stale keys' time-to-live at HOLDOFF_TTL seconds, which both avoids
         * broadcasting in mcrouter setups and also avoids races with new tombstones.
@@ -1568,7 +1568,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        }
 
        /**
-        * Locally set a "check" key to expire soon if it is stale based on $purgeTimestamp
+        * Set a "check" key to soon expire in the local cluster if it pre-dates $purgeTimestamp
         *
         * @param string $key Cache key
         * @param int $purgeTimestamp UNIX timestamp of purge
@@ -1581,7 +1581,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                if ( $purge && $purge[self::FLD_TIME] < $purgeTimestamp ) {
                        $isStale = true;
                        $this->logger->warning( "Reaping stale check key '$key'." );
-                       $ok = $this->cache->changeTTL( self::TIME_KEY_PREFIX . $key, 1 );
+                       $ok = $this->cache->changeTTL( self::TIME_KEY_PREFIX . $key, self::TTL_SECOND );
                        if ( !$ok ) {
                                $this->logger->error( "Could not complete reap of check key '$key'." );
                        }
@@ -1824,7 +1824,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                'cmd' => 'set',
                                'key' => $key,
                                'val' => 'PURGED:$UNIXTIME$:' . (int)$holdoff,
-                               'ttl' => max( $ttl, 1 ),
+                               'ttl' => max( $ttl, self::TTL_SECOND ),
                                'sbt' => true, // substitute $UNIXTIME$ with actual microtime
                        ] );
 
index f3877fb..572a798 100644 (file)
@@ -29,7 +29,7 @@ use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
 use Wikimedia\Timestamp\ConvertibleTimestamp;
-use MediaWiki;
+use Wikimedia;
 use BagOStuff;
 use HashBagOStuff;
 use InvalidArgumentException;
@@ -59,19 +59,19 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        const SMALL_WRITE_ROWS = 100;
 
        /** @var string SQL query */
-       protected $mLastQuery = '';
+       protected $lastQuery = '';
        /** @var float|bool UNIX timestamp of last write query */
-       protected $mLastWriteTime = false;
+       protected $lastWriteTime = false;
        /** @var string|bool */
-       protected $mPHPError = false;
+       protected $phpError = false;
        /** @var string */
-       protected $mServer;
+       protected $server;
        /** @var string */
-       protected $mUser;
+       protected $user;
        /** @var string */
-       protected $mPassword;
+       protected $password;
        /** @var string */
-       protected $mDBname;
+       protected $dbName;
        /** @var array[] $aliases Map of (table => (dbname, schema, prefix) map) */
        protected $tableAliases = [];
        /** @var bool Whether this PHP instance is for a CLI script */
@@ -89,35 +89,33 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        protected $errorLogger;
 
        /** @var resource|null Database connection */
-       protected $mConn = null;
+       protected $conn = null;
        /** @var bool */
-       protected $mOpened = false;
+       protected $opened = false;
 
        /** @var array[] List of (callable, method name) */
-       protected $mTrxIdleCallbacks = [];
+       protected $trxIdleCallbacks = [];
        /** @var array[] List of (callable, method name) */
-       protected $mTrxPreCommitCallbacks = [];
+       protected $trxPreCommitCallbacks = [];
        /** @var array[] List of (callable, method name) */
-       protected $mTrxEndCallbacks = [];
+       protected $trxEndCallbacks = [];
        /** @var callable[] Map of (name => callable) */
-       protected $mTrxRecurringCallbacks = [];
+       protected $trxRecurringCallbacks = [];
        /** @var bool Whether to suppress triggering of transaction end callbacks */
-       protected $mTrxEndCallbacksSuppressed = false;
+       protected $trxEndCallbacksSuppressed = false;
 
        /** @var string */
-       protected $mTablePrefix = '';
+       protected $tablePrefix = '';
        /** @var string */
-       protected $mSchema = '';
+       protected $schema = '';
        /** @var int */
-       protected $mFlags;
+       protected $flags;
        /** @var array */
-       protected $mLBInfo = [];
-       /** @var bool|null */
-       protected $mDefaultBigSelects = null;
+       protected $lbInfo = [];
        /** @var array|bool */
-       protected $mSchemaVars = false;
+       protected $schemaVars = false;
        /** @var array */
-       protected $mSessionVars = [];
+       protected $sessionVars = [];
        /** @var array|null */
        protected $preparedArgs;
        /** @var string|bool|null Stashed value of html_errors INI setting */
@@ -135,94 +133,94 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         *
         * @var int
         */
-       protected $mTrxLevel = 0;
+       protected $trxLevel = 0;
        /**
         * Either a short hexidecimal string if a transaction is active or ""
         *
         * @var string
-        * @see Database::mTrxLevel
+        * @see Database::trxLevel
         */
-       protected $mTrxShortId = '';
+       protected $trxShortId = '';
        /**
         * The UNIX time that the transaction started. Callers can assume that if
         * snapshot isolation is used, then the data is *at least* up to date to that
         * point (possibly more up-to-date since the first SELECT defines the snapshot).
         *
         * @var float|null
-        * @see Database::mTrxLevel
+        * @see Database::trxLevel
         */
-       private $mTrxTimestamp = null;
+       private $trxTimestamp = null;
        /** @var float Lag estimate at the time of BEGIN */
-       private $mTrxReplicaLag = null;
+       private $trxReplicaLag = null;
        /**
         * Remembers the function name given for starting the most recent transaction via begin().
         * Used to provide additional context for error reporting.
         *
         * @var string
-        * @see Database::mTrxLevel
+        * @see Database::trxLevel
         */
-       private $mTrxFname = null;
+       private $trxFname = null;
        /**
         * Record if possible write queries were done in the last transaction started
         *
         * @var bool
-        * @see Database::mTrxLevel
+        * @see Database::trxLevel
         */
-       private $mTrxDoneWrites = false;
+       private $trxDoneWrites = false;
        /**
         * Record if the current transaction was started implicitly due to DBO_TRX being set.
         *
         * @var bool
-        * @see Database::mTrxLevel
+        * @see Database::trxLevel
         */
-       private $mTrxAutomatic = false;
+       private $trxAutomatic = false;
        /**
         * Array of levels of atomicity within transactions
         *
         * @var array
         */
-       private $mTrxAtomicLevels = [];
+       private $trxAtomicLevels = [];
        /**
         * Record if the current transaction was started implicitly by Database::startAtomic
         *
         * @var bool
         */
-       private $mTrxAutomaticAtomic = false;
+       private $trxAutomaticAtomic = false;
        /**
         * Track the write query callers of the current transaction
         *
         * @var string[]
         */
-       private $mTrxWriteCallers = [];
+       private $trxWriteCallers = [];
        /**
         * @var float Seconds spent in write queries for the current transaction
         */
-       private $mTrxWriteDuration = 0.0;
+       private $trxWriteDuration = 0.0;
        /**
         * @var int Number of write queries for the current transaction
         */
-       private $mTrxWriteQueryCount = 0;
+       private $trxWriteQueryCount = 0;
        /**
         * @var int Number of rows affected by write queries for the current transaction
         */
-       private $mTrxWriteAffectedRows = 0;
+       private $trxWriteAffectedRows = 0;
        /**
-        * @var float Like mTrxWriteQueryCount but excludes lock-bound, easy to replicate, queries
+        * @var float Like trxWriteQueryCount but excludes lock-bound, easy to replicate, queries
         */
-       private $mTrxWriteAdjDuration = 0.0;
+       private $trxWriteAdjDuration = 0.0;
        /**
-        * @var int Number of write queries counted in mTrxWriteAdjDuration
+        * @var int Number of write queries counted in trxWriteAdjDuration
         */
-       private $mTrxWriteAdjQueryCount = 0;
+       private $trxWriteAdjQueryCount = 0;
        /**
         * @var float RTT time estimate
         */
-       private $mRTTEstimate = 0.0;
+       private $rttEstimate = 0.0;
 
        /** @var array Map of (name => 1) for locks obtained via lock() */
-       private $mNamedLocksHeld = [];
+       private $namedLocksHeld = [];
        /** @var array Map of (table name => 1) for TEMPORARY tables */
-       protected $mSessionTempTables = [];
+       protected $sessionTempTables = [];
 
        /** @var IDatabase|null Lazy handle to the master DB this server replicates from */
        private $lazyMasterHandle;
@@ -230,7 +228,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        /** @var float UNIX timestamp */
        protected $lastPing = 0.0;
 
-       /** @var int[] Prior mFlags values */
+       /** @var int[] Prior flags member variable values */
        private $priorFlags = [];
 
        /** @var object|string Class name or object With profileIn/profileOut methods */
@@ -252,23 +250,23 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $password = $params['password'];
                $dbName = $params['dbname'];
 
-               $this->mSchema = $params['schema'];
-               $this->mTablePrefix = $params['tablePrefix'];
+               $this->schema = $params['schema'];
+               $this->tablePrefix = $params['tablePrefix'];
 
                $this->cliMode = $params['cliMode'];
                // Agent name is added to SQL queries in a comment, so make sure it can't break out
                $this->agent = str_replace( '/', '-', $params['agent'] );
 
-               $this->mFlags = $params['flags'];
-               if ( $this->mFlags & self::DBO_DEFAULT ) {
+               $this->flags = $params['flags'];
+               if ( $this->flags & self::DBO_DEFAULT ) {
                        if ( $this->cliMode ) {
-                               $this->mFlags &= ~self::DBO_TRX;
+                               $this->flags &= ~self::DBO_TRX;
                        } else {
-                               $this->mFlags |= self::DBO_TRX;
+                               $this->flags |= self::DBO_TRX;
                        }
                }
 
-               $this->mSessionVars = $params['variables'];
+               $this->sessionVars = $params['variables'];
 
                $this->srvCache = isset( $params['srvCache'] )
                        ? $params['srvCache']
@@ -290,9 +288,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                // Set the domain object after open() sets the relevant fields
-               if ( $this->mDBname != '' ) {
+               if ( $this->dbName != '' ) {
                        // Domains with server scope but a table prefix are not used by IDatabase classes
-                       $this->currentDomain = new DatabaseDomain( $this->mDBname, null, $this->mTablePrefix );
+                       $this->currentDomain = new DatabaseDomain( $this->dbName, null, $this->tablePrefix );
                }
        }
 
@@ -464,9 +462,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                if ( $ignoreErrors !== null ) {
                        // setFlag()/clearFlag() do not allow DBO_IGNORE changes for sanity
                        if ( $ignoreErrors ) {
-                               $this->mFlags |= self::DBO_IGNORE;
+                               $this->flags |= self::DBO_IGNORE;
                        } else {
-                               $this->mFlags &= ~self::DBO_IGNORE;
+                               $this->flags &= ~self::DBO_IGNORE;
                        }
                }
 
@@ -474,19 +472,19 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function trxLevel() {
-               return $this->mTrxLevel;
+               return $this->trxLevel;
        }
 
        public function trxTimestamp() {
-               return $this->mTrxLevel ? $this->mTrxTimestamp : null;
+               return $this->trxLevel ? $this->trxTimestamp : null;
        }
 
        public function tablePrefix( $prefix = null ) {
-               $old = $this->mTablePrefix;
+               $old = $this->tablePrefix;
                if ( $prefix !== null ) {
-                       $this->mTablePrefix = $prefix;
-                       $this->currentDomain = ( $this->mDBname != '' )
-                               ? new DatabaseDomain( $this->mDBname, null, $this->mTablePrefix )
+                       $this->tablePrefix = $prefix;
+                       $this->currentDomain = ( $this->dbName != '' )
+                               ? new DatabaseDomain( $this->dbName, null, $this->tablePrefix )
                                : DatabaseDomain::newUnspecified();
                }
 
@@ -494,9 +492,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function dbSchema( $schema = null ) {
-               $old = $this->mSchema;
+               $old = $this->schema;
                if ( $schema !== null ) {
-                       $this->mSchema = $schema;
+                       $this->schema = $schema;
                }
 
                return $old;
@@ -504,10 +502,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        public function getLBInfo( $name = null ) {
                if ( is_null( $name ) ) {
-                       return $this->mLBInfo;
+                       return $this->lbInfo;
                } else {
-                       if ( array_key_exists( $name, $this->mLBInfo ) ) {
-                               return $this->mLBInfo[$name];
+                       if ( array_key_exists( $name, $this->lbInfo ) ) {
+                               return $this->lbInfo[$name];
                        } else {
                                return null;
                        }
@@ -516,9 +514,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        public function setLBInfo( $name, $value = null ) {
                if ( is_null( $value ) ) {
-                       $this->mLBInfo = $name;
+                       $this->lbInfo = $name;
                } else {
-                       $this->mLBInfo[$name] = $value;
+                       $this->lbInfo[$name] = $value;
                }
        }
 
@@ -544,55 +542,55 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function lastQuery() {
-               return $this->mLastQuery;
+               return $this->lastQuery;
        }
 
        public function doneWrites() {
-               return (bool)$this->mLastWriteTime;
+               return (bool)$this->lastWriteTime;
        }
 
        public function lastDoneWrites() {
-               return $this->mLastWriteTime ?: false;
+               return $this->lastWriteTime ?: false;
        }
 
        public function writesPending() {
-               return $this->mTrxLevel && $this->mTrxDoneWrites;
+               return $this->trxLevel && $this->trxDoneWrites;
        }
 
        public function writesOrCallbacksPending() {
-               return $this->mTrxLevel && (
-                       $this->mTrxDoneWrites || $this->mTrxIdleCallbacks || $this->mTrxPreCommitCallbacks
+               return $this->trxLevel && (
+                       $this->trxDoneWrites || $this->trxIdleCallbacks || $this->trxPreCommitCallbacks
                );
        }
 
        public function pendingWriteQueryDuration( $type = self::ESTIMATE_TOTAL ) {
-               if ( !$this->mTrxLevel ) {
+               if ( !$this->trxLevel ) {
                        return false;
-               } elseif ( !$this->mTrxDoneWrites ) {
+               } elseif ( !$this->trxDoneWrites ) {
                        return 0.0;
                }
 
                switch ( $type ) {
                        case self::ESTIMATE_DB_APPLY:
                                $this->ping( $rtt );
-                               $rttAdjTotal = $this->mTrxWriteAdjQueryCount * $rtt;
-                               $applyTime = max( $this->mTrxWriteAdjDuration - $rttAdjTotal, 0 );
+                               $rttAdjTotal = $this->trxWriteAdjQueryCount * $rtt;
+                               $applyTime = max( $this->trxWriteAdjDuration - $rttAdjTotal, 0 );
                                // For omitted queries, make them count as something at least
-                               $omitted = $this->mTrxWriteQueryCount - $this->mTrxWriteAdjQueryCount;
+                               $omitted = $this->trxWriteQueryCount - $this->trxWriteAdjQueryCount;
                                $applyTime += self::TINY_WRITE_SEC * $omitted;
 
                                return $applyTime;
                        default: // everything
-                               return $this->mTrxWriteDuration;
+                               return $this->trxWriteDuration;
                }
        }
 
        public function pendingWriteCallers() {
-               return $this->mTrxLevel ? $this->mTrxWriteCallers : [];
+               return $this->trxLevel ? $this->trxWriteCallers : [];
        }
 
        public function pendingWriteRowsAffected() {
-               return $this->mTrxWriteAffectedRows;
+               return $this->trxWriteAffectedRows;
        }
 
        /**
@@ -602,15 +600,15 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @return array
         */
        protected function pendingWriteAndCallbackCallers() {
-               if ( !$this->mTrxLevel ) {
+               if ( !$this->trxLevel ) {
                        return [];
                }
 
-               $fnames = $this->mTrxWriteCallers;
+               $fnames = $this->trxWriteCallers;
                foreach ( [
-                       $this->mTrxIdleCallbacks,
-                       $this->mTrxPreCommitCallbacks,
-                       $this->mTrxEndCallbacks
+                       $this->trxIdleCallbacks,
+                       $this->trxPreCommitCallbacks,
+                       $this->trxEndCallbacks
                ] as $callbacks ) {
                        foreach ( $callbacks as $callback ) {
                                $fnames[] = $callback[1];
@@ -621,7 +619,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function isOpen() {
-               return $this->mOpened;
+               return $this->opened;
        }
 
        public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
@@ -630,9 +628,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                if ( $remember === self::REMEMBER_PRIOR ) {
-                       array_push( $this->priorFlags, $this->mFlags );
+                       array_push( $this->priorFlags, $this->flags );
                }
-               $this->mFlags |= $flag;
+               $this->flags |= $flag;
        }
 
        public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
@@ -641,9 +639,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                if ( $remember === self::REMEMBER_PRIOR ) {
-                       array_push( $this->priorFlags, $this->mFlags );
+                       array_push( $this->priorFlags, $this->flags );
                }
-               $this->mFlags &= ~$flag;
+               $this->flags &= ~$flag;
        }
 
        public function restoreFlags( $state = self::RESTORE_PRIOR ) {
@@ -652,15 +650,15 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                if ( $state === self::RESTORE_INITIAL ) {
-                       $this->mFlags = reset( $this->priorFlags );
+                       $this->flags = reset( $this->priorFlags );
                        $this->priorFlags = [];
                } else {
-                       $this->mFlags = array_pop( $this->priorFlags );
+                       $this->flags = array_pop( $this->priorFlags );
                }
        }
 
        public function getFlag( $flag ) {
-               return !!( $this->mFlags & $flag );
+               return !!( $this->flags & $flag );
        }
 
        /**
@@ -701,7 +699,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * Set a custom error handler for logging errors during database connection
         */
        protected function installErrorHandler() {
-               $this->mPHPError = false;
+               $this->phpError = false;
                $this->htmlErrors = ini_set( 'html_errors', '0' );
                set_error_handler( [ $this, 'connectionErrorLogger' ] );
        }
@@ -724,8 +722,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @return string|bool Last PHP error for this DB (typically connection errors)
         */
        protected function getLastPHPError() {
-               if ( $this->mPHPError ) {
-                       $error = preg_replace( '!\[<a.*</a>\]!', '', $this->mPHPError );
+               if ( $this->phpError ) {
+                       $error = preg_replace( '!\[<a.*</a>\]!', '', $this->phpError );
                        $error = preg_replace( '!^.*?:\s?(.*)$!', '$1', $error );
 
                        return $error;
@@ -742,7 +740,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @param string $errstr
         */
        public function connectionErrorLogger( $errno, $errstr ) {
-               $this->mPHPError = $errstr;
+               $this->phpError = $errstr;
        }
 
        /**
@@ -754,32 +752,32 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        protected function getLogContext( array $extras = [] ) {
                return array_merge(
                        [
-                               'db_server' => $this->mServer,
-                               'db_name' => $this->mDBname,
-                               'db_user' => $this->mUser,
+                               'db_server' => $this->server,
+                               'db_name' => $this->dbName,
+                               'db_user' => $this->user,
                        ],
                        $extras
                );
        }
 
        public function close() {
-               if ( $this->mConn ) {
+               if ( $this->conn ) {
                        if ( $this->trxLevel() ) {
                                $this->commit( __METHOD__, self::FLUSHING_INTERNAL );
                        }
 
                        $closed = $this->closeConnection();
-                       $this->mConn = false;
+                       $this->conn = false;
                } elseif (
-                       $this->mTrxIdleCallbacks ||
-                       $this->mTrxPreCommitCallbacks ||
-                       $this->mTrxEndCallbacks
+                       $this->trxIdleCallbacks ||
+                       $this->trxPreCommitCallbacks ||
+                       $this->trxEndCallbacks
                ) { // sanity
                        throw new RuntimeException( "Transaction callbacks still pending." );
                } else {
                        $closed = true;
                }
-               $this->mOpened = false;
+               $this->opened = false;
 
                return $closed;
        }
@@ -868,7 +866,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $sql,
                        $matches
                ) ) {
-                       $this->mSessionTempTables[$matches[1]] = 1;
+                       $this->sessionTempTables[$matches[1]] = 1;
 
                        return true;
                } elseif ( preg_match(
@@ -876,8 +874,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $sql,
                        $matches
                ) ) {
-                       $isTemp = isset( $this->mSessionTempTables[$matches[1]] );
-                       unset( $this->mSessionTempTables[$matches[1]] );
+                       $isTemp = isset( $this->sessionTempTables[$matches[1]] );
+                       unset( $this->sessionTempTables[$matches[1]] );
 
                        return $isTemp;
                } elseif ( preg_match(
@@ -885,13 +883,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $sql,
                        $matches
                ) ) {
-                       return isset( $this->mSessionTempTables[$matches[1]] );
+                       return isset( $this->sessionTempTables[$matches[1]] );
                } elseif ( preg_match(
                        '/^(?:INSERT\s+(?:\w+\s+)?INTO|UPDATE|DELETE\s+FROM)\s+[`"\']?(\w+)[`"\']?/i',
                        $sql,
                        $matches
                ) ) {
-                       return isset( $this->mSessionTempTables[$matches[1]] );
+                       return isset( $this->sessionTempTables[$matches[1]] );
                }
 
                return false;
@@ -899,7 +897,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
                $priorWritesPending = $this->writesOrCallbacksPending();
-               $this->mLastQuery = $sql;
+               $this->lastQuery = $sql;
 
                $isWrite = $this->isWriteQuery( $sql );
                if ( $isWrite ) {
@@ -922,7 +920,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                throw new DBReadOnlyError( $this, "Database is read-only: $reason" );
                        }
                        # Set a flag indicating that writes have been done
-                       $this->mLastWriteTime = microtime( true );
+                       $this->lastWriteTime = microtime( true );
                }
 
                # Add trace comment to the begin of the sql string, right after the operator.
@@ -930,22 +928,22 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $commentedSql = preg_replace( '/\s|$/', " /* $fname {$this->agent} */ ", $sql, 1 );
 
                # Start implicit transactions that wrap the request if DBO_TRX is enabled
-               if ( !$this->mTrxLevel && $this->getFlag( self::DBO_TRX )
+               if ( !$this->trxLevel && $this->getFlag( self::DBO_TRX )
                        && $this->isTransactableQuery( $sql )
                ) {
                        $this->begin( __METHOD__ . " ($fname)", self::TRANSACTION_INTERNAL );
-                       $this->mTrxAutomatic = true;
+                       $this->trxAutomatic = true;
                }
 
                # Keep track of whether the transaction has write queries pending
-               if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $isWrite ) {
-                       $this->mTrxDoneWrites = true;
+               if ( $this->trxLevel && !$this->trxDoneWrites && $isWrite ) {
+                       $this->trxDoneWrites = true;
                        $this->trxProfiler->transactionWritingIn(
-                               $this->mServer, $this->mDBname, $this->mTrxShortId );
+                               $this->server, $this->dbName, $this->trxShortId );
                }
 
                if ( $this->getFlag( self::DBO_DEBUG ) ) {
-                       $this->queryLogger->debug( "{$this->mDBname} {$commentedSql}" );
+                       $this->queryLogger->debug( "{$this->dbName} {$commentedSql}" );
                }
 
                # Avoid fatals if close() was called
@@ -1024,7 +1022,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                # Include query transaction state
-               $queryProf .= $this->mTrxShortId ? " [TRX#{$this->mTrxShortId}]" : "";
+               $queryProf .= $this->trxShortId ? " [TRX#{$this->trxShortId}]" : "";
 
                $startTime = microtime( true );
                if ( $this->profiler ) {
@@ -1042,14 +1040,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                if ( $ret !== false ) {
                        $this->lastPing = $startTime;
-                       if ( $isWrite && $this->mTrxLevel ) {
+                       if ( $isWrite && $this->trxLevel ) {
                                $this->updateTrxWriteQueryTime( $sql, $queryRuntime, $this->affectedRows() );
-                               $this->mTrxWriteCallers[] = $fname;
+                               $this->trxWriteCallers[] = $fname;
                        }
                }
 
                if ( $sql === self::PING_QUERY ) {
-                       $this->mRTTEstimate = $queryRuntime;
+                       $this->rttEstimate = $queryRuntime;
                }
 
                $this->trxProfiler->recordQueryCompletion(
@@ -1089,12 +1087,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        }
                }
 
-               $this->mTrxWriteDuration += $runtime;
-               $this->mTrxWriteQueryCount += 1;
-               $this->mTrxWriteAffectedRows += $affected;
+               $this->trxWriteDuration += $runtime;
+               $this->trxWriteQueryCount += 1;
+               $this->trxWriteAffectedRows += $affected;
                if ( $indicativeOfReplicaRuntime ) {
-                       $this->mTrxWriteAdjDuration += $runtime;
-                       $this->mTrxWriteAdjQueryCount += 1;
+                       $this->trxWriteAdjDuration += $runtime;
+                       $this->trxWriteAdjQueryCount += 1;
                }
        }
 
@@ -1113,7 +1111,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                # Dropped connections also mean that named locks are automatically released.
                # Only allow error suppression in autocommit mode or when the lost transaction
                # didn't matter anyway (aside from DBO_TRX snapshot loss).
-               if ( $this->mNamedLocksHeld ) {
+               if ( $this->namedLocksHeld ) {
                        return false; // possible critical section violation
                } elseif ( $sql === 'COMMIT' ) {
                        return !$priorWritesPending; // nothing written anyway? (T127428)
@@ -1134,13 +1132,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @return null|Exception
         */
        private function handleSessionLoss() {
-               $this->mTrxLevel = 0;
-               $this->mTrxIdleCallbacks = []; // T67263
-               $this->mTrxPreCommitCallbacks = []; // T67263
-               $this->mSessionTempTables = [];
-               $this->mNamedLocksHeld = [];
+               $this->trxLevel = 0;
+               $this->trxIdleCallbacks = []; // T67263
+               $this->trxPreCommitCallbacks = []; // T67263
+               $this->sessionTempTables = [];
+               $this->namedLocksHeld = [];
                try {
-                       // Handle callbacks in mTrxEndCallbacks
+                       // Handle callbacks in trxEndCallbacks
                        $this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK );
                        $this->runTransactionListenerCallbacks( self::TRIGGER_ROLLBACK );
                        return null;
@@ -1405,13 +1403,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                $this->tableNamesWithIndexClauseOrJOIN(
                                        $table, $useIndexes, $ignoreIndexes, $join_conds );
                } elseif ( $table != '' ) {
-                       if ( $table[0] == ' ' ) {
-                               $from = ' FROM ' . $table;
-                       } else {
-                               $from = ' FROM ' .
-                                       $this->tableNamesWithIndexClauseOrJOIN(
-                                               [ $table ], $useIndexes, $ignoreIndexes, [] );
-                       }
+                       $from = ' FROM ' .
+                               $this->tableNamesWithIndexClauseOrJOIN(
+                                       [ $table ], $useIndexes, $ignoreIndexes, [] );
                } else {
                        $from = '';
                }
@@ -1545,7 +1539,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        public function tableExists( $table, $fname = __METHOD__ ) {
                $tableRaw = $this->tableName( $table, 'raw' );
-               if ( isset( $this->mSessionTempTables[$tableRaw] ) ) {
+               if ( isset( $this->sessionTempTables[$tableRaw] ) ) {
                        return true; // already known to exist
                }
 
@@ -1811,17 +1805,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                # Stub. Shouldn't cause serious problems if it's not overridden, but
                # if your database engine supports a concept similar to MySQL's
                # databases you may as well.
-               $this->mDBname = $db;
+               $this->dbName = $db;
 
                return true;
        }
 
        public function getDBname() {
-               return $this->mDBname;
+               return $this->dbName;
        }
 
        public function getServer() {
-               return $this->mServer;
+               return $this->server;
        }
 
        public function tableName( $name, $format = 'quoted' ) {
@@ -1890,14 +1884,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                $database = $this->tableAliases[$table]['dbname'];
                                $schema = is_string( $this->tableAliases[$table]['schema'] )
                                        ? $this->tableAliases[$table]['schema']
-                                       : $this->mSchema;
+                                       : $this->schema;
                                $prefix = is_string( $this->tableAliases[$table]['prefix'] )
                                        ? $this->tableAliases[$table]['prefix']
-                                       : $this->mTablePrefix;
+                                       : $this->tablePrefix;
                        } else {
                                $database = '';
-                               $schema = $this->mSchema; # Default schema
-                               $prefix = $this->mTablePrefix; # Default prefix
+                               $schema = $this->schema; # Default schema
+                               $prefix = $this->tablePrefix; # Default prefix
                        }
                }
 
@@ -2250,37 +2244,51 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $rows = [ $rows ];
                }
 
-               $affectedRowCount = 0;
-               foreach ( $rows as $row ) {
-                       // Delete rows which collide with this one
-                       $indexWhereClauses = [];
-                       foreach ( $uniqueIndexes as $index ) {
-                               $indexColumns = (array)$index;
-                               $indexRowValues = array_intersect_key( $row, array_flip( $indexColumns ) );
-                               if ( count( $indexRowValues ) != count( $indexColumns ) ) {
-                                       throw new DBUnexpectedError(
-                                               $this,
-                                               'New record does not provide all values for unique key (' .
+               $useTrx = !$this->trxLevel;
+               if ( $useTrx ) {
+                       $this->begin( $fname, self::TRANSACTION_INTERNAL );
+               }
+               try {
+                       $affectedRowCount = 0;
+                       foreach ( $rows as $row ) {
+                               // Delete rows which collide with this one
+                               $indexWhereClauses = [];
+                               foreach ( $uniqueIndexes as $index ) {
+                                       $indexColumns = (array)$index;
+                                       $indexRowValues = array_intersect_key( $row, array_flip( $indexColumns ) );
+                                       if ( count( $indexRowValues ) != count( $indexColumns ) ) {
+                                               throw new DBUnexpectedError(
+                                                       $this,
+                                                       'New record does not provide all values for unique key (' .
                                                        implode( ', ', $indexColumns ) . ')'
-                                       );
-                               } elseif ( in_array( null, $indexRowValues, true ) ) {
-                                       throw new DBUnexpectedError(
-                                               $this,
-                                               'New record has a null value for unique key (' .
+                                               );
+                                       } elseif ( in_array( null, $indexRowValues, true ) ) {
+                                               throw new DBUnexpectedError(
+                                                       $this,
+                                                       'New record has a null value for unique key (' .
                                                        implode( ', ', $indexColumns ) . ')'
-                                       );
+                                               );
+                                       }
+                                       $indexWhereClauses[] = $this->makeList( $indexRowValues, LIST_AND );
+                               }
+
+                               if ( $indexWhereClauses ) {
+                                       $this->delete( $table, $this->makeList( $indexWhereClauses, LIST_OR ), $fname );
+                                       $affectedRowCount += $this->affectedRows();
                                }
-                               $indexWhereClauses[] = $this->makeList( $indexRowValues, LIST_AND );
-                       }
 
-                       if ( $indexWhereClauses ) {
-                               $this->delete( $table, $this->makeList( $indexWhereClauses, LIST_OR ), $fname );
+                               // Now insert the row
+                               $this->insert( $table, $row, $fname );
                                $affectedRowCount += $this->affectedRows();
                        }
-
-                       // Now insert the row
-                       $this->insert( $table, $row, $fname );
-                       $affectedRowCount += $this->affectedRows();
+               } catch ( Exception $e ) {
+                       if ( $useTrx ) {
+                               $this->rollback( $fname, self::FLUSHING_INTERNAL );
+                       }
+                       throw $e;
+               }
+               if ( $useTrx ) {
+                       $this->commit( $fname, self::FLUSHING_INTERNAL );
                }
 
                $this->affectedRowCount = $affectedRowCount;
@@ -2349,7 +2357,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                $affectedRowCount = 0;
-               $useTrx = !$this->mTrxLevel;
+               $useTrx = !$this->trxLevel;
                if ( $useTrx ) {
                        $this->begin( $fname, self::TRANSACTION_INTERNAL );
                }
@@ -2756,25 +2764,25 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        final public function onTransactionResolution( callable $callback, $fname = __METHOD__ ) {
-               if ( !$this->mTrxLevel ) {
+               if ( !$this->trxLevel ) {
                        throw new DBUnexpectedError( $this, "No transaction is active." );
                }
-               $this->mTrxEndCallbacks[] = [ $callback, $fname ];
+               $this->trxEndCallbacks[] = [ $callback, $fname ];
        }
 
        final public function onTransactionIdle( callable $callback, $fname = __METHOD__ ) {
-               $this->mTrxIdleCallbacks[] = [ $callback, $fname ];
-               if ( !$this->mTrxLevel ) {
+               $this->trxIdleCallbacks[] = [ $callback, $fname ];
+               if ( !$this->trxLevel ) {
                        $this->runOnTransactionIdleCallbacks( self::TRIGGER_IDLE );
                }
        }
 
        final public function onTransactionPreCommitOrIdle( callable $callback, $fname = __METHOD__ ) {
-               if ( $this->mTrxLevel || $this->getFlag( self::DBO_TRX ) ) {
+               if ( $this->trxLevel || $this->getFlag( self::DBO_TRX ) ) {
                        // As long as DBO_TRX is set, writes will accumulate until the load balancer issues
                        // an implicit commit of all peer databases. This is true even if a transaction has
                        // not yet been triggered by writes; make sure $callback runs *after* any such writes.
-                       $this->mTrxPreCommitCallbacks[] = [ $callback, $fname ];
+                       $this->trxPreCommitCallbacks[] = [ $callback, $fname ];
                } else {
                        // No transaction is active nor will start implicitly, so make one for this callback
                        $this->startAtomic( __METHOD__ );
@@ -2790,9 +2798,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        final public function setTransactionListener( $name, callable $callback = null ) {
                if ( $callback ) {
-                       $this->mTrxRecurringCallbacks[$name] = $callback;
+                       $this->trxRecurringCallbacks[$name] = $callback;
                } else {
-                       unset( $this->mTrxRecurringCallbacks[$name] );
+                       unset( $this->trxRecurringCallbacks[$name] );
                }
        }
 
@@ -2805,7 +2813,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @since 1.28
         */
        final public function setTrxEndCallbackSuppression( $suppress ) {
-               $this->mTrxEndCallbacksSuppressed = $suppress;
+               $this->trxEndCallbacksSuppressed = $suppress;
        }
 
        /**
@@ -2818,7 +2826,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @throws Exception
         */
        public function runOnTransactionIdleCallbacks( $trigger ) {
-               if ( $this->mTrxEndCallbacksSuppressed ) {
+               if ( $this->trxEndCallbacksSuppressed ) {
                        return;
                }
 
@@ -2827,11 +2835,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $e = null; // first exception
                do { // callbacks may add callbacks :)
                        $callbacks = array_merge(
-                               $this->mTrxIdleCallbacks,
-                               $this->mTrxEndCallbacks // include "transaction resolution" callbacks
+                               $this->trxIdleCallbacks,
+                               $this->trxEndCallbacks // include "transaction resolution" callbacks
                        );
-                       $this->mTrxIdleCallbacks = []; // consumed (and recursion guard)
-                       $this->mTrxEndCallbacks = []; // consumed (recursion guard)
+                       $this->trxIdleCallbacks = []; // consumed (and recursion guard)
+                       $this->trxEndCallbacks = []; // consumed (recursion guard)
                        foreach ( $callbacks as $callback ) {
                                try {
                                        list( $phpCallback ) = $callback;
@@ -2852,7 +2860,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                        }
                                }
                        }
-               } while ( count( $this->mTrxIdleCallbacks ) );
+               } while ( count( $this->trxIdleCallbacks ) );
 
                if ( $e instanceof Exception ) {
                        throw $e; // re-throw any first exception
@@ -2870,8 +2878,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        public function runOnTransactionPreCommitCallbacks() {
                $e = null; // first exception
                do { // callbacks may add callbacks :)
-                       $callbacks = $this->mTrxPreCommitCallbacks;
-                       $this->mTrxPreCommitCallbacks = []; // consumed (and recursion guard)
+                       $callbacks = $this->trxPreCommitCallbacks;
+                       $this->trxPreCommitCallbacks = []; // consumed (and recursion guard)
                        foreach ( $callbacks as $callback ) {
                                try {
                                        list( $phpCallback ) = $callback;
@@ -2881,7 +2889,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                        $e = $e ?: $ex;
                                }
                        }
-               } while ( count( $this->mTrxPreCommitCallbacks ) );
+               } while ( count( $this->trxPreCommitCallbacks ) );
 
                if ( $e instanceof Exception ) {
                        throw $e; // re-throw any first exception
@@ -2898,14 +2906,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @since 1.20
         */
        public function runTransactionListenerCallbacks( $trigger ) {
-               if ( $this->mTrxEndCallbacksSuppressed ) {
+               if ( $this->trxEndCallbacksSuppressed ) {
                        return;
                }
 
                /** @var Exception $e */
                $e = null; // first exception
 
-               foreach ( $this->mTrxRecurringCallbacks as $phpCallback ) {
+               foreach ( $this->trxRecurringCallbacks as $phpCallback ) {
                        try {
                                $phpCallback( $trigger, $this );
                        } catch ( Exception $ex ) {
@@ -2920,29 +2928,29 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        final public function startAtomic( $fname = __METHOD__ ) {
-               if ( !$this->mTrxLevel ) {
+               if ( !$this->trxLevel ) {
                        $this->begin( $fname, self::TRANSACTION_INTERNAL );
                        // If DBO_TRX is set, a series of startAtomic/endAtomic pairs will result
                        // in all changes being in one transaction to keep requests transactional.
                        if ( !$this->getFlag( self::DBO_TRX ) ) {
-                               $this->mTrxAutomaticAtomic = true;
+                               $this->trxAutomaticAtomic = true;
                        }
                }
 
-               $this->mTrxAtomicLevels[] = $fname;
+               $this->trxAtomicLevels[] = $fname;
        }
 
        final public function endAtomic( $fname = __METHOD__ ) {
-               if ( !$this->mTrxLevel ) {
+               if ( !$this->trxLevel ) {
                        throw new DBUnexpectedError( $this, "No atomic transaction is open (got $fname)." );
                }
-               if ( !$this->mTrxAtomicLevels ||
-                       array_pop( $this->mTrxAtomicLevels ) !== $fname
+               if ( !$this->trxAtomicLevels ||
+                       array_pop( $this->trxAtomicLevels ) !== $fname
                ) {
                        throw new DBUnexpectedError( $this, "Invalid atomic section ended (got $fname)." );
                }
 
-               if ( !$this->mTrxAtomicLevels && $this->mTrxAutomaticAtomic ) {
+               if ( !$this->trxAtomicLevels && $this->trxAutomaticAtomic ) {
                        $this->commit( $fname, self::FLUSHING_INTERNAL );
                }
        }
@@ -2962,17 +2970,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        final public function begin( $fname = __METHOD__, $mode = self::TRANSACTION_EXPLICIT ) {
                // Protect against mismatched atomic section, transaction nesting, and snapshot loss
-               if ( $this->mTrxLevel ) {
-                       if ( $this->mTrxAtomicLevels ) {
-                               $levels = implode( ', ', $this->mTrxAtomicLevels );
+               if ( $this->trxLevel ) {
+                       if ( $this->trxAtomicLevels ) {
+                               $levels = implode( ', ', $this->trxAtomicLevels );
                                $msg = "$fname: Got explicit BEGIN while atomic section(s) $levels are open.";
                                throw new DBUnexpectedError( $this, $msg );
-                       } elseif ( !$this->mTrxAutomatic ) {
-                               $msg = "$fname: Explicit transaction already active (from {$this->mTrxFname}).";
+                       } elseif ( !$this->trxAutomatic ) {
+                               $msg = "$fname: Explicit transaction already active (from {$this->trxFname}).";
                                throw new DBUnexpectedError( $this, $msg );
                        } else {
                                // @TODO: make this an exception at some point
-                               $msg = "$fname: Implicit transaction already active (from {$this->mTrxFname}).";
+                               $msg = "$fname: Implicit transaction already active (from {$this->trxFname}).";
                                $this->queryLogger->error( $msg );
                                return; // join the main transaction set
                        }
@@ -2987,27 +2995,27 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->assertOpen();
 
                $this->doBegin( $fname );
-               $this->mTrxTimestamp = microtime( true );
-               $this->mTrxFname = $fname;
-               $this->mTrxDoneWrites = false;
-               $this->mTrxAutomaticAtomic = false;
-               $this->mTrxAtomicLevels = [];
-               $this->mTrxShortId = sprintf( '%06x', mt_rand( 0, 0xffffff ) );
-               $this->mTrxWriteDuration = 0.0;
-               $this->mTrxWriteQueryCount = 0;
-               $this->mTrxWriteAffectedRows = 0;
-               $this->mTrxWriteAdjDuration = 0.0;
-               $this->mTrxWriteAdjQueryCount = 0;
-               $this->mTrxWriteCallers = [];
+               $this->trxTimestamp = microtime( true );
+               $this->trxFname = $fname;
+               $this->trxDoneWrites = false;
+               $this->trxAutomaticAtomic = false;
+               $this->trxAtomicLevels = [];
+               $this->trxShortId = sprintf( '%06x', mt_rand( 0, 0xffffff ) );
+               $this->trxWriteDuration = 0.0;
+               $this->trxWriteQueryCount = 0;
+               $this->trxWriteAffectedRows = 0;
+               $this->trxWriteAdjDuration = 0.0;
+               $this->trxWriteAdjQueryCount = 0;
+               $this->trxWriteCallers = [];
                // First SELECT after BEGIN will establish the snapshot in REPEATABLE-READ.
                // Get an estimate of the replica DB lag before then, treating estimate staleness
                // as lag itself just to be safe
                $status = $this->getApproximateLagStatus();
-               $this->mTrxReplicaLag = $status['lag'] + ( microtime( true ) - $status['since'] );
+               $this->trxReplicaLag = $status['lag'] + ( microtime( true ) - $status['since'] );
                // T147697: make explicitTrxActive() return true until begin() finishes. This way, no
                // caller will think its OK to muck around with the transaction just because startAtomic()
-               // has not yet completed (e.g. setting mTrxAtomicLevels).
-               $this->mTrxAutomatic = ( $mode === self::TRANSACTION_INTERNAL );
+               // has not yet completed (e.g. setting trxAtomicLevels).
+               $this->trxAutomatic = ( $mode === self::TRANSACTION_INTERNAL );
        }
 
        /**
@@ -3018,13 +3026,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         */
        protected function doBegin( $fname ) {
                $this->query( 'BEGIN', $fname );
-               $this->mTrxLevel = 1;
+               $this->trxLevel = 1;
        }
 
        final public function commit( $fname = __METHOD__, $flush = '' ) {
-               if ( $this->mTrxLevel && $this->mTrxAtomicLevels ) {
+               if ( $this->trxLevel && $this->trxAtomicLevels ) {
                        // There are still atomic sections open. This cannot be ignored
-                       $levels = implode( ', ', $this->mTrxAtomicLevels );
+                       $levels = implode( ', ', $this->trxAtomicLevels );
                        throw new DBUnexpectedError(
                                $this,
                                "$fname: Got COMMIT while atomic sections $levels are still open."
@@ -3032,20 +3040,20 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                if ( $flush === self::FLUSHING_INTERNAL || $flush === self::FLUSHING_ALL_PEERS ) {
-                       if ( !$this->mTrxLevel ) {
+                       if ( !$this->trxLevel ) {
                                return; // nothing to do
-                       } elseif ( !$this->mTrxAutomatic ) {
+                       } elseif ( !$this->trxAutomatic ) {
                                throw new DBUnexpectedError(
                                        $this,
                                        "$fname: Flushing an explicit transaction, getting out of sync."
                                );
                        }
                } else {
-                       if ( !$this->mTrxLevel ) {
+                       if ( !$this->trxLevel ) {
                                $this->queryLogger->error(
                                        "$fname: No transaction to commit, something got out of sync." );
                                return; // nothing to do
-                       } elseif ( $this->mTrxAutomatic ) {
+                       } elseif ( $this->trxAutomatic ) {
                                // @TODO: make this an exception at some point
                                $msg = "$fname: Explicit commit of implicit transaction.";
                                $this->queryLogger->error( $msg );
@@ -3059,14 +3067,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->runOnTransactionPreCommitCallbacks();
                $writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY );
                $this->doCommit( $fname );
-               if ( $this->mTrxDoneWrites ) {
-                       $this->mLastWriteTime = microtime( true );
+               if ( $this->trxDoneWrites ) {
+                       $this->lastWriteTime = microtime( true );
                        $this->trxProfiler->transactionWritingOut(
-                               $this->mServer,
-                               $this->mDBname,
-                               $this->mTrxShortId,
+                               $this->server,
+                               $this->dbName,
+                               $this->trxShortId,
                                $writeTime,
-                               $this->mTrxWriteAffectedRows
+                               $this->trxWriteAffectedRows
                        );
                }
 
@@ -3081,19 +3089,19 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @param string $fname
         */
        protected function doCommit( $fname ) {
-               if ( $this->mTrxLevel ) {
+               if ( $this->trxLevel ) {
                        $this->query( 'COMMIT', $fname );
-                       $this->mTrxLevel = 0;
+                       $this->trxLevel = 0;
                }
        }
 
        final public function rollback( $fname = __METHOD__, $flush = '' ) {
                if ( $flush === self::FLUSHING_INTERNAL || $flush === self::FLUSHING_ALL_PEERS ) {
-                       if ( !$this->mTrxLevel ) {
+                       if ( !$this->trxLevel ) {
                                return; // nothing to do
                        }
                } else {
-                       if ( !$this->mTrxLevel ) {
+                       if ( !$this->trxLevel ) {
                                $this->queryLogger->error(
                                        "$fname: No transaction to rollback, something got out of sync." );
                                return; // nothing to do
@@ -3109,17 +3117,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->assertOpen();
 
                $this->doRollback( $fname );
-               $this->mTrxAtomicLevels = [];
-               if ( $this->mTrxDoneWrites ) {
+               $this->trxAtomicLevels = [];
+               if ( $this->trxDoneWrites ) {
                        $this->trxProfiler->transactionWritingOut(
-                               $this->mServer,
-                               $this->mDBname,
-                               $this->mTrxShortId
+                               $this->server,
+                               $this->dbName,
+                               $this->trxShortId
                        );
                }
 
-               $this->mTrxIdleCallbacks = []; // clear
-               $this->mTrxPreCommitCallbacks = []; // clear
+               $this->trxIdleCallbacks = []; // clear
+               $this->trxPreCommitCallbacks = []; // clear
                try {
                        $this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK );
                } catch ( Exception $e ) {
@@ -3139,11 +3147,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @param string $fname
         */
        protected function doRollback( $fname ) {
-               if ( $this->mTrxLevel ) {
+               if ( $this->trxLevel ) {
                        # Disconnects cause rollback anyway, so ignore those errors
                        $ignoreErrors = true;
                        $this->query( 'ROLLBACK', $fname, $ignoreErrors );
-                       $this->mTrxLevel = 0;
+                       $this->trxLevel = 0;
                }
        }
 
@@ -3161,7 +3169,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function explicitTrxActive() {
-               return $this->mTrxLevel && ( $this->mTrxAtomicLevels || !$this->mTrxAutomatic );
+               return $this->trxLevel && ( $this->trxAtomicLevels || !$this->trxAutomatic );
        }
 
        public function duplicateTableStructure(
@@ -3232,8 +3240,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        public function ping( &$rtt = null ) {
                // Avoid hitting the server if it was hit recently
                if ( $this->isOpen() && ( microtime( true ) - $this->lastPing ) < self::PING_TTL ) {
-                       if ( !func_num_args() || $this->mRTTEstimate > 0 ) {
-                               $rtt = $this->mRTTEstimate;
+                       if ( !func_num_args() || $this->rttEstimate > 0 ) {
+                               $rtt = $this->rttEstimate;
                                return true; // don't care about $rtt
                        }
                }
@@ -3244,7 +3252,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->restoreFlags( self::RESTORE_PRIOR );
 
                if ( $ok ) {
-                       $rtt = $this->mRTTEstimate;
+                       $rtt = $this->rttEstimate;
                }
 
                return $ok;
@@ -3257,10 +3265,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         */
        protected function reconnect() {
                $this->closeConnection();
-               $this->mOpened = false;
-               $this->mConn = false;
+               $this->opened = false;
+               $this->conn = false;
                try {
-                       $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
+                       $this->open( $this->server, $this->user, $this->password, $this->dbName );
                        $this->lastPing = microtime( true );
                        $ok = true;
                } catch ( DBConnectionError $e ) {
@@ -3286,8 +3294,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @since 1.27
         */
        protected function getTransactionLagStatus() {
-               return $this->mTrxLevel
-                       ? [ 'lag' => $this->mTrxReplicaLag, 'since' => $this->trxTimestamp() ]
+               return $this->trxLevel
+                       ? [ 'lag' => $this->trxReplicaLag, 'since' => $this->trxTimestamp() ]
                        : null;
        }
 
@@ -3369,9 +3377,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $fname = false,
                callable $inputCallback = null
        ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $fp = fopen( $filename, 'r' );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( false === $fp ) {
                        throw new RuntimeException( "Could not open \"{$filename}\".\n" );
@@ -3395,7 +3403,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function setSchemaVars( $vars ) {
-               $this->mSchemaVars = $vars;
+               $this->schemaVars = $vars;
        }
 
        public function sourceStream(
@@ -3547,8 +3555,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @return array
         */
        protected function getSchemaVars() {
-               if ( $this->mSchemaVars ) {
-                       return $this->mSchemaVars;
+               if ( $this->schemaVars ) {
+                       return $this->schemaVars;
                } else {
                        return $this->getDefaultSchemaVars();
                }
@@ -3567,17 +3575,20 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function lockIsFree( $lockName, $method ) {
-               return true;
+               // RDBMs methods for checking named locks may or may not count this thread itself.
+               // In MySQL, IS_FREE_LOCK() returns 0 if the thread already has the lock. This is
+               // the behavior choosen by the interface for this method.
+               return !isset( $this->namedLocksHeld[$lockName] );
        }
 
        public function lock( $lockName, $method, $timeout = 5 ) {
-               $this->mNamedLocksHeld[$lockName] = 1;
+               $this->namedLocksHeld[$lockName] = 1;
 
                return true;
        }
 
        public function unlock( $lockName, $method ) {
-               unset( $this->mNamedLocksHeld[$lockName] );
+               unset( $this->namedLocksHeld[$lockName] );
 
                return true;
        }
@@ -3733,9 +3744,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        /**
-        * Get the underlying binding handle, mConn
+        * Get the underlying binding connection handle
         *
-        * Makes sure that mConn is set (disconnects and ping() failure can unset it).
+        * Makes sure the connection resource is set (disconnects and ping() failure can unset it).
         * This catches broken callers than catch and ignore disconnection exceptions.
         * Unlike checking isOpen(), this is safe to call inside of open().
         *
@@ -3744,14 +3755,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @since 1.26
         */
        protected function getBindingHandle() {
-               if ( !$this->mConn ) {
+               if ( !$this->conn ) {
                        throw new DBUnexpectedError(
                                $this,
                                'DB connection was already closed or the connection dropped.'
                        );
                }
 
-               return $this->mConn;
+               return $this->conn;
        }
 
        /**
@@ -3759,7 +3770,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @return string
         */
        public function __toString() {
-               return (string)$this->mConn;
+               return (string)$this->conn;
        }
 
        /**
@@ -3774,11 +3785,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                if ( $this->isOpen() ) {
                        // Open a new connection resource without messing with the old one
-                       $this->mOpened = false;
-                       $this->mConn = false;
-                       $this->mTrxEndCallbacks = []; // don't copy
+                       $this->opened = false;
+                       $this->conn = false;
+                       $this->trxEndCallbacks = []; // don't copy
                        $this->handleSessionLoss(); // no trx or locks anymore
-                       $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
+                       $this->open( $this->server, $this->user, $this->password, $this->dbName );
                        $this->lastPing = microtime( true );
                }
        }
@@ -3797,8 +3808,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * Run a few simple sanity checks and close dangling connections
         */
        public function __destruct() {
-               if ( $this->mTrxLevel && $this->mTrxDoneWrites ) {
-                       trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." );
+               if ( $this->trxLevel && $this->trxDoneWrites ) {
+                       trigger_error( "Uncommitted DB writes (transaction from {$this->trxFname})." );
                }
 
                $danglingWriters = $this->pendingWriteAndCallbackCallers();
@@ -3807,14 +3818,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        trigger_error( "DB transaction writes or callbacks still pending ($fnames)." );
                }
 
-               if ( $this->mConn ) {
+               if ( $this->conn ) {
                        // Avoid connection leaks for sanity. Normally, resources close at script completion.
                        // The connection might already be closed in zend/hhvm by now, so suppress warnings.
-                       \MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $this->closeConnection();
-                       \MediaWiki\restoreWarnings();
-                       $this->mConn = false;
-                       $this->mOpened = false;
+                       Wikimedia\restoreWarnings();
+                       $this->conn = false;
+                       $this->opened = false;
                }
        }
 }
index 832ed9e..b1c8909 100644 (file)
@@ -27,7 +27,7 @@
 
 namespace Wikimedia\Rdbms;
 
-use MediaWiki;
+use Wikimedia;
 use Exception;
 use stdClass;
 
@@ -35,19 +35,28 @@ use stdClass;
  * @ingroup Database
  */
 class DatabaseMssql extends Database {
-       protected $mPort;
-       protected $mUseWindowsAuth = false;
-
-       protected $mInsertId = null;
-       protected $mLastResult = null;
-       protected $mAffectedRows = null;
-       protected $mSubqueryId = 0;
-       protected $mScrollableCursor = true;
-       protected $mPrepareStatements = true;
-       protected $mBinaryColumnCache = null;
-       protected $mBitColumnCache = null;
-       protected $mIgnoreDupKeyErrors = false;
-       protected $mIgnoreErrors = [];
+       /** @var int */
+       protected $serverPort;
+       /** @var bool */
+       protected $useWindowsAuth = false;
+       /** @var int|null */
+       protected $lastInsertId = null;
+       /** @var int|null */
+       protected $lastAffectedRowCount = null;
+       /** @var int */
+       protected $subqueryId = 0;
+       /** @var bool */
+       protected $scrollableCursor = true;
+       /** @var bool */
+       protected $prepareStatements = true;
+       /** @var stdClass[][]|null */
+       protected $binaryColumnCache = null;
+       /** @var stdClass[][]|null */
+       protected $bitColumnCache = null;
+       /** @var bool */
+       protected $ignoreDupKeyErrors = false;
+       /** @var string[] */
+       protected $ignoreErrors = [];
 
        public function implicitGroupby() {
                return false;
@@ -62,8 +71,8 @@ class DatabaseMssql extends Database {
        }
 
        public function __construct( array $params ) {
-               $this->mPort = $params['port'];
-               $this->mUseWindowsAuth = $params['UseWindowsAuth'];
+               $this->serverPort = $params['port'];
+               $this->useWindowsAuth = $params['UseWindowsAuth'];
 
                parent::__construct( $params );
        }
@@ -93,10 +102,10 @@ class DatabaseMssql extends Database {
                }
 
                $this->close();
-               $this->mServer = $server;
-               $this->mUser = $user;
-               $this->mPassword = $password;
-               $this->mDBname = $dbName;
+               $this->server = $server;
+               $this->user = $user;
+               $this->password = $password;
+               $this->dbName = $dbName;
 
                $connectionInfo = [];
 
@@ -106,22 +115,22 @@ class DatabaseMssql extends Database {
 
                // Decide which auth scenerio to use
                // if we are using Windows auth, then don't add credentials to $connectionInfo
-               if ( !$this->mUseWindowsAuth ) {
+               if ( !$this->useWindowsAuth ) {
                        $connectionInfo['UID'] = $user;
                        $connectionInfo['PWD'] = $password;
                }
 
-               MediaWiki\suppressWarnings();
-               $this->mConn = sqlsrv_connect( $server, $connectionInfo );
-               MediaWiki\restoreWarnings();
+               Wikimedia\suppressWarnings();
+               $this->conn = sqlsrv_connect( $server, $connectionInfo );
+               Wikimedia\restoreWarnings();
 
-               if ( $this->mConn === false ) {
+               if ( $this->conn === false ) {
                        throw new DBConnectionError( $this, $this->lastError() );
                }
 
-               $this->mOpened = true;
+               $this->opened = true;
 
-               return $this->mConn;
+               return $this->conn;
        }
 
        /**
@@ -130,7 +139,7 @@ class DatabaseMssql extends Database {
         * @return bool
         */
        protected function closeConnection() {
-               return sqlsrv_close( $this->mConn );
+               return sqlsrv_close( $this->conn );
        }
 
        /**
@@ -178,25 +187,25 @@ class DatabaseMssql extends Database {
                // needed if we want to be able to seek around the result set), however CLIENT_BUFFERED
                // has a bug in the sqlsrv driver where wchar_t types (such as nvarchar) that are empty
                // strings make php throw a fatal error "Severe error translating Unicode"
-               if ( $this->mScrollableCursor ) {
+               if ( $this->scrollableCursor ) {
                        $scrollArr = [ 'Scrollable' => SQLSRV_CURSOR_STATIC ];
                } else {
                        $scrollArr = [];
                }
 
-               if ( $this->mPrepareStatements ) {
+               if ( $this->prepareStatements ) {
                        // we do prepare + execute so we can get its field metadata for later usage if desired
-                       $stmt = sqlsrv_prepare( $this->mConn, $sql, [], $scrollArr );
+                       $stmt = sqlsrv_prepare( $this->conn, $sql, [], $scrollArr );
                        $success = sqlsrv_execute( $stmt );
                } else {
-                       $stmt = sqlsrv_query( $this->mConn, $sql, [], $scrollArr );
+                       $stmt = sqlsrv_query( $this->conn, $sql, [], $scrollArr );
                        $success = (bool)$stmt;
                }
 
                // Make a copy to ensure what we add below does not get reflected in future queries
-               $ignoreErrors = $this->mIgnoreErrors;
+               $ignoreErrors = $this->ignoreErrors;
 
-               if ( $this->mIgnoreDupKeyErrors ) {
+               if ( $this->ignoreDupKeyErrors ) {
                        // ignore duplicate key errors
                        // this emulates INSERT IGNORE in MySQL
                        $ignoreErrors[] = '2601'; // duplicate key error caused by unique index
@@ -220,7 +229,7 @@ class DatabaseMssql extends Database {
                        }
                }
                // remember number of rows affected
-               $this->mAffectedRows = sqlsrv_rows_affected( $stmt );
+               $this->lastAffectedRowCount = sqlsrv_rows_affected( $stmt );
 
                return $stmt;
        }
@@ -300,7 +309,7 @@ class DatabaseMssql extends Database {
         * @return int|null
         */
        public function insertId() {
-               return $this->mInsertId;
+               return $this->lastInsertId;
        }
 
        /**
@@ -354,7 +363,7 @@ class DatabaseMssql extends Database {
         * @return int
         */
        protected function fetchAffectedRowCount() {
-               return $this->mAffectedRows;
+               return $this->lastAffectedRowCount;
        }
 
        /**
@@ -381,8 +390,8 @@ class DatabaseMssql extends Database {
                $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
                if ( isset( $options['EXPLAIN'] ) ) {
                        try {
-                               $this->mScrollableCursor = false;
-                               $this->mPrepareStatements = false;
+                               $this->scrollableCursor = false;
+                               $this->prepareStatements = false;
                                $this->query( "SET SHOWPLAN_ALL ON" );
                                $ret = $this->query( $sql, $fname );
                                $this->query( "SET SHOWPLAN_ALL OFF" );
@@ -402,13 +411,13 @@ class DatabaseMssql extends Database {
                                } else {
                                        // someone actually wanted the query plan instead of an est row count
                                        // let them know of the error
-                                       $this->mScrollableCursor = true;
-                                       $this->mPrepareStatements = true;
+                                       $this->scrollableCursor = true;
+                                       $this->prepareStatements = true;
                                        throw $dqe;
                                }
                        }
-                       $this->mScrollableCursor = true;
-                       $this->mPrepareStatements = true;
+                       $this->scrollableCursor = true;
+                       $this->prepareStatements = true;
                        return $ret;
                }
                return $this->query( $sql, $fname );
@@ -468,25 +477,25 @@ class DatabaseMssql extends Database {
        public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
                $fname = __METHOD__
        ) {
-               $this->mScrollableCursor = false;
+               $this->scrollableCursor = false;
                try {
                        parent::deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname );
                } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
+                       $this->scrollableCursor = true;
                        throw $e;
                }
-               $this->mScrollableCursor = true;
+               $this->scrollableCursor = true;
        }
 
        public function delete( $table, $conds, $fname = __METHOD__ ) {
-               $this->mScrollableCursor = false;
+               $this->scrollableCursor = false;
                try {
                        parent::delete( $table, $conds, $fname );
                } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
+                       $this->scrollableCursor = true;
                        throw $e;
                }
-               $this->mScrollableCursor = true;
+               $this->scrollableCursor = true;
        }
 
        /**
@@ -617,7 +626,7 @@ class DatabaseMssql extends Database {
                // remove IGNORE from options list and set ignore flag to true
                if ( in_array( 'IGNORE', $options ) ) {
                        $options = array_diff( $options, [ 'IGNORE' ] );
-                       $this->mIgnoreDupKeyErrors = true;
+                       $this->ignoreDupKeyErrors = true;
                }
 
                $ret = null;
@@ -681,32 +690,32 @@ class DatabaseMssql extends Database {
                        $sql .= ')' . $sqlPost;
 
                        // Run the query
-                       $this->mScrollableCursor = false;
+                       $this->scrollableCursor = false;
                        try {
                                $ret = $this->query( $sql );
                        } catch ( Exception $e ) {
-                               $this->mScrollableCursor = true;
-                               $this->mIgnoreDupKeyErrors = false;
+                               $this->scrollableCursor = true;
+                               $this->ignoreDupKeyErrors = false;
                                throw $e;
                        }
-                       $this->mScrollableCursor = true;
+                       $this->scrollableCursor = true;
 
                        if ( $ret instanceof ResultWrapper && !is_null( $identity ) ) {
                                // Then we want to get the identity column value we were assigned and save it off
                                $row = $ret->fetchObject();
                                if ( is_object( $row ) ) {
-                                       $this->mInsertId = $row->$identity;
+                                       $this->lastInsertId = $row->$identity;
                                        // It seems that mAffectedRows is -1 sometimes when OUTPUT INSERTED.identity is
                                        // used if we got an identity back, we know for sure a row was affected, so
                                        // adjust that here
-                                       if ( $this->mAffectedRows == -1 ) {
-                                               $this->mAffectedRows = 1;
+                                       if ( $this->lastAffectedRowCount == -1 ) {
+                                               $this->lastAffectedRowCount = 1;
                                        }
                                }
                        }
                }
 
-               $this->mIgnoreDupKeyErrors = false;
+               $this->ignoreDupKeyErrors = false;
 
                return $ret;
        }
@@ -724,13 +733,13 @@ class DatabaseMssql extends Database {
         * @param array $insertOptions
         * @param array $selectOptions
         * @param array $selectJoinConds
-        * @return null|ResultWrapper
+        * @return bool
         * @throws Exception
         */
        public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
                $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        ) {
-               $this->mScrollableCursor = false;
+               $this->scrollableCursor = false;
                try {
                        $ret = parent::nativeInsertSelect(
                                $destTable,
@@ -743,10 +752,10 @@ class DatabaseMssql extends Database {
                                $selectJoinConds
                        );
                } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
+                       $this->scrollableCursor = true;
                        throw $e;
                }
-               $this->mScrollableCursor = true;
+               $this->scrollableCursor = true;
 
                return $ret;
        }
@@ -787,14 +796,14 @@ class DatabaseMssql extends Database {
                        $sql .= " WHERE " . $this->makeList( $conds, LIST_AND, $binaryColumns );
                }
 
-               $this->mScrollableCursor = false;
+               $this->scrollableCursor = false;
                try {
                        $this->query( $sql );
                } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
+                       $this->scrollableCursor = true;
                        throw $e;
                }
-               $this->mScrollableCursor = true;
+               $this->scrollableCursor = true;
                return true;
        }
 
@@ -887,9 +896,9 @@ class DatabaseMssql extends Database {
                        $postOrder = '';
                        $first = $offset + 1;
                        $last = $offset + $limit;
-                       $sub1 = 'sub_' . $this->mSubqueryId;
-                       $sub2 = 'sub_' . ( $this->mSubqueryId + 1 );
-                       $this->mSubqueryId += 2;
+                       $sub1 = 'sub_' . $this->subqueryId;
+                       $sub2 = 'sub_' . ( $this->subqueryId + 1 );
+                       $this->subqueryId += 2;
                        if ( !$s1 ) {
                                // wat
                                throw new DBUnexpectedError( $this, "Attempting to LIMIT a non-SELECT query\n" );
@@ -953,7 +962,7 @@ class DatabaseMssql extends Database {
         * @return string Version information from the database
         */
        public function getServerVersion() {
-               $server_info = sqlsrv_server_info( $this->mConn );
+               $server_info = sqlsrv_server_info( $this->conn );
                $version = 'Error';
                if ( isset( $server_info['SQLServerVersion'] ) ) {
                        $version = $server_info['SQLServerVersion'];
@@ -977,7 +986,7 @@ class DatabaseMssql extends Database {
                }
 
                if ( $schema === false ) {
-                       $schema = $this->mSchema;
+                       $schema = $this->schema;
                }
 
                $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
@@ -1042,8 +1051,8 @@ class DatabaseMssql extends Database {
         * @param string $fname
         */
        protected function doBegin( $fname = __METHOD__ ) {
-               sqlsrv_begin_transaction( $this->mConn );
-               $this->mTrxLevel = 1;
+               sqlsrv_begin_transaction( $this->conn );
+               $this->trxLevel = 1;
        }
 
        /**
@@ -1051,8 +1060,8 @@ class DatabaseMssql extends Database {
         * @param string $fname
         */
        protected function doCommit( $fname = __METHOD__ ) {
-               sqlsrv_commit( $this->mConn );
-               $this->mTrxLevel = 0;
+               sqlsrv_commit( $this->conn );
+               $this->trxLevel = 0;
        }
 
        /**
@@ -1061,8 +1070,8 @@ class DatabaseMssql extends Database {
         * @param string $fname
         */
        protected function doRollback( $fname = __METHOD__ ) {
-               sqlsrv_rollback( $this->mConn );
-               $this->mTrxLevel = 0;
+               sqlsrv_rollback( $this->conn );
+               $this->trxLevel = 0;
        }
 
        /**
@@ -1131,7 +1140,7 @@ class DatabaseMssql extends Database {
         */
        public function selectDB( $db ) {
                try {
-                       $this->mDBname = $db;
+                       $this->dbName = $db;
                        $this->query( "USE $db" );
                        return true;
                } catch ( Exception $e ) {
@@ -1204,8 +1213,8 @@ class DatabaseMssql extends Database {
        public function buildGroupConcatField( $delim, $table, $field, $conds = '',
                $join_conds = []
        ) {
-               $gcsq = 'gcsq_' . $this->mSubqueryId;
-               $this->mSubqueryId++;
+               $gcsq = 'gcsq_' . $this->subqueryId;
+               $this->subqueryId++;
 
                $delimLen = strlen( $delim );
                $fld = "{$field} + {$this->addQuotes( $delim )}";
@@ -1226,12 +1235,12 @@ class DatabaseMssql extends Database {
                $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
                $tableRaw = array_pop( $tableRawArr );
 
-               if ( $this->mBinaryColumnCache === null ) {
+               if ( $this->binaryColumnCache === null ) {
                        $this->populateColumnCaches();
                }
 
-               return isset( $this->mBinaryColumnCache[$tableRaw] )
-                       ? $this->mBinaryColumnCache[$tableRaw]
+               return isset( $this->binaryColumnCache[$tableRaw] )
+                       ? $this->binaryColumnCache[$tableRaw]
                        : [];
        }
 
@@ -1243,30 +1252,30 @@ class DatabaseMssql extends Database {
                $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
                $tableRaw = array_pop( $tableRawArr );
 
-               if ( $this->mBitColumnCache === null ) {
+               if ( $this->bitColumnCache === null ) {
                        $this->populateColumnCaches();
                }
 
-               return isset( $this->mBitColumnCache[$tableRaw] )
-                       ? $this->mBitColumnCache[$tableRaw]
+               return isset( $this->bitColumnCache[$tableRaw] )
+                       ? $this->bitColumnCache[$tableRaw]
                        : [];
        }
 
        private function populateColumnCaches() {
                $res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*',
                        [
-                               'TABLE_CATALOG' => $this->mDBname,
-                               'TABLE_SCHEMA' => $this->mSchema,
+                               'TABLE_CATALOG' => $this->dbName,
+                               'TABLE_SCHEMA' => $this->schema,
                                'DATA_TYPE' => [ 'varbinary', 'binary', 'image', 'bit' ]
                        ] );
 
-               $this->mBinaryColumnCache = [];
-               $this->mBitColumnCache = [];
+               $this->binaryColumnCache = [];
+               $this->bitColumnCache = [];
                foreach ( $res as $row ) {
                        if ( $row->DATA_TYPE == 'bit' ) {
-                               $this->mBitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
+                               $this->bitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
                        } else {
-                               $this->mBinaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
+                               $this->binaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
                        }
                }
        }
@@ -1330,9 +1339,9 @@ class DatabaseMssql extends Database {
         * @return bool|null
         */
        public function prepareStatements( $value = null ) {
-               $old = $this->mPrepareStatements;
+               $old = $this->prepareStatements;
                if ( $value !== null ) {
-                       $this->mPrepareStatements = $value;
+                       $this->prepareStatements = $value;
                }
 
                return $old;
@@ -1345,9 +1354,9 @@ class DatabaseMssql extends Database {
         * @return bool|null
         */
        public function scrollableCursor( $value = null ) {
-               $old = $this->mScrollableCursor;
+               $old = $this->scrollableCursor;
                if ( $value !== null ) {
-                       $this->mScrollableCursor = $value;
+                       $this->scrollableCursor = $value;
                }
 
                return $old;
index fcedf56..57b7544 100644 (file)
@@ -24,7 +24,7 @@ namespace Wikimedia\Rdbms;
 
 use DateTime;
 use DateTimeZone;
-use MediaWiki;
+use Wikimedia;
 use InvalidArgumentException;
 use Exception;
 use stdClass;
@@ -60,6 +60,8 @@ abstract class DatabaseMysqlBase extends Database {
        protected $sqlMode;
        /** @var bool Use experimental UTF-8 transmission encoding */
        protected $utf8Mode;
+       /** @var bool|null */
+       protected $defaultBigSelects = null;
 
        /** @var string|null */
        private $serverVersion = null;
@@ -126,14 +128,14 @@ abstract class DatabaseMysqlBase extends Database {
                # Close/unset connection handle
                $this->close();
 
-               $this->mServer = $server;
-               $this->mUser = $user;
-               $this->mPassword = $password;
-               $this->mDBname = $dbName;
+               $this->server = $server;
+               $this->user = $user;
+               $this->password = $password;
+               $this->dbName = $dbName;
 
                $this->installErrorHandler();
                try {
-                       $this->mConn = $this->mysqlConnect( $this->mServer );
+                       $this->conn = $this->mysqlConnect( $this->server );
                } catch ( Exception $ex ) {
                        $this->restoreErrorHandler();
                        throw $ex;
@@ -141,7 +143,7 @@ abstract class DatabaseMysqlBase extends Database {
                $error = $this->restoreErrorHandler();
 
                # Always log connection errors
-               if ( !$this->mConn ) {
+               if ( !$this->conn ) {
                        if ( !$error ) {
                                $error = $this->lastError();
                        }
@@ -160,9 +162,9 @@ abstract class DatabaseMysqlBase extends Database {
                }
 
                if ( strlen( $dbName ) ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $success = $this->selectDB( $dbName );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( !$success ) {
                                $this->queryLogger->error(
                                        "Error selecting database {db_name} on server {db_server}",
@@ -171,7 +173,7 @@ abstract class DatabaseMysqlBase extends Database {
                                        ] )
                                );
                                $this->queryLogger->debug(
-                                       "Error selecting database $dbName on server {$this->mServer}" );
+                                       "Error selecting database $dbName on server {$this->server}" );
 
                                $this->reportConnectionError( "Error selecting database $dbName" );
                        }
@@ -190,7 +192,7 @@ abstract class DatabaseMysqlBase extends Database {
                }
                // Set any custom settings defined by site config
                // (e.g. https://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html)
-               foreach ( $this->mSessionVars as $var => $val ) {
+               foreach ( $this->sessionVars as $var => $val ) {
                        // Escape strings but not numbers to avoid MySQL complaining
                        if ( !is_int( $val ) && !is_float( $val ) ) {
                                $val = $this->addQuotes( $val );
@@ -213,7 +215,7 @@ abstract class DatabaseMysqlBase extends Database {
                        }
                }
 
-               $this->mOpened = true;
+               $this->opened = true;
 
                return true;
        }
@@ -257,9 +259,9 @@ abstract class DatabaseMysqlBase extends Database {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $ok = $this->mysqlFreeResult( $res );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$ok ) {
                        throw new DBUnexpectedError( $this, "Unable to free MySQL result" );
                }
@@ -282,9 +284,9 @@ abstract class DatabaseMysqlBase extends Database {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $row = $this->mysqlFetchObject( $res );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $errno = $this->lastErrno();
                // Unfortunately, mysql_fetch_object does not reset the last errno.
@@ -318,9 +320,9 @@ abstract class DatabaseMysqlBase extends Database {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $row = $this->mysqlFetchArray( $res );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $errno = $this->lastErrno();
                // Unfortunately, mysql_fetch_array does not reset the last errno.
@@ -354,9 +356,9 @@ abstract class DatabaseMysqlBase extends Database {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $n = $this->mysqlNumRows( $res );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                // Unfortunately, mysql_num_rows does not reset the last errno.
                // We are not checking for any errors here, since
@@ -465,19 +467,19 @@ abstract class DatabaseMysqlBase extends Database {
         * @return string
         */
        public function lastError() {
-               if ( $this->mConn ) {
+               if ( $this->conn ) {
                        # Even if it's non-zero, it can still be invalid
-                       MediaWiki\suppressWarnings();
-                       $error = $this->mysqlError( $this->mConn );
+                       Wikimedia\suppressWarnings();
+                       $error = $this->mysqlError( $this->conn );
                        if ( !$error ) {
                                $error = $this->mysqlError();
                        }
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                } else {
                        $error = $this->mysqlError();
                }
                if ( $error ) {
-                       $error .= ' (' . $this->mServer . ')';
+                       $error .= ' (' . $this->server . ')';
                }
 
                return $error;
@@ -594,7 +596,7 @@ abstract class DatabaseMysqlBase extends Database {
                list( $database, , $prefix, $table ) = $this->qualifiedTableComponents( $table );
                $tableName = "{$prefix}{$table}";
 
-               if ( isset( $this->mSessionTempTables[$tableName] ) ) {
+               if ( isset( $this->sessionTempTables[$tableName] ) ) {
                        return true; // already known to exist and won't show in SHOW TABLES anyway
                }
 
@@ -889,17 +891,21 @@ abstract class DatabaseMysqlBase extends Database {
                        return 0; // already reached this point for sure
                }
 
-               $useGTID = ( $this->useGTIDs && $pos->gtids );
-
                // Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
-               if ( $useGTID ) {
+               if ( $pos->getGTIDs() ) {
+                       // Ignore GTIDs from domains exclusive to the master DB (presumably inactive)
+                       $rpos = $this->getReplicaPos();
+                       $gtidsWait = $rpos ? MySQLMasterPos::getCommonDomainGTIDs( $pos, $rpos ) : [];
+                       if ( !$gtidsWait ) {
+                               return -1; // $pos is from the wrong cluster?
+                       }
                        // Wait on the GTID set (MariaDB only)
-                       $gtidArg = $this->addQuotes( implode( ',', $pos->gtids ) );
+                       $gtidArg = $this->addQuotes( implode( ',', $gtidsWait ) );
                        $res = $this->doQuery( "SELECT MASTER_GTID_WAIT($gtidArg, $timeout)" );
                } else {
                        // Wait on the binlog coordinates
-                       $encFile = $this->addQuotes( $pos->file );
-                       $encPos = intval( $pos->pos );
+                       $encFile = $this->addQuotes( $pos->getLogFile() );
+                       $encPos = intval( $pos->pos[1] );
                        $res = $this->doQuery( "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)" );
                }
 
@@ -912,7 +918,7 @@ abstract class DatabaseMysqlBase extends Database {
                // Result can be NULL (error), -1 (timeout), or 0+ per the MySQL manual
                $status = ( $row[0] !== null ) ? intval( $row[0] ) : null;
                if ( $status === null ) {
-                       if ( !$useGTID ) {
+                       if ( !$pos->getGTIDs() ) {
                                // T126436: jobs programmed to wait on master positions might be referencing
                                // binlogs with an old master hostname; this makes MASTER_POS_WAIT() return null.
                                // Try to detect this case and treat the replica DB as having reached the given
@@ -938,24 +944,26 @@ abstract class DatabaseMysqlBase extends Database {
         * @return MySQLMasterPos|bool
         */
        public function getReplicaPos() {
-               $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
-               $row = $this->fetchObject( $res );
+               $now = microtime( true );
 
-               if ( $row ) {
-                       $pos = $row->Exec_Master_Log_Pos;
-                       // Also fetch the last-applied GTID set (MariaDB)
-                       if ( $this->useGTIDs ) {
-                               $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'gtid_slave_pos'", __METHOD__ );
-                               $gtidRow = $this->fetchObject( $res );
-                               $gtidSet = $gtidRow ? $gtidRow->Value : '';
-                       } else {
-                               $gtidSet = '';
+               if ( $this->useGTIDs ) {
+                       $res = $this->query( "SELECT @@global.gtid_slave_pos AS Value", __METHOD__ );
+                       $gtidRow = $this->fetchObject( $res );
+                       if ( $gtidRow && strlen( $gtidRow->Value ) ) {
+                               return new MySQLMasterPos( $gtidRow->Value, $now );
                        }
+               }
 
-                       return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos, $gtidSet );
-               } else {
-                       return false;
+               $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
+               $row = $this->fetchObject( $res );
+               if ( $row && strlen( $row->Relay_Master_Log_File ) ) {
+                       return new MySQLMasterPos(
+                               "{$row->Relay_Master_Log_File}/{$row->Exec_Master_Log_Pos}",
+                               $now
+                       );
                }
+
+               return false;
        }
 
        /**
@@ -964,23 +972,23 @@ abstract class DatabaseMysqlBase extends Database {
         * @return MySQLMasterPos|bool
         */
        public function getMasterPos() {
-               $res = $this->query( 'SHOW MASTER STATUS', __METHOD__ );
-               $row = $this->fetchObject( $res );
+               $now = microtime( true );
 
-               if ( $row ) {
-                       // Also fetch the last-written GTID set (MariaDB)
-                       if ( $this->useGTIDs ) {
-                               $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_pos'", __METHOD__ );
-                               $gtidRow = $this->fetchObject( $res );
-                               $gtidSet = $gtidRow ? $gtidRow->Value : '';
-                       } else {
-                               $gtidSet = '';
+               if ( $this->useGTIDs ) {
+                       $res = $this->query( "SELECT @@global.gtid_binlog_pos AS Value", __METHOD__ );
+                       $gtidRow = $this->fetchObject( $res );
+                       if ( $gtidRow && strlen( $gtidRow->Value ) ) {
+                               return new MySQLMasterPos( $gtidRow->Value, $now );
                        }
+               }
 
-                       return new MySQLMasterPos( $row->File, $row->Position, $gtidSet );
-               } else {
-                       return false;
+               $res = $this->query( 'SHOW MASTER STATUS', __METHOD__ );
+               $row = $this->fetchObject( $res );
+               if ( $row && strlen( $row->File ) ) {
+                       return new MySQLMasterPos( "{$row->File}/{$row->Position}", $now );
                }
+
+               return false;
        }
 
        public function serverIsReadOnly() {
@@ -1079,6 +1087,10 @@ abstract class DatabaseMysqlBase extends Database {
         * @since 1.20
         */
        public function lockIsFree( $lockName, $method ) {
+               if ( !parent::lockIsFree( $lockName, $method ) ) {
+                       return false; // already held
+               }
+
                $encName = $this->addQuotes( $this->makeLockName( $lockName ) );
                $result = $this->query( "SELECT IS_FREE_LOCK($encName) AS lockstatus", $method );
                $row = $this->fetchObject( $result );
@@ -1170,14 +1182,14 @@ abstract class DatabaseMysqlBase extends Database {
         */
        public function setBigSelects( $value = true ) {
                if ( $value === 'default' ) {
-                       if ( $this->mDefaultBigSelects === null ) {
+                       if ( $this->defaultBigSelects === null ) {
                                # Function hasn't been called before so it must already be set to the default
                                return;
                        } else {
-                               $value = $this->mDefaultBigSelects;
+                               $value = $this->defaultBigSelects;
                        }
-               } elseif ( $this->mDefaultBigSelects === null ) {
-                       $this->mDefaultBigSelects =
+               } elseif ( $this->defaultBigSelects === null ) {
+                       $this->defaultBigSelects =
                                (bool)$this->selectField( false, '@@sql_big_selects', '', __METHOD__ );
                }
                $encValue = $value ? '1' : '0';
@@ -1376,7 +1388,7 @@ abstract class DatabaseMysqlBase extends Database {
         */
        public function listViews( $prefix = null, $fname = __METHOD__ ) {
                // The name of the column containing the name of the VIEW
-               $propertyName = 'Tables_in_' . $this->mDBname;
+               $propertyName = 'Tables_in_' . $this->dbName;
 
                // Query for the VIEWS
                $res = $this->query( 'SHOW FULL TABLES WHERE TABLE_TYPE = "VIEW"' );
@@ -1445,6 +1457,11 @@ abstract class DatabaseMysqlBase extends Database {
                        return $index;
                }
        }
+
+       protected function isTransactableQuery( $sql ) {
+               return parent::isTransactableQuery( $sql ) &&
+                       !preg_match( '/^SELECT\s+(GET|RELEASE|IS_FREE)_LOCK\(/', $sql );
+       }
 }
 
 class_alias( DatabaseMysqlBase::class, 'DatabaseMysqlBase' );
index 09ea66c..9152d1e 100644 (file)
@@ -86,7 +86,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                $mysqli = mysqli_init();
 
                $connFlags = 0;
-               if ( $this->mFlags & self::DBO_SSL ) {
+               if ( $this->flags & self::DBO_SSL ) {
                        $connFlags |= MYSQLI_CLIENT_SSL;
                        $mysqli->ssl_set(
                                $this->sslKeyPath,
@@ -96,10 +96,10 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                                $this->sslCiphers
                        );
                }
-               if ( $this->mFlags & self::DBO_COMPRESS ) {
+               if ( $this->flags & self::DBO_COMPRESS ) {
                        $connFlags |= MYSQLI_CLIENT_COMPRESS;
                }
-               if ( $this->mFlags & self::DBO_PERSISTENT ) {
+               if ( $this->flags & self::DBO_PERSISTENT ) {
                        $realServer = 'p:' . $realServer;
                }
 
@@ -112,8 +112,8 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                }
                $mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 );
 
-               if ( $mysqli->real_connect( $realServer, $this->mUser,
-                       $this->mPassword, $this->mDBname, $port, $socket, $connFlags )
+               if ( $mysqli->real_connect( $realServer, $this->user,
+                       $this->password, $this->dbName, $port, $socket, $connFlags )
                ) {
                        return $mysqli;
                }
@@ -162,8 +162,8 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return int
         */
        function lastErrno() {
-               if ( $this->mConn ) {
-                       return $this->mConn->errno;
+               if ( $this->conn ) {
+                       return $this->conn->errno;
                } else {
                        return mysqli_connect_errno();
                }
@@ -185,7 +185,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        function selectDB( $db ) {
                $conn = $this->getBindingHandle();
 
-               $this->mDBname = $db;
+               $this->dbName = $db;
 
                return $conn->select_db( $db );
        }
@@ -326,11 +326,11 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return string
         */
        public function __toString() {
-               if ( $this->mConn instanceof mysqli ) {
-                       return (string)$this->mConn->thread_id;
+               if ( $this->conn instanceof mysqli ) {
+                       return (string)$this->conn->thread_id;
                } else {
                        // mConn might be false or something.
-                       return (string)$this->mConn;
+                       return (string)$this->conn;
                }
        }
 }
index 5bf845b..7d34641 100644 (file)
@@ -24,7 +24,7 @@ namespace Wikimedia\Rdbms;
 
 use Wikimedia\Timestamp\ConvertibleTimestamp;
 use Wikimedia\WaitConditionLoop;
-use MediaWiki;
+use Wikimedia;
 use Exception;
 
 /**
@@ -35,16 +35,16 @@ class DatabasePostgres extends Database {
        protected $port;
 
        /** @var resource */
-       protected $mLastResult = null;
+       protected $lastResultHandle = null;
        /** @var int The number of rows affected as an integer */
-       protected $mAffectedRows = null;
+       protected $lastAffectedRowCount = null;
 
        /** @var float|string */
        private $numericVersion = null;
        /** @var string Connect string to open a PostgreSQL connection */
        private $connectString;
        /** @var string */
-       private $mCoreSchema;
+       private $coreSchema;
        /** @var string[] Map of (reserved table name => alternate table name) */
        private $keywordTableMap = [];
 
@@ -97,10 +97,10 @@ class DatabasePostgres extends Database {
                        );
                }
 
-               $this->mServer = $server;
-               $this->mUser = $user;
-               $this->mPassword = $password;
-               $this->mDBname = $dbName;
+               $this->server = $server;
+               $this->user = $user;
+               $this->password = $password;
+               $this->dbName = $dbName;
 
                $connectVars = [
                        // pg_connect() user $user as the default database. Since a database is *required*,
@@ -116,7 +116,7 @@ class DatabasePostgres extends Database {
                if ( (int)$this->port > 0 ) {
                        $connectVars['port'] = (int)$this->port;
                }
-               if ( $this->mFlags & self::DBO_SSL ) {
+               if ( $this->flags & self::DBO_SSL ) {
                        $connectVars['sslmode'] = 1;
                }
 
@@ -126,7 +126,7 @@ class DatabasePostgres extends Database {
 
                try {
                        // Use new connections to let LoadBalancer/LBFactory handle reuse
-                       $this->mConn = pg_connect( $this->connectString, PGSQL_CONNECT_FORCE_NEW );
+                       $this->conn = pg_connect( $this->connectString, PGSQL_CONNECT_FORCE_NEW );
                } catch ( Exception $ex ) {
                        $this->restoreErrorHandler();
                        throw $ex;
@@ -134,7 +134,7 @@ class DatabasePostgres extends Database {
 
                $phpError = $this->restoreErrorHandler();
 
-               if ( !$this->mConn ) {
+               if ( !$this->conn ) {
                        $this->queryLogger->debug(
                                "DB connection error\n" .
                                "Server: $server, Database: $dbName, User: $user, Password: " .
@@ -144,7 +144,7 @@ class DatabasePostgres extends Database {
                        throw new DBConnectionError( $this, str_replace( "\n", ' ', $phpError ) );
                }
 
-               $this->mOpened = true;
+               $this->opened = true;
 
                # If called from the command-line (e.g. importDump), only show errors
                if ( $this->cliMode ) {
@@ -159,11 +159,11 @@ class DatabasePostgres extends Database {
                        $this->query( "SET bytea_output = 'escape'", __METHOD__ ); // PHP bug 53127
                }
 
-               $this->determineCoreSchema( $this->mSchema );
+               $this->determineCoreSchema( $this->schema );
                // The schema to be used is now in the search path; no need for explicit qualification
-               $this->mSchema = '';
+               $this->schema = '';
 
-               return $this->mConn;
+               return $this->conn;
        }
 
        public function databasesAreIndependent() {
@@ -178,8 +178,8 @@ class DatabasePostgres extends Database {
         * @throws DBUnexpectedError
         */
        public function selectDB( $db ) {
-               if ( $this->mDBname !== $db ) {
-                       return (bool)$this->open( $this->mServer, $this->mUser, $this->mPassword, $db );
+               if ( $this->dbName !== $db ) {
+                       return (bool)$this->open( $this->server, $this->user, $this->password, $db );
                } else {
                        return true;
                }
@@ -199,7 +199,12 @@ class DatabasePostgres extends Database {
        }
 
        protected function closeConnection() {
-               return $this->mConn ? pg_close( $this->mConn ) : true;
+               return $this->conn ? pg_close( $this->conn ) : true;
+       }
+
+       protected function isTransactableQuery( $sql ) {
+               return parent::isTransactableQuery( $sql ) &&
+                       !preg_match( '/^SELECT\s+pg_(try_|)advisory_\w+\(/', $sql );
        }
 
        public function doQuery( $sql ) {
@@ -213,13 +218,13 @@ class DatabasePostgres extends Database {
                if ( pg_send_query( $conn, $sql ) === false ) {
                        throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
                }
-               $this->mLastResult = pg_get_result( $conn );
-               $this->mAffectedRows = null;
-               if ( pg_result_error( $this->mLastResult ) ) {
+               $this->lastResultHandle = pg_get_result( $conn );
+               $this->lastAffectedRowCount = null;
+               if ( pg_result_error( $this->lastResultHandle ) ) {
                        return false;
                }
 
-               return $this->mLastResult;
+               return $this->lastResultHandle;
        }
 
        protected function dumpError() {
@@ -239,7 +244,7 @@ class DatabasePostgres extends Database {
                ];
                foreach ( $diags as $d ) {
                        $this->queryLogger->debug( sprintf( "PgSQL ERROR(%d): %s\n",
-                               $d, pg_result_error_field( $this->mLastResult, $d ) ) );
+                               $d, pg_result_error_field( $this->lastResultHandle, $d ) ) );
                }
        }
 
@@ -253,7 +258,7 @@ class DatabasePostgres extends Database {
                        }
                }
                /* Transaction stays in the ERROR state until rolled back */
-               if ( $this->mTrxLevel ) {
+               if ( $this->trxLevel ) {
                        // Throw away the transaction state, then raise the error as normal.
                        // Note that if this connection is managed by LBFactory, it's already expected
                        // that the other transactions LBFactory manages will be rolled back.
@@ -266,9 +271,9 @@ class DatabasePostgres extends Database {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $ok = pg_free_result( $res );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$ok ) {
                        throw new DBUnexpectedError( $this, "Unable to free Postgres result\n" );
                }
@@ -278,9 +283,9 @@ class DatabasePostgres extends Database {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $row = pg_fetch_object( $res );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                # @todo FIXME: HACK HACK HACK HACK debug
 
                # @todo hashar: not sure if the following test really trigger if the object
@@ -300,9 +305,9 @@ class DatabasePostgres extends Database {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $row = pg_fetch_array( $res );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $conn = $this->getBindingHandle();
                if ( pg_last_error( $conn ) ) {
@@ -319,9 +324,9 @@ class DatabasePostgres extends Database {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $n = pg_num_rows( $res );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $conn = $this->getBindingHandle();
                if ( pg_last_error( $conn ) ) {
@@ -365,9 +370,9 @@ class DatabasePostgres extends Database {
        }
 
        public function lastError() {
-               if ( $this->mConn ) {
-                       if ( $this->mLastResult ) {
-                               return pg_result_error( $this->mLastResult );
+               if ( $this->conn ) {
+                       if ( $this->lastResultHandle ) {
+                               return pg_result_error( $this->lastResultHandle );
                        } else {
                                return pg_last_error();
                        }
@@ -377,23 +382,23 @@ class DatabasePostgres extends Database {
        }
 
        public function lastErrno() {
-               if ( $this->mLastResult ) {
-                       return pg_result_error_field( $this->mLastResult, PGSQL_DIAG_SQLSTATE );
+               if ( $this->lastResultHandle ) {
+                       return pg_result_error_field( $this->lastResultHandle, PGSQL_DIAG_SQLSTATE );
                } else {
                        return false;
                }
        }
 
        protected function fetchAffectedRowCount() {
-               if ( !is_null( $this->mAffectedRows ) ) {
+               if ( !is_null( $this->lastAffectedRowCount ) ) {
                        // Forced result for simulated queries
-                       return $this->mAffectedRows;
+                       return $this->lastAffectedRowCount;
                }
-               if ( empty( $this->mLastResult ) ) {
+               if ( empty( $this->lastResultHandle ) ) {
                        return 0;
                }
 
-               return pg_affected_rows( $this->mLastResult );
+               return pg_affected_rows( $this->lastResultHandle );
        }
 
        /**
@@ -639,7 +644,7 @@ __INDEXATTR__;
                                        $tempres = (bool)$this->query( $tempsql, $fname, $savepoint );
 
                                        if ( $savepoint ) {
-                                               $bar = pg_result_error( $this->mLastResult );
+                                               $bar = pg_result_error( $this->lastResultHandle );
                                                if ( $bar != false ) {
                                                        $savepoint->rollback();
                                                } else {
@@ -664,7 +669,7 @@ __INDEXATTR__;
                        $sql .= '(' . $this->makeList( $args ) . ')';
                        $res = (bool)$this->query( $sql, $fname, $savepoint );
                        if ( $savepoint ) {
-                               $bar = pg_result_error( $this->mLastResult );
+                               $bar = pg_result_error( $this->lastResultHandle );
                                if ( $bar != false ) {
                                        $savepoint->rollback();
                                } else {
@@ -678,7 +683,7 @@ __INDEXATTR__;
                        $savepoint->commit();
 
                        // Set the affected row count for the whole operation
-                       $this->mAffectedRows = $numrowsinserted;
+                       $this->lastAffectedRowCount = $numrowsinserted;
 
                        // IGNORE always returns true
                        return true;
@@ -963,7 +968,7 @@ __INDEXATTR__;
                $this->begin( __METHOD__, self::TRANSACTION_INTERNAL );
                if ( $this->schemaExists( $desiredSchema ) ) {
                        if ( in_array( $desiredSchema, $this->getSchemas() ) ) {
-                               $this->mCoreSchema = $desiredSchema;
+                               $this->coreSchema = $desiredSchema;
                                $this->queryLogger->debug(
                                        "Schema \"" . $desiredSchema . "\" already in the search path\n" );
                        } else {
@@ -976,15 +981,15 @@ __INDEXATTR__;
                                array_unshift( $search_path,
                                        $this->addIdentifierQuotes( $desiredSchema ) );
                                $this->setSearchPath( $search_path );
-                               $this->mCoreSchema = $desiredSchema;
+                               $this->coreSchema = $desiredSchema;
                                $this->queryLogger->debug(
                                        "Schema \"" . $desiredSchema . "\" added to the search path\n" );
                        }
                } else {
-                       $this->mCoreSchema = $this->getCurrentSchema();
+                       $this->coreSchema = $this->getCurrentSchema();
                        $this->queryLogger->debug(
                                "Schema \"" . $desiredSchema . "\" not found, using current \"" .
-                               $this->mCoreSchema . "\"\n" );
+                               $this->coreSchema . "\"\n" );
                }
                /* Commit SET otherwise it will be rollbacked on error or IGNORE SELECT */
                $this->commit( __METHOD__, self::FLUSHING_INTERNAL );
@@ -997,7 +1002,7 @@ __INDEXATTR__;
         * @return string Core schema name
         */
        public function getCoreSchema() {
-               return $this->mCoreSchema;
+               return $this->coreSchema;
        }
 
        public function getServerVersion() {
@@ -1255,11 +1260,11 @@ SQL;
        }
 
        public function getDBname() {
-               return $this->mDBname;
+               return $this->dbName;
        }
 
        public function getServer() {
-               return $this->mServer;
+               return $this->server;
        }
 
        public function buildConcat( $stringList ) {
@@ -1319,6 +1324,9 @@ SQL;
        }
 
        public function lockIsFree( $lockName, $method ) {
+               if ( !parent::lockIsFree( $lockName, $method ) ) {
+                       return false; // already held
+               }
                // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
                $result = $this->query( "SELECT (CASE(pg_try_advisory_lock($key))
index 01772cf..58b6ef9 100644 (file)
@@ -46,12 +46,12 @@ class DatabaseSqlite extends Database {
        protected $trxMode;
 
        /** @var int The number of rows affected as an integer */
-       protected $mAffectedRows;
+       protected $lastAffectedRowCount;
        /** @var resource */
-       protected $mLastResult;
+       protected $lastResultHandle;
 
        /** @var PDO */
-       protected $mConn;
+       protected $conn;
 
        /** @var FSLockManager (hopefully on the same server as the DB) */
        protected $lockMgr;
@@ -79,8 +79,8 @@ class DatabaseSqlite extends Database {
                        throw new InvalidArgumentException( "Need 'dbDirectory' or 'dbFilePath' parameter." );
                } else {
                        $this->dbDir = $p['dbDirectory'];
-                       $this->mDBname = $p['dbname'];
-                       $lockDomain = $this->mDBname;
+                       $this->dbName = $p['dbname'];
+                       $lockDomain = $this->dbName;
                        // Stock wiki mode using standard file names per DB.
                        parent::__construct( $p );
                        // Super doesn't open when $user is false, but we can work with $dbName
@@ -153,12 +153,12 @@ class DatabaseSqlite extends Database {
                $this->close();
                $fileName = self::generateFileName( $this->dbDir, $dbName );
                if ( !is_readable( $fileName ) ) {
-                       $this->mConn = false;
+                       $this->conn = false;
                        throw new DBConnectionError( $this, "SQLite database not accessible" );
                }
                $this->openFile( $fileName );
 
-               return (bool)$this->mConn;
+               return (bool)$this->conn;
        }
 
        /**
@@ -173,29 +173,29 @@ class DatabaseSqlite extends Database {
 
                $this->dbPath = $fileName;
                try {
-                       if ( $this->mFlags & self::DBO_PERSISTENT ) {
-                               $this->mConn = new PDO( "sqlite:$fileName", '', '',
+                       if ( $this->flags & self::DBO_PERSISTENT ) {
+                               $this->conn = new PDO( "sqlite:$fileName", '', '',
                                        [ PDO::ATTR_PERSISTENT => true ] );
                        } else {
-                               $this->mConn = new PDO( "sqlite:$fileName", '', '' );
+                               $this->conn = new PDO( "sqlite:$fileName", '', '' );
                        }
                } catch ( PDOException $e ) {
                        $err = $e->getMessage();
                }
 
-               if ( !$this->mConn ) {
+               if ( !$this->conn ) {
                        $this->queryLogger->debug( "DB connection error: $err\n" );
                        throw new DBConnectionError( $this, $err );
                }
 
-               $this->mOpened = !!$this->mConn;
-               if ( $this->mOpened ) {
+               $this->opened = !!$this->conn;
+               if ( $this->opened ) {
                        # Set error codes only, don't raise exceptions
-                       $this->mConn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
+                       $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
                        # Enforce LIKE to be case sensitive, just like MySQL
                        $this->query( 'PRAGMA case_sensitive_like = 1' );
 
-                       return $this->mConn;
+                       return $this->conn;
                }
 
                return false;
@@ -218,7 +218,7 @@ class DatabaseSqlite extends Database {
         * @return bool
         */
        protected function closeConnection() {
-               $this->mConn = null;
+               $this->conn = null;
 
                return true;
        }
@@ -311,13 +311,13 @@ class DatabaseSqlite extends Database {
         * @return bool|ResultWrapper
         */
        protected function doQuery( $sql ) {
-               $res = $this->mConn->query( $sql );
+               $res = $this->conn->query( $sql );
                if ( $res === false ) {
                        return false;
                }
 
                $r = $res instanceof ResultWrapper ? $res->result : $res;
-               $this->mAffectedRows = $r->rowCount();
+               $this->lastAffectedRowCount = $r->rowCount();
                $res = new ResultWrapper( $this, $r->fetchAll() );
 
                return $res;
@@ -447,7 +447,7 @@ class DatabaseSqlite extends Database {
         */
        function insertId() {
                // PDO::lastInsertId yields a string :(
-               return intval( $this->mConn->lastInsertId() );
+               return intval( $this->conn->lastInsertId() );
        }
 
        /**
@@ -472,10 +472,10 @@ class DatabaseSqlite extends Database {
         * @return string
         */
        function lastError() {
-               if ( !is_object( $this->mConn ) ) {
+               if ( !is_object( $this->conn ) ) {
                        return "Cannot return last error, no db connection";
                }
-               $e = $this->mConn->errorInfo();
+               $e = $this->conn->errorInfo();
 
                return isset( $e[2] ) ? $e[2] : '';
        }
@@ -484,10 +484,10 @@ class DatabaseSqlite extends Database {
         * @return string
         */
        function lastErrno() {
-               if ( !is_object( $this->mConn ) ) {
+               if ( !is_object( $this->conn ) ) {
                        return "Cannot return last error, no db connection";
                } else {
-                       $info = $this->mConn->errorInfo();
+                       $info = $this->conn->errorInfo();
 
                        return $info[1];
                }
@@ -497,7 +497,7 @@ class DatabaseSqlite extends Database {
         * @return int
         */
        protected function fetchAffectedRowCount() {
-               return $this->mAffectedRows;
+               return $this->lastAffectedRowCount;
        }
 
        /**
@@ -720,7 +720,7 @@ class DatabaseSqlite extends Database {
         * @return string Version information from the database
         */
        function getServerVersion() {
-               $ver = $this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
+               $ver = $this->conn->getAttribute( PDO::ATTR_SERVER_VERSION );
 
                return $ver;
        }
@@ -752,7 +752,7 @@ class DatabaseSqlite extends Database {
                } else {
                        $this->query( 'BEGIN', $fname );
                }
-               $this->mTrxLevel = 1;
+               $this->trxLevel = 1;
        }
 
        /**
@@ -810,7 +810,7 @@ class DatabaseSqlite extends Database {
                        );
                        return "x'" . bin2hex( (string)$s ) . "'";
                } else {
-                       return $this->mConn->quote( (string)$s );
+                       return $this->conn->quote( (string)$s );
                }
        }
 
@@ -1054,7 +1054,7 @@ class DatabaseSqlite extends Database {
         * @return string
         */
        public function __toString() {
-               return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
+               return 'SQLite ' . (string)$this->conn->getAttribute( PDO::ATTR_SERVER_VERSION );
        }
 }
 
index 0964dd5..d59bee3 100644 (file)
@@ -1776,7 +1776,7 @@ interface IDatabase {
        public function setSchemaVars( $vars );
 
        /**
-        * Check to see if a named lock is available (non-blocking)
+        * Check to see if a named lock is not locked by any thread (non-blocking)
         *
         * @param string $lockName Name of lock to poll
         * @param string $method Name of method calling us
index 9ca6b11..2ee9068 100644 (file)
@@ -13,9 +13,9 @@ use InvalidArgumentException;
  *    that GTID sets are complete (e.g. include all domains on the server).
  */
 class MySQLMasterPos implements DBMasterPos {
-       /** @var string Binlog file */
-       public $file;
-       /** @var int Binglog file position */
+       /** @var string|null Binlog file base name */
+       public $binlog;
+       /** @var int[]|null Binglog file position tuple */
        public $pos;
        /** @var string[] GTID list */
        public $gtids = [];
@@ -23,29 +23,35 @@ class MySQLMasterPos implements DBMasterPos {
        public $asOfTime = 0.0;
 
        /**
-        * @param string $file Binlog file name
-        * @param int $pos Binlog position
-        * @param string $gtid Comma separated GTID set [optional]
+        * @param string $position One of (comma separated GTID list, <binlog file>/<integer>)
+        * @param float $asOfTime UNIX timestamp
         */
-       function __construct( $file, $pos, $gtid = '' ) {
-               $this->file = $file;
-               $this->pos = $pos;
-               $this->gtids = array_map( 'trim', explode( ',', $gtid ) );
-               $this->asOfTime = microtime( true );
-       }
+       public function __construct( $position, $asOfTime ) {
+               $m = [];
+               if ( preg_match( '!^(.+)\.(\d+)/(\d+)$!', $position, $m ) ) {
+                       $this->binlog = $m[1]; // ideally something like host name
+                       $this->pos = [ (int)$m[2], (int)$m[3] ];
+               } else {
+                       $gtids = array_filter( array_map( 'trim', explode( ',', $position ) ) );
+                       foreach ( $gtids as $gtid ) {
+                               if ( !$this->parseGTID( $gtid ) ) {
+                                       throw new InvalidArgumentException( "Invalid GTID '$gtid'." );
+                               }
+                               $this->gtids[] = $gtid;
+                       }
+                       if ( !$this->gtids ) {
+                               throw new InvalidArgumentException( "Got empty GTID set." );
+                       }
+               }
 
-       /**
-        * @return string <binlog file>/<position>, e.g db1034-bin.000976/843431247
-        */
-       function __toString() {
-               return "{$this->file}/{$this->pos}";
+               $this->asOfTime = $asOfTime;
        }
 
-       function asOfTime() {
+       public function asOfTime() {
                return $this->asOfTime;
        }
 
-       function hasReached( DBMasterPos $pos ) {
+       public function hasReached( DBMasterPos $pos ) {
                if ( !( $pos instanceof self ) ) {
                        throw new InvalidArgumentException( "Position not an instance of " . __CLASS__ );
                }
@@ -54,14 +60,18 @@ class MySQLMasterPos implements DBMasterPos {
                $thisPosByDomain = $this->getGtidCoordinates();
                $thatPosByDomain = $pos->getGtidCoordinates();
                if ( $thisPosByDomain && $thatPosByDomain ) {
-                       $reached = true;
-                       // Check that this has positions GTE all of those in $pos for all domains in $pos
+                       $comparisons = [];
+                       // Check that this has positions reaching those in $pos for all domains in common
                        foreach ( $thatPosByDomain as $domain => $thatPos ) {
-                               $thisPos = isset( $thisPosByDomain[$domain] ) ? $thisPosByDomain[$domain] : -1;
-                               $reached = $reached && ( $thatPos <= $thisPos );
+                               if ( isset( $thisPosByDomain[$domain] ) ) {
+                                       $comparisons[] = ( $thatPos <= $thisPosByDomain[$domain] );
+                               }
                        }
-
-                       return $reached;
+                       // Check that $this has a GTID for at least one domain also in $pos; due to MariaDB
+                       // quirks, prior master switch-overs may result in inactive garbage GTIDs that cannot
+                       // be cleaned up. Assume that the domains in both this and $pos cover the relevant
+                       // active channels.
+                       return ( $comparisons && !in_array( false, $comparisons, true ) );
                }
 
                // Fallback to the binlog file comparisons
@@ -75,7 +85,7 @@ class MySQLMasterPos implements DBMasterPos {
                return false;
        }
 
-       function channelsMatch( DBMasterPos $pos ) {
+       public function channelsMatch( DBMasterPos $pos ) {
                if ( !( $pos instanceof self ) ) {
                        throw new InvalidArgumentException( "Position not an instance of " . __CLASS__ );
                }
@@ -84,8 +94,11 @@ class MySQLMasterPos implements DBMasterPos {
                $thisPosDomains = array_keys( $this->getGtidCoordinates() );
                $thatPosDomains = array_keys( $pos->getGtidCoordinates() );
                if ( $thisPosDomains && $thatPosDomains ) {
-                       // Check that this has GTIDs for all domains in $pos
-                       return !array_diff( $thatPosDomains, $thisPosDomains );
+                       // Check that $this has a GTID for at least one domain also in $pos; due to MariaDB
+                       // quirks, prior master switch-overs may result in inactive garbage GTIDs that cannot
+                       // easily be cleaned up. Assume that the domains in both this and $pos cover the
+                       // relevant active channels.
+                       return array_intersect( $thatPosDomains, $thisPosDomains ) ? true : false;
                }
 
                // Fallback to the binlog file comparisons
@@ -96,7 +109,48 @@ class MySQLMasterPos implements DBMasterPos {
        }
 
        /**
-        * @note: this returns false for multi-source replication GTID sets
+        * @return string|null
+        */
+       public function getLogFile() {
+               return $this->gtids ? null : "{$this->binlog}.{$this->pos[0]}";
+       }
+
+       /**
+        * @return string[]
+        */
+       public function getGTIDs() {
+               return $this->gtids;
+       }
+
+       /**
+        * @return string GTID set or <binlog file>/<position> (e.g db1034-bin.000976/843431247)
+        */
+       public function __toString() {
+               return $this->gtids
+                       ? implode( ',', $this->gtids )
+                       : $this->getLogFile() . "/{$this->pos[1]}";
+       }
+
+       /**
+        * @param MySQLMasterPos $pos
+        * @param MySQLMasterPos $refPos
+        * @return string[] List of GTIDs from $pos that have domains in $refPos
+        */
+       public static function getCommonDomainGTIDs( MySQLMasterPos $pos, MySQLMasterPos $refPos ) {
+               $gtidsCommon = [];
+
+               $relevantDomains = $refPos->getGtidCoordinates(); // (domain => unused)
+               foreach ( $pos->gtids as $gtid ) {
+                       list( $domain ) = self::parseGTID( $gtid );
+                       if ( isset( $relevantDomains[$domain] ) ) {
+                               $gtidsCommon[] = $gtid;
+                       }
+               }
+
+               return $gtidsCommon;
+       }
+
+       /**
         * @see https://mariadb.com/kb/en/mariadb/gtid
         * @see https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html
         * @return array Map of (domain => integer position); possibly empty
@@ -104,34 +158,38 @@ class MySQLMasterPos implements DBMasterPos {
        protected function getGtidCoordinates() {
                $gtidInfos = [];
                foreach ( $this->gtids as $gtid ) {
-                       $m = [];
-                       // MariaDB style: <domain>-<server id>-<sequence number>
-                       if ( preg_match( '!^(\d+)-\d+-(\d+)$!', $gtid, $m ) ) {
-                               $gtidInfos[(int)$m[1]] = (int)$m[2];
-                               // MySQL style: <UUID domain>:<sequence number>
-                       } elseif ( preg_match( '!^(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}):(\d+)$!', $gtid, $m ) ) {
-                               $gtidInfos[$m[1]] = (int)$m[2];
-                       } else {
-                               $gtidInfos = [];
-                               break; // unrecognized GTID
-                       }
-
+                       list( $domain, $pos ) = self::parseGTID( $gtid );
+                       $gtidInfos[$domain] = $pos;
                }
 
                return $gtidInfos;
        }
 
+       /**
+        * @param string $gtid
+        * @return array|null [domain, integer position] or null
+        */
+       protected static function parseGTID( $gtid ) {
+               $m = [];
+               if ( preg_match( '!^(\d+)-\d+-(\d+)$!', $gtid, $m ) ) {
+                       // MariaDB style: <domain>-<server id>-<sequence number>
+                       return [ (int)$m[1], (int)$m[2] ];
+               } elseif ( preg_match( '!^(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}):(\d+)$!', $gtid, $m ) ) {
+                       // MySQL style: <UUID domain>:<sequence number>
+                       return [ $m[1], (int)$m[2] ];
+               }
+
+               return null;
+       }
+
        /**
         * @see https://dev.mysql.com/doc/refman/5.7/en/show-master-status.html
         * @see https://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html
         * @return array|bool (binlog, (integer file number, integer position)) or false
         */
        protected function getBinlogCoordinates() {
-               $m = [];
-               if ( preg_match( '!^(.+)\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
-                       return [ 'binlog' => $m[1], 'pos' => [ (int)$m[2], (int)$m[3] ] ];
-               }
-
-               return false;
+               return ( $this->binlog !== null && $this->pos !== null )
+                       ? [ 'binlog' => $this->binlog, 'pos' => $this->pos ]
+                       : false;
        }
 }
index 4b79044..ba79be1 100644 (file)
@@ -6,7 +6,7 @@ use stdClass;
 
 class MssqlResultWrapper extends ResultWrapper {
        /** @var int|null */
-       private $mSeekTo = null;
+       private $seekTo = null;
 
        /**
         * @return stdClass|bool
@@ -14,10 +14,10 @@ class MssqlResultWrapper extends ResultWrapper {
        public function fetchObject() {
                $res = $this->result;
 
-               if ( $this->mSeekTo !== null ) {
+               if ( $this->seekTo !== null ) {
                        $result = sqlsrv_fetch_object( $res, stdClass::class, [],
-                               SQLSRV_SCROLL_ABSOLUTE, $this->mSeekTo );
-                       $this->mSeekTo = null;
+                               SQLSRV_SCROLL_ABSOLUTE, $this->seekTo );
+                       $this->seekTo = null;
                } else {
                        $result = sqlsrv_fetch_object( $res );
                }
@@ -36,10 +36,10 @@ class MssqlResultWrapper extends ResultWrapper {
        public function fetchRow() {
                $res = $this->result;
 
-               if ( $this->mSeekTo !== null ) {
+               if ( $this->seekTo !== null ) {
                        $result = sqlsrv_fetch_array( $res, SQLSRV_FETCH_BOTH,
-                               SQLSRV_SCROLL_ABSOLUTE, $this->mSeekTo );
-                       $this->mSeekTo = null;
+                               SQLSRV_SCROLL_ABSOLUTE, $this->seekTo );
+                       $this->seekTo = null;
                } else {
                        $result = sqlsrv_fetch_array( $res );
                }
@@ -70,7 +70,7 @@ class MssqlResultWrapper extends ResultWrapper {
                }
 
                // Unlike MySQL, the seek actually happens on the next access
-               $this->mSeekTo = $row;
+               $this->seekTo = $row;
                return true;
        }
 }
index e2d685c..7bc3eac 100644 (file)
@@ -4,17 +4,17 @@ namespace Wikimedia\Rdbms;
 
 class Blob implements IBlob {
        /** @var string */
-       protected $mData;
+       protected $data;
 
        /**
         * @param string $data
         */
        public function __construct( $data ) {
-               $this->mData = $data;
+               $this->data = $data;
        }
 
        public function fetch() {
-               return $this->mData;
+               return $this->data;
        }
 }
 
index aacdf40..8e68aba 100644 (file)
@@ -12,11 +12,11 @@ class MssqlBlob extends Blob {
                if ( $data instanceof MssqlBlob ) {
                        return $data;
                } elseif ( $data instanceof Blob ) {
-                       $this->mData = $data->fetch();
+                       $this->data = $data->fetch();
                } elseif ( is_array( $data ) && is_object( $data ) ) {
-                       $this->mData = serialize( $data );
+                       $this->data = serialize( $data );
                } else {
-                       $this->mData = $data;
+                       $this->data = $data;
                }
        }
 
@@ -26,14 +26,14 @@ class MssqlBlob extends Blob {
         * @return string
         */
        public function fetch() {
-               if ( $this->mData === null ) {
+               if ( $this->data === null ) {
                        return 'null';
                }
 
                $ret = '0x';
-               $dataLength = strlen( $this->mData );
+               $dataLength = strlen( $this->data );
                for ( $i = 0; $i < $dataLength; $i++ ) {
-                       $ret .= bin2hex( pack( 'C', ord( $this->mData[$i] ) ) );
+                       $ret .= bin2hex( pack( 'C', ord( $this->data[$i] ) ) );
                }
 
                return $ret;
index e246b79..088c3f2 100644 (file)
@@ -170,15 +170,21 @@ interface ILoadBalancer {
        public function getAnyOpenConnection( $i );
 
        /**
-        * Get a connection by index
+        * Get a connection handle by server index
         *
         * Avoid using CONN_TRX_AUTO with sqlite (e.g. check getServerType() first)
         *
+        * If the caller uses $domain or sets CONN_TRX_AUTO in $flags, then it must also
+        * call ILoadBalancer::reuseConnection() on the handle when finished using it.
+        * In all other cases, this is not necessary, though not harmful either.
+        *
         * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
         * @param int $flags Bitfield of CONN_* class constants
         *
+        * @note This method throws DBAccessError if ILoadBalancer::disable() was called
+        *
         * @throws DBError
         * @return Database
         */
@@ -254,7 +260,11 @@ interface ILoadBalancer {
         *
         * Avoid using CONN_TRX_AUTO with sqlite (e.g. check getServerType() first)
         *
-        * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
+        * If the caller uses $domain or sets CONN_TRX_AUTO in $flags, then it must also
+        * call ILoadBalancer::reuseConnection() on the handle when finished using it.
+        * In all other cases, this is not necessary, though not harmful either.
+        *
+        * @note This method throws DBAccessError if ILoadBalancer::disable() was called
         *
         * @param int $i Server index (does not support DB_MASTER/DB_REPLICA)
         * @param string|bool $domain Domain ID, or false for the current domain
index ce31078..ccdb48e 100644 (file)
@@ -39,17 +39,17 @@ use Exception;
  */
 class LoadBalancer implements ILoadBalancer {
        /** @var array[] Map of (server index => server config array) */
-       private $mServers;
+       private $servers;
        /** @var Database[][][] Map of (connection category => server index => IDatabase[]) */
-       private $mConns;
+       private $conns;
        /** @var float[] Map of (server index => weight) */
-       private $mLoads;
+       private $loads;
        /** @var array[] Map of (group => server index => weight) */
-       private $mGroupLoads;
+       private $groupLoads;
        /** @var bool Whether to disregard replica DB lag as a factor in replica DB selection */
-       private $mAllowLagged;
+       private $allowLagged;
        /** @var int Seconds to spend waiting on replica DB lag to resolve */
-       private $mWaitTimeout;
+       private $waitTimeout;
        /** @var array The LoadMonitor configuration */
        private $loadMonitorConfig;
        /** @var array[] $aliases Map of (table => (dbname, schema, prefix) map) */
@@ -79,15 +79,15 @@ class LoadBalancer implements ILoadBalancer {
        /** @var Database DB connection object that caused a problem */
        private $errorConnection;
        /** @var int The generic (not query grouped) replica DB index (of $mServers) */
-       private $mReadIndex;
+       private $readIndex;
        /** @var bool|DBMasterPos False if not set */
-       private $mWaitForPos;
+       private $waitForPos;
        /** @var bool Whether the generic reader fell back to a lagged replica DB */
        private $laggedReplicaMode = false;
        /** @var bool Whether the generic reader fell back to a lagged replica DB */
        private $allReplicasDownMode = false;
        /** @var string The last DB selection or connection error */
-       private $mLastError = 'Unknown error';
+       private $lastError = 'Unknown error';
        /** @var string|bool Reason the LB is read-only or false if not */
        private $readOnlyReason = false;
        /** @var int Total connections opened */
@@ -139,12 +139,12 @@ class LoadBalancer implements ILoadBalancer {
                if ( !isset( $params['servers'] ) ) {
                        throw new InvalidArgumentException( __CLASS__ . ': missing servers parameter' );
                }
-               $this->mServers = $params['servers'];
-               foreach ( $this->mServers as $i => $server ) {
+               $this->servers = $params['servers'];
+               foreach ( $this->servers as $i => $server ) {
                        if ( $i == 0 ) {
-                               $this->mServers[$i]['master'] = true;
+                               $this->servers[$i]['master'] = true;
                        } else {
-                               $this->mServers[$i]['replica'] = true;
+                               $this->servers[$i]['replica'] = true;
                        }
                }
 
@@ -153,12 +153,12 @@ class LoadBalancer implements ILoadBalancer {
                        : DatabaseDomain::newUnspecified();
                $this->setLocalDomain( $localDomain );
 
-               $this->mWaitTimeout = isset( $params['waitTimeout'] )
+               $this->waitTimeout = isset( $params['waitTimeout'] )
                        ? $params['waitTimeout']
                        : self::MAX_WAIT_DEFAULT;
 
-               $this->mReadIndex = -1;
-               $this->mConns = [
+               $this->readIndex = -1;
+               $this->conns = [
                        // Connection were transaction rounds may be applied
                        self::KEY_LOCAL => [],
                        self::KEY_FOREIGN_INUSE => [],
@@ -168,9 +168,9 @@ class LoadBalancer implements ILoadBalancer {
                        self::KEY_FOREIGN_INUSE_NOROUND => [],
                        self::KEY_FOREIGN_FREE_NOROUND => []
                ];
-               $this->mLoads = [];
-               $this->mWaitForPos = false;
-               $this->mAllowLagged = false;
+               $this->loads = [];
+               $this->waitForPos = false;
+               $this->allowLagged = false;
 
                if ( isset( $params['readOnlyReason'] ) && is_string( $params['readOnlyReason'] ) ) {
                        $this->readOnlyReason = $params['readOnlyReason'];
@@ -188,13 +188,13 @@ class LoadBalancer implements ILoadBalancer {
                $this->loadMonitorConfig += [ 'lagWarnThreshold' => $this->maxLag ];
 
                foreach ( $params['servers'] as $i => $server ) {
-                       $this->mLoads[$i] = $server['load'];
+                       $this->loads[$i] = $server['load'];
                        if ( isset( $server['groupLoads'] ) ) {
                                foreach ( $server['groupLoads'] as $group => $ratio ) {
-                                       if ( !isset( $this->mGroupLoads[$group] ) ) {
-                                               $this->mGroupLoads[$group] = [];
+                                       if ( !isset( $this->groupLoads[$group] ) ) {
+                                               $this->groupLoads[$group] = [];
                                        }
-                                       $this->mGroupLoads[$group][$i] = $ratio;
+                                       $this->groupLoads[$group][$i] = $ratio;
                                }
                        }
                }
@@ -289,8 +289,8 @@ class LoadBalancer implements ILoadBalancer {
                foreach ( $lags as $i => $lag ) {
                        if ( $i != 0 ) {
                                # How much lag this server nominally is allowed to have
-                               $maxServerLag = isset( $this->mServers[$i]['max lag'] )
-                                       ? $this->mServers[$i]['max lag']
+                               $maxServerLag = isset( $this->servers[$i]['max lag'] )
+                                       ? $this->servers[$i]['max lag']
                                        : $this->maxLag; // default
                                # Constrain that futher by $maxLag argument
                                $maxServerLag = min( $maxServerLag, $maxLag );
@@ -332,18 +332,18 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function getReaderIndex( $group = false, $domain = false ) {
-               if ( count( $this->mServers ) == 1 ) {
+               if ( count( $this->servers ) == 1 ) {
                        // Skip the load balancing if there's only one server
                        return $this->getWriterIndex();
-               } elseif ( $group === false && $this->mReadIndex >= 0 ) {
+               } elseif ( $group === false && $this->readIndex >= 0 ) {
                        // Shortcut if the generic reader index was already cached
-                       return $this->mReadIndex;
+                       return $this->readIndex;
                }
 
                if ( $group !== false ) {
                        // Use the server weight array for this load group
-                       if ( isset( $this->mGroupLoads[$group] ) ) {
-                               $loads = $this->mGroupLoads[$group];
+                       if ( isset( $this->groupLoads[$group] ) ) {
+                               $loads = $this->groupLoads[$group];
                        } else {
                                // No loads for this group, return false and the caller can use some other group
                                $this->connLogger->info( __METHOD__ . ": no loads for group $group" );
@@ -352,7 +352,7 @@ class LoadBalancer implements ILoadBalancer {
                        }
                } else {
                        // Use the generic load group
-                       $loads = $this->mLoads;
+                       $loads = $this->loads;
                }
 
                // Scale the configured load ratios according to each server's load and state
@@ -365,7 +365,7 @@ class LoadBalancer implements ILoadBalancer {
                        return false;
                }
 
-               if ( $this->mWaitForPos && $i != $this->getWriterIndex() ) {
+               if ( $this->waitForPos && $i != $this->getWriterIndex() ) {
                        // Before any data queries are run, wait for the server to catch up to the
                        // specified position. This is used to improve session consistency. Note that
                        // when LoadBalancer::waitFor() sets mWaitForPos, the waiting triggers here,
@@ -375,9 +375,9 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
-               if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
+               if ( $this->readIndex <= 0 && $this->loads[$i] > 0 && $group === false ) {
                        // Cache the generic reader index for future ungrouped DB_REPLICA handles
-                       $this->mReadIndex = $i;
+                       $this->readIndex = $i;
                        // Record if the generic reader index is in "lagged replica DB" mode
                        if ( $laggedReplicaMode ) {
                                $this->laggedReplicaMode = true;
@@ -408,15 +408,15 @@ class LoadBalancer implements ILoadBalancer {
                // Quickly look through the available servers for a server that meets criteria...
                $currentLoads = $loads;
                while ( count( $currentLoads ) ) {
-                       if ( $this->mAllowLagged || $laggedReplicaMode ) {
+                       if ( $this->allowLagged || $laggedReplicaMode ) {
                                $i = ArrayUtils::pickRandom( $currentLoads );
                        } else {
                                $i = false;
-                               if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) {
+                               if ( $this->waitForPos && $this->waitForPos->asOfTime() ) {
                                        // ChronologyProtecter sets mWaitForPos for session consistency.
                                        // This triggers doWait() after connect, so it's especially good to
                                        // avoid lagged servers so as to avoid excessive delay in that method.
-                                       $ago = microtime( true ) - $this->mWaitForPos->asOfTime();
+                                       $ago = microtime( true ) - $this->waitForPos->asOfTime();
                                        // Aim for <= 1 second of waiting (being too picky can backfire)
                                        $i = $this->getRandomNonLagged( $currentLoads, $domain, $ago + 1 );
                                }
@@ -471,11 +471,11 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function waitFor( $pos ) {
-               $oldPos = $this->mWaitForPos;
+               $oldPos = $this->waitForPos;
                try {
-                       $this->mWaitForPos = $pos;
+                       $this->waitForPos = $pos;
                        // If a generic reader connection was already established, then wait now
-                       $i = $this->mReadIndex;
+                       $i = $this->readIndex;
                        if ( $i > 0 ) {
                                if ( !$this->doWait( $i ) ) {
                                        $this->laggedReplicaMode = true;
@@ -488,14 +488,14 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function waitForOne( $pos, $timeout = null ) {
-               $oldPos = $this->mWaitForPos;
+               $oldPos = $this->waitForPos;
                try {
-                       $this->mWaitForPos = $pos;
+                       $this->waitForPos = $pos;
 
-                       $i = $this->mReadIndex;
+                       $i = $this->readIndex;
                        if ( $i <= 0 ) {
                                // Pick a generic replica DB if there isn't one yet
-                               $readLoads = $this->mLoads;
+                               $readLoads = $this->loads;
                                unset( $readLoads[$this->getWriterIndex()] ); // replica DBs only
                                $readLoads = array_filter( $readLoads ); // with non-zero load
                                $i = ArrayUtils::pickRandom( $readLoads );
@@ -508,23 +508,23 @@ class LoadBalancer implements ILoadBalancer {
                        }
                } finally {
                        # Restore the old position, as this is not used for lag-protection but for throttling
-                       $this->mWaitForPos = $oldPos;
+                       $this->waitForPos = $oldPos;
                }
 
                return $ok;
        }
 
        public function waitForAll( $pos, $timeout = null ) {
-               $timeout = $timeout ?: $this->mWaitTimeout;
+               $timeout = $timeout ?: $this->waitTimeout;
 
-               $oldPos = $this->mWaitForPos;
+               $oldPos = $this->waitForPos;
                try {
-                       $this->mWaitForPos = $pos;
-                       $serverCount = count( $this->mServers );
+                       $this->waitForPos = $pos;
+                       $serverCount = count( $this->servers );
 
                        $ok = true;
                        for ( $i = 1; $i < $serverCount; $i++ ) {
-                               if ( $this->mLoads[$i] > 0 ) {
+                               if ( $this->loads[$i] > 0 ) {
                                        $start = microtime( true );
                                        $ok = $this->doWait( $i, true, $timeout ) && $ok;
                                        $timeout -= ( microtime( true ) - $start );
@@ -535,7 +535,7 @@ class LoadBalancer implements ILoadBalancer {
                        }
                } finally {
                        # Restore the old position, as this is not used for lag-protection but for throttling
-                       $this->mWaitForPos = $oldPos;
+                       $this->waitForPos = $oldPos;
                }
 
                return $ok;
@@ -549,8 +549,8 @@ class LoadBalancer implements ILoadBalancer {
                        return;
                }
 
-               if ( !$this->mWaitForPos || $pos->hasReached( $this->mWaitForPos ) ) {
-                       $this->mWaitForPos = $pos;
+               if ( !$this->waitForPos || $pos->hasReached( $this->waitForPos ) ) {
+                       $this->waitForPos = $pos;
                }
        }
 
@@ -559,7 +559,7 @@ class LoadBalancer implements ILoadBalancer {
         * @return IDatabase|bool
         */
        public function getAnyOpenConnection( $i ) {
-               foreach ( $this->mConns as $connsByServer ) {
+               foreach ( $this->conns as $connsByServer ) {
                        if ( !empty( $connsByServer[$i] ) ) {
                                /** @var IDatabase[] $serverConns */
                                $serverConns = $connsByServer[$i];
@@ -575,11 +575,11 @@ class LoadBalancer implements ILoadBalancer {
         * Wait for a given replica DB to catch up to the master pos stored in $this
         * @param int $index Server index
         * @param bool $open Check the server even if a new connection has to be made
-        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @param int $timeout Max seconds to wait; default is "waitTimeout" given to __construct()
         * @return bool
         */
        protected function doWait( $index, $open = false, $timeout = null ) {
-               $timeout = max( 1, $timeout ?: $this->mWaitTimeout );
+               $timeout = max( 1, $timeout ?: $this->waitTimeout );
 
                // Check if we already know that the DB has reached this point
                $server = $this->getServerName( $index );
@@ -588,7 +588,7 @@ class LoadBalancer implements ILoadBalancer {
                $knownReachedPos = $this->srvCache->get( $key );
                if (
                        $knownReachedPos instanceof DBMasterPos &&
-                       $knownReachedPos->hasReached( $this->mWaitForPos )
+                       $knownReachedPos->hasReached( $this->waitForPos )
                ) {
                        $this->replLogger->debug(
                                __METHOD__ .
@@ -631,14 +631,14 @@ class LoadBalancer implements ILoadBalancer {
                        [ 'dbserver' => $server ]
                );
 
-               $result = $conn->masterPosWait( $this->mWaitForPos, $timeout );
+               $result = $conn->masterPosWait( $this->waitForPos, $timeout );
 
                if ( $result === null ) {
                        $this->replLogger->warning(
                                __METHOD__ . ': Errored out waiting on {host} pos {pos}',
                                [
                                        'host' => $server,
-                                       'pos' => $this->mWaitForPos,
+                                       'pos' => $this->waitForPos,
                                        'trace' => ( new RuntimeException() )->getTraceAsString()
                                ]
                        );
@@ -648,7 +648,7 @@ class LoadBalancer implements ILoadBalancer {
                                __METHOD__ . ': Timed out waiting on {host} pos {pos}',
                                [
                                        'host' => $server,
-                                       'pos' => $this->mWaitForPos,
+                                       'pos' => $this->waitForPos,
                                        'trace' => ( new RuntimeException() )->getTraceAsString()
                                ]
                        );
@@ -657,7 +657,7 @@ class LoadBalancer implements ILoadBalancer {
                        $this->replLogger->info( __METHOD__ . ": Done" );
                        $ok = true;
                        // Remember that the DB reached this point
-                       $this->srvCache->set( $key, $this->mWaitForPos, BagOStuff::TTL_DAY );
+                       $this->srvCache->set( $key, $this->waitForPos, BagOStuff::TTL_DAY );
                }
 
                if ( $close ) {
@@ -699,14 +699,14 @@ class LoadBalancer implements ILoadBalancer {
 
                # Operation-based index
                if ( $i == self::DB_REPLICA ) {
-                       $this->mLastError = 'Unknown error'; // reset error string
+                       $this->lastError = 'Unknown error'; // reset error string
                        # Try the general server pool if $groups are unavailable.
                        $i = ( $groups === [ false ] )
                                ? false // don't bother with this if that is what was tried above
                                : $this->getReaderIndex( false, $domain );
                        # Couldn't find a working server in getReaderIndex()?
                        if ( $i === false ) {
-                               $this->mLastError = 'No working replica DB server: ' . $this->mLastError;
+                               $this->lastError = 'No working replica DB server: ' . $this->lastError;
                                // Throw an exception
                                $this->reportConnectionError();
                                return null; // not reached
@@ -773,20 +773,20 @@ class LoadBalancer implements ILoadBalancer {
                }
 
                $domain = $conn->getDomainID();
-               if ( !isset( $this->mConns[$connInUseKey][$serverIndex][$domain] ) ) {
+               if ( !isset( $this->conns[$connInUseKey][$serverIndex][$domain] ) ) {
                        throw new InvalidArgumentException( __METHOD__ .
                                ": connection $serverIndex/$domain not found; it may have already been freed." );
-               } elseif ( $this->mConns[$connInUseKey][$serverIndex][$domain] !== $conn ) {
+               } elseif ( $this->conns[$connInUseKey][$serverIndex][$domain] !== $conn ) {
                        throw new InvalidArgumentException( __METHOD__ .
                                ": connection $serverIndex/$domain mismatched; it may have already been freed." );
                }
 
                $conn->setLBInfo( 'foreignPoolRefCount', --$refCount );
                if ( $refCount <= 0 ) {
-                       $this->mConns[$connFreeKey][$serverIndex][$domain] = $conn;
-                       unset( $this->mConns[$connInUseKey][$serverIndex][$domain] );
-                       if ( !$this->mConns[$connInUseKey][$serverIndex] ) {
-                               unset( $this->mConns[$connInUseKey][$serverIndex] ); // clean up
+                       $this->conns[$connFreeKey][$serverIndex][$domain] = $conn;
+                       unset( $this->conns[$connInUseKey][$serverIndex][$domain] );
+                       if ( !$this->conns[$connInUseKey][$serverIndex] ) {
+                               unset( $this->conns[$connInUseKey][$serverIndex] ); // clean up
                        }
                        $this->connLogger->debug( __METHOD__ . ": freed connection $serverIndex/$domain" );
                } else {
@@ -838,14 +838,14 @@ class LoadBalancer implements ILoadBalancer {
                } else {
                        // Connection is to the local domain
                        $connKey = $autoCommit ? self::KEY_LOCAL_NOROUND : self::KEY_LOCAL;
-                       if ( isset( $this->mConns[$connKey][$i][0] ) ) {
-                               $conn = $this->mConns[$connKey][$i][0];
+                       if ( isset( $this->conns[$connKey][$i][0] ) ) {
+                               $conn = $this->conns[$connKey][$i][0];
                        } else {
-                               if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) {
+                               if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
                                        throw new InvalidArgumentException( "No server with index '$i'." );
                                }
                                // Open a new connection
-                               $server = $this->mServers[$i];
+                               $server = $this->servers[$i];
                                $server['serverIndex'] = $i;
                                $server['autoCommitOnly'] = $autoCommit;
                                if ( $this->localDomain->getDatabase() !== null ) {
@@ -856,7 +856,7 @@ class LoadBalancer implements ILoadBalancer {
                                $host = $this->getServerName( $i );
                                if ( $conn->isOpen() ) {
                                        $this->connLogger->debug( "Connected to database $i at '$host'." );
-                                       $this->mConns[$connKey][$i][0] = $conn;
+                                       $this->conns[$connKey][$i][0] = $conn;
                                } else {
                                        $this->connLogger->warning( "Failed to connect to database $i at '$host'." );
                                        $this->errorConnection = $conn;
@@ -916,39 +916,39 @@ class LoadBalancer implements ILoadBalancer {
                        $connInUseKey = self::KEY_FOREIGN_INUSE;
                }
 
-               if ( isset( $this->mConns[$connInUseKey][$i][$domain] ) ) {
+               if ( isset( $this->conns[$connInUseKey][$i][$domain] ) ) {
                        // Reuse an in-use connection for the same domain
-                       $conn = $this->mConns[$connInUseKey][$i][$domain];
+                       $conn = $this->conns[$connInUseKey][$i][$domain];
                        $this->connLogger->debug( __METHOD__ . ": reusing connection $i/$domain" );
-               } elseif ( isset( $this->mConns[$connFreeKey][$i][$domain] ) ) {
+               } elseif ( isset( $this->conns[$connFreeKey][$i][$domain] ) ) {
                        // Reuse a free connection for the same domain
-                       $conn = $this->mConns[$connFreeKey][$i][$domain];
-                       unset( $this->mConns[$connFreeKey][$i][$domain] );
-                       $this->mConns[$connInUseKey][$i][$domain] = $conn;
+                       $conn = $this->conns[$connFreeKey][$i][$domain];
+                       unset( $this->conns[$connFreeKey][$i][$domain] );
+                       $this->conns[$connInUseKey][$i][$domain] = $conn;
                        $this->connLogger->debug( __METHOD__ . ": reusing free connection $i/$domain" );
-               } elseif ( !empty( $this->mConns[$connFreeKey][$i] ) ) {
+               } elseif ( !empty( $this->conns[$connFreeKey][$i] ) ) {
                        // Reuse a free connection from another domain
-                       $conn = reset( $this->mConns[$connFreeKey][$i] );
-                       $oldDomain = key( $this->mConns[$connFreeKey][$i] );
+                       $conn = reset( $this->conns[$connFreeKey][$i] );
+                       $oldDomain = key( $this->conns[$connFreeKey][$i] );
                        if ( strlen( $dbName ) && !$conn->selectDB( $dbName ) ) {
-                               $this->mLastError = "Error selecting database '$dbName' on server " .
+                               $this->lastError = "Error selecting database '$dbName' on server " .
                                        $conn->getServer() . " from client host {$this->host}";
                                $this->errorConnection = $conn;
                                $conn = false;
                        } else {
                                $conn->tablePrefix( $prefix );
-                               unset( $this->mConns[$connFreeKey][$i][$oldDomain] );
+                               unset( $this->conns[$connFreeKey][$i][$oldDomain] );
                                // Note that if $domain is an empty string, getDomainID() might not match it
-                               $this->mConns[$connInUseKey][$i][$conn->getDomainId()] = $conn;
+                               $this->conns[$connInUseKey][$i][$conn->getDomainId()] = $conn;
                                $this->connLogger->debug( __METHOD__ .
                                        ": reusing free connection from $oldDomain for $domain" );
                        }
                } else {
-                       if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) {
+                       if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
                                throw new InvalidArgumentException( "No server with index '$i'." );
                        }
                        // Open a new connection
-                       $server = $this->mServers[$i];
+                       $server = $this->servers[$i];
                        $server['serverIndex'] = $i;
                        $server['foreignPoolRefCount'] = 0;
                        $server['foreign'] = true;
@@ -961,7 +961,7 @@ class LoadBalancer implements ILoadBalancer {
                        } else {
                                $conn->tablePrefix( $prefix ); // as specified
                                // Note that if $domain is an empty string, getDomainID() might not match it
-                               $this->mConns[$connInUseKey][$i][$conn->getDomainID()] = $conn;
+                               $this->conns[$connInUseKey][$i][$conn->getDomainID()] = $conn;
                                $this->connLogger->debug( __METHOD__ . ": opened new connection for $i/$domain" );
                        }
                }
@@ -1079,7 +1079,7 @@ class LoadBalancer implements ILoadBalancer {
                $conn = $this->errorConnection; // the connection which caused the error
                $context = [
                        'method' => __METHOD__,
-                       'last_error' => $this->mLastError,
+                       'last_error' => $this->lastError,
                ];
 
                if ( $conn instanceof IDatabase ) {
@@ -1090,7 +1090,7 @@ class LoadBalancer implements ILoadBalancer {
                        );
 
                        // throws DBConnectionError
-                       $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" );
+                       $conn->reportConnectionError( "{$this->lastError} ({$context['db_server']})" );
                } else {
                        // No last connection, probably due to all servers being too busy
                        $this->connLogger->error(
@@ -1099,7 +1099,7 @@ class LoadBalancer implements ILoadBalancer {
                        );
 
                        // If all servers were busy, mLastError will contain something sensible
-                       throw new DBConnectionError( null, $this->mLastError );
+                       throw new DBConnectionError( null, $this->lastError );
                }
        }
 
@@ -1108,22 +1108,22 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function haveIndex( $i ) {
-               return array_key_exists( $i, $this->mServers );
+               return array_key_exists( $i, $this->servers );
        }
 
        public function isNonZeroLoad( $i ) {
-               return array_key_exists( $i, $this->mServers ) && $this->mLoads[$i] != 0;
+               return array_key_exists( $i, $this->servers ) && $this->loads[$i] != 0;
        }
 
        public function getServerCount() {
-               return count( $this->mServers );
+               return count( $this->servers );
        }
 
        public function getServerName( $i ) {
-               if ( isset( $this->mServers[$i]['hostName'] ) ) {
-                       $name = $this->mServers[$i]['hostName'];
-               } elseif ( isset( $this->mServers[$i]['host'] ) ) {
-                       $name = $this->mServers[$i]['host'];
+               if ( isset( $this->servers[$i]['hostName'] ) ) {
+                       $name = $this->servers[$i]['hostName'];
+               } elseif ( isset( $this->servers[$i]['host'] ) ) {
+                       $name = $this->servers[$i]['host'];
                } else {
                        $name = '';
                }
@@ -1132,7 +1132,7 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function getServerType( $i ) {
-               return isset( $this->mServers[$i]['type'] ) ? $this->mServers[$i]['type'] : 'unknown';
+               return isset( $this->servers[$i]['type'] ) ? $this->servers[$i]['type'] : 'unknown';
        }
 
        public function getMasterPos() {
@@ -1140,7 +1140,7 @@ class LoadBalancer implements ILoadBalancer {
                # master (however unlikely that may be), then we can fetch the position from the replica DB.
                $masterConn = $this->getAnyOpenConnection( $this->getWriterIndex() );
                if ( !$masterConn ) {
-                       $serverCount = count( $this->mServers );
+                       $serverCount = count( $this->servers );
                        for ( $i = 1; $i < $serverCount; $i++ ) {
                                $conn = $this->getAnyOpenConnection( $i );
                                if ( $conn ) {
@@ -1166,7 +1166,7 @@ class LoadBalancer implements ILoadBalancer {
                        $conn->close();
                } );
 
-               $this->mConns = [
+               $this->conns = [
                        self::KEY_LOCAL => [],
                        self::KEY_FOREIGN_INUSE => [],
                        self::KEY_FOREIGN_FREE => [],
@@ -1179,7 +1179,7 @@ class LoadBalancer implements ILoadBalancer {
 
        public function closeConnection( IDatabase $conn ) {
                $serverIndex = $conn->getLBInfo( 'serverIndex' ); // second index level of mConns
-               foreach ( $this->mConns as $type => $connsByServer ) {
+               foreach ( $this->conns as $type => $connsByServer ) {
                        if ( !isset( $connsByServer[$serverIndex] ) ) {
                                continue;
                        }
@@ -1188,7 +1188,7 @@ class LoadBalancer implements ILoadBalancer {
                                if ( $conn === $trackedConn ) {
                                        $host = $this->getServerName( $i );
                                        $this->connLogger->debug( "Closing connection to database $i at '$host'." );
-                                       unset( $this->mConns[$type][$serverIndex][$i] );
+                                       unset( $this->conns[$type][$serverIndex][$i] );
                                        --$this->connsOpened;
                                        break 2;
                                }
@@ -1448,7 +1448,7 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function hasOrMadeRecentMasterChanges( $age = null ) {
-               $age = ( $age === null ) ? $this->mWaitTimeout : $age;
+               $age = ( $age === null ) ? $this->waitTimeout : $age;
 
                return ( $this->hasMasterChanges()
                        || $this->lastMasterChangeTimestamp() > microtime( true ) - $age );
@@ -1552,11 +1552,11 @@ class LoadBalancer implements ILoadBalancer {
 
        public function allowLagged( $mode = null ) {
                if ( $mode === null ) {
-                       return $this->mAllowLagged;
+                       return $this->allowLagged;
                }
-               $this->mAllowLagged = $mode;
+               $this->allowLagged = $mode;
 
-               return $this->mAllowLagged;
+               return $this->allowLagged;
        }
 
        public function pingAll() {
@@ -1571,7 +1571,7 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function forEachOpenConnection( $callback, array $params = [] ) {
-               foreach ( $this->mConns as $connsByServer ) {
+               foreach ( $this->conns as $connsByServer ) {
                        foreach ( $connsByServer as $serverConns ) {
                                foreach ( $serverConns as $conn ) {
                                        $mergedParams = array_merge( [ $conn ], $params );
@@ -1583,7 +1583,7 @@ class LoadBalancer implements ILoadBalancer {
 
        public function forEachOpenMasterConnection( $callback, array $params = [] ) {
                $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $connsByServer ) {
+               foreach ( $this->conns as $connsByServer ) {
                        if ( isset( $connsByServer[$masterIndex] ) ) {
                                /** @var IDatabase $conn */
                                foreach ( $connsByServer[$masterIndex] as $conn ) {
@@ -1595,7 +1595,7 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function forEachOpenReplicaConnection( $callback, array $params = [] ) {
-               foreach ( $this->mConns as $connsByServer ) {
+               foreach ( $this->conns as $connsByServer ) {
                        foreach ( $connsByServer as $i => $serverConns ) {
                                if ( $i === $this->getWriterIndex() ) {
                                        continue; // skip master
@@ -1619,9 +1619,9 @@ class LoadBalancer implements ILoadBalancer {
 
                $lagTimes = $this->getLagTimes( $domain );
                foreach ( $lagTimes as $i => $lag ) {
-                       if ( $this->mLoads[$i] > 0 && $lag > $maxLag ) {
+                       if ( $this->loads[$i] > 0 && $lag > $maxLag ) {
                                $maxLag = $lag;
-                               $host = $this->mServers[$i]['host'];
+                               $host = $this->servers[$i]['host'];
                                $maxIndex = $i;
                        }
                }
@@ -1636,7 +1636,7 @@ class LoadBalancer implements ILoadBalancer {
 
                $knownLagTimes = []; // map of (server index => 0 seconds)
                $indexesWithLag = [];
-               foreach ( $this->mServers as $i => $server ) {
+               foreach ( $this->servers as $i => $server ) {
                        if ( empty( $server['is static'] ) ) {
                                $indexesWithLag[] = $i; // DB server might have replication lag
                        } else {
@@ -1658,10 +1658,12 @@ class LoadBalancer implements ILoadBalancer {
        /**
         * @param IDatabase $conn
         * @param DBMasterPos|bool $pos
-        * @param int $timeout
+        * @param int|null $timeout
         * @return bool
         */
-       public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = 10 ) {
+       public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = null ) {
+               $timeout = max( 1, $timeout ?: $this->waitTimeout );
+
                if ( $this->getServerCount() <= 1 || !$conn->getLBInfo( 'replica' ) ) {
                        return true; // server is not a replica DB
                }
index 74c7765..50c878d 100644 (file)
@@ -81,13 +81,13 @@ class LoadMonitor implements ILoadMonitor {
                $this->replLogger = $logger;
        }
 
-       public function scaleLoads( array &$weightByServer, $domain ) {
+       final public function scaleLoads( array &$weightByServer, $domain ) {
                $serverIndexes = array_keys( $weightByServer );
                $states = $this->getServerStates( $serverIndexes, $domain );
-               $coefficientsByServer = $states['weightScales'];
+               $newScalesByServer = $states['weightScales'];
                foreach ( $weightByServer as $i => $weight ) {
-                       if ( isset( $coefficientsByServer[$i] ) ) {
-                               $weightByServer[$i] = $weight * $coefficientsByServer[$i];
+                       if ( isset( $newScalesByServer[$i] ) ) {
+                               $weightByServer[$i] = $weight * $newScalesByServer[$i];
                        } else { // server recently added to config?
                                $host = $this->parent->getServerName( $i );
                                $this->replLogger->error( __METHOD__ . ": host $host not in cache" );
@@ -95,10 +95,8 @@ class LoadMonitor implements ILoadMonitor {
                }
        }
 
-       public function getLagTimes( array $serverIndexes, $domain ) {
-               $states = $this->getServerStates( $serverIndexes, $domain );
-
-               return $states['lagTimes'];
+       final public function getLagTimes( array $serverIndexes, $domain ) {
+               return $this->getServerStates( $serverIndexes, $domain )['lagTimes'];
        }
 
        protected function getServerStates( array $serverIndexes, $domain ) {
index 88e816a..1955915 100644 (file)
@@ -343,9 +343,9 @@ class XMPReader implements LoggerAwareInterface {
                        }
                        if ( $this->charset !== 'UTF-8' ) {
                                // don't convert if already utf-8
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                $content = iconv( $this->charset, 'UTF-8//IGNORE', $content );
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
                        }
 
                        // Ensure the XMP block does not have an xml doctype declaration, which
@@ -571,7 +571,7 @@ class XMPReader implements LoggerAwareInterface {
 
                // Even with LIBXML_NOWARNING set, XMLReader::read gives a warning
                // when parsing truncated XML, which causes unit tests to fail.
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                while ( $reader->read() ) {
                        if ( $reader->nodeType === XMLReader::ELEMENT ) {
                                // Reached the first element without hitting a doctype declaration
@@ -585,7 +585,7 @@ class XMPReader implements LoggerAwareInterface {
                                break;
                        }
                }
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !is_null( $result ) ) {
                        return $result;
index 16b3593..35502c7 100644 (file)
@@ -265,9 +265,9 @@ class DatabaseLogEntry extends LogEntryBase {
        public function getParameters() {
                if ( !isset( $this->params ) ) {
                        $blob = $this->getRawParameters();
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $params = LogEntryBase::extractParams( $blob );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $params !== false ) {
                                $this->params = $params;
                                $this->legacy = false;
index cb07fd5..fb0f2f9 100644 (file)
@@ -360,13 +360,13 @@ class UserMailer {
                                require_once 'Mail.php';
                        }
 
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
 
                        // Create the mail object using the Mail::factory method
                        $mail_object =& Mail::factory( 'smtp', $wgSMTP );
                        if ( PEAR::isError( $mail_object ) ) {
                                wfDebug( "PEAR::Mail factory failed: " . $mail_object->getMessage() . "\n" );
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
                                return Status::newFatal( 'pear-mail-error', $mail_object->getMessage() );
                        }
 
@@ -386,11 +386,11 @@ class UserMailer {
                                $status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
                                // FIXME : some chunks might be sent while others are not!
                                if ( !$status->isOK() ) {
-                                       MediaWiki\restoreWarnings();
+                                       Wikimedia\restoreWarnings();
                                        return $status;
                                }
                        }
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        return Status::newGood();
                } else {
                        // PHP mail()
index 617a910..b88a34d 100644 (file)
@@ -203,9 +203,9 @@ class BitmapHandler extends TransformationalImageHandler {
                                '-layers', 'merge',
                                '-background', 'white',
                        ];
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $xcfMeta = unserialize( $image->getMetadata() );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $xcfMeta
                                && isset( $xcfMeta['colorType'] )
                                && $xcfMeta['colorType'] === 'greyscale-alpha'
@@ -440,6 +440,14 @@ class BitmapHandler extends TransformationalImageHandler {
                        return $this->getMediaTransformError( $params, $errMsg );
                }
 
+               if ( filesize( $params['srcPath'] ) === 0 ) {
+                       $err = "Image file size seems to be zero.";
+                       wfDebug( "$err\n" );
+                       $errMsg = wfMessage( 'thumbnail_image-size-zero', $params['srcPath'] )->text();
+
+                       return $this->getMediaTransformError( $params, $errMsg );
+               }
+
                $src_image = call_user_func( $loader, $params['srcPath'] );
 
                $rotation = function_exists( 'imagerotate' ) && !isset( $params['disableRotation'] ) ?
index eb7b6ba..2541e35 100644 (file)
@@ -265,9 +265,9 @@ class DjVuHandler extends ImageHandler {
                        return $metadata;
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $unser = unserialize( $metadata );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( is_array( $unser ) ) {
                        if ( isset( $unser['error'] ) ) {
                                return false;
@@ -321,7 +321,7 @@ class DjVuHandler extends ImageHandler {
         * @return array
         */
        protected function extractTreesFromMetadata( $metadata ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                try {
                        // Set to false rather than null to avoid further attempts
                        $metaTree = false;
@@ -344,7 +344,7 @@ class DjVuHandler extends ImageHandler {
                } catch ( Exception $e ) {
                        wfDebug( "Bogus multipage XML metadata\n" );
                }
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                return [ 'MetaTree' => $metaTree, 'TextTree' => $textTree ];
        }
index d25111c..adcac25 100644 (file)
@@ -117,9 +117,9 @@ class DjVuImage {
        }
 
        function getInfo() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $file = fopen( $this->mFilename, 'rb' );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $file === false ) {
                        wfDebug( __METHOD__ . ": missing or failed file read\n" );
 
index cd457f0..a38e79b 100644 (file)
@@ -292,9 +292,9 @@ class Exif {
 
                $this->debugFile( $this->basename, __FUNCTION__, true );
                if ( function_exists( 'exif_read_data' ) ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $data = exif_read_data( $this->file, 0, true );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                } else {
                        throw new MWException( "Internal error: exif_read_data not present. " .
                                "\$wgShowEXIF may be incorrectly set or not checked by an extension." );
@@ -467,17 +467,17 @@ class Exif {
                                        break;
                        }
                        if ( $charset ) {
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                $val = iconv( $charset, 'UTF-8//IGNORE', $val );
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
                        } else {
                                // if valid utf-8, assume that, otherwise assume windows-1252
                                $valCopy = $val;
                                UtfNormal\Validator::quickIsNFCVerify( $valCopy ); // validates $valCopy.
                                if ( $valCopy !== $val ) {
-                                       MediaWiki\suppressWarnings();
+                                       Wikimedia\suppressWarnings();
                                        $val = iconv( 'Windows-1252', 'UTF-8//IGNORE', $val );
-                                       MediaWiki\restoreWarnings();
+                                       Wikimedia\restoreWarnings();
                                }
                        }
 
index 0e10abb..4267210 100644 (file)
@@ -99,9 +99,9 @@ class ExifBitmapHandler extends BitmapHandler {
                if ( $metadata === self::BROKEN_FILE ) {
                        return self::METADATA_GOOD;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $exif = unserialize( $metadata );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !isset( $exif['MEDIAWIKI_EXIF_VERSION'] )
                        || $exif['MEDIAWIKI_EXIF_VERSION'] != Exif::version()
                ) {
@@ -223,9 +223,9 @@ class ExifBitmapHandler extends BitmapHandler {
                if ( !$data ) {
                        return 0;
                }
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $data = unserialize( $data );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( isset( $data['Orientation'] ) ) {
                        # See http://sylvana.net/jpegcrop/exif_orientation.html
                        switch ( $data['Orientation'] ) {
index 5f23855..d65f872 100644 (file)
@@ -131,9 +131,9 @@ class GIFHandler extends BitmapHandler {
                        return self::METADATA_GOOD;
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $data = unserialize( $metadata );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$data || !is_array( $data ) ) {
                        wfDebug( __METHOD__ . " invalid GIF metadata\n" );
@@ -161,9 +161,9 @@ class GIFHandler extends BitmapHandler {
 
                $original = parent::getLongDesc( $image );
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $metadata = unserialize( $image->getMetadata() );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$metadata || $metadata['frameCount'] <= 1 ) {
                        return $original;
@@ -198,9 +198,9 @@ class GIFHandler extends BitmapHandler {
         */
        public function getLength( $file ) {
                $serMeta = $file->getMetadata();
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $metadata = unserialize( $serMeta );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$metadata || !isset( $metadata['duration'] ) || !$metadata['duration'] ) {
                        return 0.0;
index ac5fc81..a26539a 100644 (file)
@@ -161,9 +161,9 @@ class GIFMetadataExtractor {
                                        UtfNormal\Validator::quickIsNFCVerify( $dataCopy );
 
                                        if ( $dataCopy !== $data ) {
-                                               MediaWiki\suppressWarnings();
+                                               Wikimedia\suppressWarnings();
                                                $data = iconv( 'windows-1252', 'UTF-8', $data );
-                                               MediaWiki\restoreWarnings();
+                                               Wikimedia\restoreWarnings();
                                        }
 
                                        $commentCount = count( $comment );
index ef7ed5f..441c515 100644 (file)
@@ -445,9 +445,9 @@ class IPTC {
         */
        private static function convIPTCHelper( $data, $charset ) {
                if ( $charset ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $data = iconv( $charset, "UTF-8//IGNORE", $data );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $data === false ) {
                                $data = "";
                                wfDebugLog( 'iptc', __METHOD__ . " Error converting iptc data charset $charset to utf-8" );
index 1eefddb..a0a1603 100644 (file)
@@ -201,9 +201,9 @@ abstract class ImageHandler extends MediaHandler {
        }
 
        function getImageSize( $image, $path ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $gis = getimagesize( $path );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                return $gis;
        }
index 211845c..229a891 100644 (file)
@@ -102,9 +102,9 @@ class JpegMetadataExtractor {
                                // turns $com to valid utf-8.
                                // thus if no change, its utf-8, otherwise its something else.
                                if ( $com !== $oldCom ) {
-                                       MediaWiki\suppressWarnings();
+                                       Wikimedia\suppressWarnings();
                                        $com = $oldCom = iconv( 'windows-1252', 'UTF-8//IGNORE', $oldCom );
-                                       MediaWiki\restoreWarnings();
+                                       Wikimedia\restoreWarnings();
                                }
                                // Try it again, if its still not a valid string, then probably
                                // binary junk or some really weird encoding, so don't extract.
index 5dca24b..c76930c 100644 (file)
@@ -158,9 +158,9 @@ abstract class MediaHandler {
        function convertMetadataVersion( $metadata, $version = 1 ) {
                if ( !is_array( $metadata ) ) {
                        // unserialize to keep return parameter consistent.
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $ret = unserialize( $metadata );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
 
                        return $ret;
                }
index b6288bc..6748b26 100644 (file)
@@ -117,9 +117,9 @@ class PNGHandler extends BitmapHandler {
                        return self::METADATA_GOOD;
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $data = unserialize( $metadata );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$data || !is_array( $data ) ) {
                        wfDebug( __METHOD__ . " invalid png metadata\n" );
@@ -146,9 +146,9 @@ class PNGHandler extends BitmapHandler {
                global $wgLang;
                $original = parent::getLongDesc( $image );
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $metadata = unserialize( $image->getMetadata() );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$metadata || $metadata['frameCount'] <= 0 ) {
                        return $original;
@@ -184,9 +184,9 @@ class PNGHandler extends BitmapHandler {
         */
        public function getLength( $file ) {
                $serMeta = $file->getMetadata();
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $metadata = unserialize( $serMeta );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$metadata || !isset( $metadata['duration'] ) || !$metadata['duration'] ) {
                        return 0.0;
index c12ca0b..78ed0bc 100644 (file)
@@ -202,9 +202,9 @@ class PNGMetadataExtractor {
                                        // if compressed
                                        if ( $items[2] == "\x01" ) {
                                                if ( function_exists( 'gzuncompress' ) && $items[4] === "\x00" ) {
-                                                       MediaWiki\suppressWarnings();
+                                                       Wikimedia\suppressWarnings();
                                                        $items[5] = gzuncompress( $items[5] );
-                                                       MediaWiki\restoreWarnings();
+                                                       Wikimedia\restoreWarnings();
 
                                                        if ( $items[5] === false ) {
                                                                // decompression failed
@@ -246,9 +246,9 @@ class PNGMetadataExtractor {
                                        fseek( $fh, self::$crcSize, SEEK_CUR );
                                        continue;
                                }
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                $content = iconv( 'ISO-8859-1', 'UTF-8', $content );
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
 
                                if ( $content === false ) {
                                        throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
@@ -286,9 +286,9 @@ class PNGMetadataExtractor {
                                                continue;
                                        }
 
-                                       MediaWiki\suppressWarnings();
+                                       Wikimedia\suppressWarnings();
                                        $content = gzuncompress( $content );
-                                       MediaWiki\restoreWarnings();
+                                       Wikimedia\restoreWarnings();
 
                                        if ( $content === false ) {
                                                // decompression failed
@@ -297,9 +297,9 @@ class PNGMetadataExtractor {
                                                continue;
                                        }
 
-                                       MediaWiki\suppressWarnings();
+                                       Wikimedia\suppressWarnings();
                                        $content = iconv( 'ISO-8859-1', 'UTF-8', $content );
-                                       MediaWiki\restoreWarnings();
+                                       Wikimedia\restoreWarnings();
 
                                        if ( $content === false ) {
                                                throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
index 10be97a..9085421 100644 (file)
@@ -249,10 +249,10 @@ class SvgHandler extends ImageHandler {
                $ok = symlink( $srcPath, $lnPath );
                /** @noinspection PhpUnusedLocalVariableInspection */
                $cleaner = new ScopedCallback( function () use ( $tmpDir, $lnPath ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        unlink( $lnPath );
                        rmdir( $tmpDir );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                } );
                if ( !$ok ) {
                        wfDebugLog( 'thumbnail',
@@ -418,9 +418,9 @@ class SvgHandler extends ImageHandler {
        }
 
        function unpackMetadata( $metadata ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $unser = unserialize( $metadata );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( isset( $unser['version'] ) && $unser['version'] == self::SVG_METADATA_VERSION ) {
                        return $unser;
                } else {
index 9b22cbe..fc93b23 100644 (file)
@@ -106,17 +106,17 @@ class SVGReader {
                // Because we cut off the end of the svg making an invalid one. Complicated
                // try catch thing to make sure warnings get restored. Seems like there should
                // be a better way.
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                try {
                        $this->read();
                } catch ( Exception $e ) {
                        // Note, if this happens, the width/height will be taken to be 0x0.
                        // Should we consider it the default 512x512 instead?
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        libxml_disable_entity_loader( $oldDisable );
                        throw $e;
                }
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                libxml_disable_entity_loader( $oldDisable );
        }
 
index e0af6de..295a978 100644 (file)
@@ -63,9 +63,9 @@ class WebPHandler extends BitmapHandler {
                                return self::METADATA_GOOD;
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $data = unserialize( $metadata );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$data || !is_array( $data ) ) {
                                wfDebug( __METHOD__ . " invalid WebP metadata\n" );
@@ -235,9 +235,9 @@ class WebPHandler extends BitmapHandler {
                        $metadata = $file->getMetadata();
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $metadata = unserialize( $metadata );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $metadata == false ) {
                        return false;
index 1b6c4c8..491fef2 100644 (file)
@@ -217,9 +217,9 @@ class XCFHandler extends BitmapHandler {
         * @return bool
         */
        public function canRender( $file ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $xcfMeta = unserialize( $file->getMetadata() );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( isset( $xcfMeta['colorType'] ) && $xcfMeta['colorType'] === 'index-coloured' ) {
                        return false;
                }
index 6691f73..6d35658 100644 (file)
@@ -681,9 +681,9 @@ class SqlBagOStuff extends BagOStuff {
         */
        protected function unserialize( $serial ) {
                if ( function_exists( 'gzinflate' ) ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $decomp = gzinflate( $serial );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
 
                        if ( false !== $decomp ) {
                                $serial = $decomp;
index 343c4c8..8eb3709 100644 (file)
@@ -480,12 +480,10 @@ class Article implements Page {
                # Render printable version, use printable version cache
                if ( $outputPage->isPrintable() ) {
                        $parserOptions->setIsPrintable( true );
-                       $parserOptions->setEditSection( false );
                        $poOptions['enableSectionEditLinks'] = false;
                } elseif ( $this->disableSectionEditForRender
                        || !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user )
                ) {
-                       $parserOptions->setEditSection( false );
                        $poOptions['enableSectionEditLinks'] = false;
                }
 
@@ -1526,7 +1524,6 @@ class Article implements Page {
        public function render() {
                $this->getContext()->getRequest()->response()->header( 'X-Robots-Tag: noindex' );
                $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               $this->getContext()->getOutput()->enableSectionEditLinks( false );
                $this->disableSectionEditForRender = true;
                $this->view();
        }
index a7eed5a..544d23d 100644 (file)
@@ -1771,8 +1771,9 @@ class WikiPage implements Page, IDBAccessObject {
                                throw new MWException( "Failed to update page row to use new revision." );
                        }
 
+                       $tags = $meta['tags'];
                        Hooks::run( 'NewRevisionFromEditComplete',
-                               [ $this, $revision, $meta['baseRevId'], $user ] );
+                               [ $this, $revision, $meta['baseRevId'], $user, &$tags ] );
 
                        // Update recentchanges
                        if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
@@ -1794,7 +1795,7 @@ class WikiPage implements Page, IDBAccessObject {
                                        $newsize,
                                        $revisionId,
                                        $patrolled,
-                                       $meta['tags']
+                                       $tags
                                );
                        }
 
@@ -2269,9 +2270,11 @@ class WikiPage implements Page, IDBAccessObject {
                        $good = 0;
                }
                $edits = $options['changed'] ? 1 : 0;
-               $total = $options['created'] ? 1 : 0;
+               $pages = $options['created'] ? 1 : 0;
 
-               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
+               DeferredUpdates::addUpdate( SiteStatsUpdate::factory(
+                       [ 'edits' => $edits, 'articles' => $good, 'pages' => $pages ]
+               ) );
                DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
 
                // If this is another user's talk page, update newtalk.
@@ -3018,7 +3021,9 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Update site status
-               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$countable, -1 ) );
+               DeferredUpdates::addUpdate( SiteStatsUpdate::factory(
+                       [ 'edits' => 1, 'articles' => -$countable, 'pages' => -1 ]
+               ) );
 
                // Delete pagelinks, update secondary indexes, etc
                $updates = $this->getDeletionUpdates( $content );
index 605a873..0a4a60e 100644 (file)
@@ -126,13 +126,16 @@ class DateFormatter {
        /**
         * Get a DateFormatter object
         *
-        * @param Language|string|null $lang In which language to format the date
+        * @param Language|null $lang In which language to format the date
         *     Defaults to the site content language
         * @return DateFormatter
         */
        public static function getInstance( $lang = null ) {
                global $wgContLang, $wgMainCacheType;
 
+               if ( is_string( $lang ) ) {
+                       wfDeprecated( __METHOD__ . ' with type string for $lang', '1.31' );
+               }
                $lang = $lang ? wfGetLangObj( $lang ) : $wgContLang;
                $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType );
 
index b2d8511..2adfd0a 100644 (file)
@@ -4032,13 +4032,9 @@ class Parser {
 
                # Inhibit editsection links if requested in the page
                if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
-                       $maybeShowEditLink = $showEditLink = false;
+                       $maybeShowEditLink = false;
                } else {
-                       $maybeShowEditLink = true; /* Actual presence will depend on ParserOptions option */
-                       $showEditLink = $this->mOptions->getEditSection();
-               }
-               if ( $showEditLink ) {
-                       $this->mOutput->setEditSectionTokens( true );
+                       $maybeShowEditLink = true; /* Actual presence will depend on post-cache transforms */
                }
 
                # Get all headlines for numbering them and adding funky stuff like [edit]
@@ -4390,9 +4386,9 @@ class Parser {
                         * $this : caller
                         * $section : the section number
                         * &$sectionContent : ref to the content of the section
-                        * $showEditLinks : boolean describing whether this section has an edit link
+                        * $maybeShowEditLinks : boolean describing whether this section has an edit link
                         */
-                       Hooks::run( 'ParserSectionCreate', [ $this, $i, &$sections[$i], $showEditLink ] );
+                       Hooks::run( 'ParserSectionCreate', [ $this, $i, &$sections[$i], $maybeShowEditLink ] );
 
                        $i++;
                }
index c680129..8a7fca6 100644 (file)
@@ -253,11 +253,6 @@ class ParserCache {
 
                wfDebug( "ParserOutput cache found.\n" );
 
-               // The edit section preference may not be the appropiate one in
-               // the ParserOutput, as we are not storing it in the parsercache
-               // key. Force it here. See T33445.
-               $value->setEditSectionTokens( $popts->getEditSection() );
-
                $wikiPage = method_exists( $article, 'getPage' )
                        ? $article->getPage()
                        : $article;
index ca8e739..ff21ef0 100644 (file)
@@ -80,13 +80,6 @@ class ParserOptions {
         */
        private $mTimestamp;
 
-       /**
-        * The edit section flag is in ParserOptions for historical reasons, but
-        * doesn't actually affect the parser output since Feb 2015.
-        * @var bool
-        */
-       private $mEditSection = true;
-
        /**
         * Stored user object
         * @var User
@@ -876,7 +869,8 @@ class ParserOptions {
         * @return bool
         */
        public function getEditSection() {
-               return $this->mEditSection;
+               wfDeprecated( __METHOD__, '1.31' );
+               return true;
        }
 
        /**
@@ -886,7 +880,8 @@ class ParserOptions {
         * @return bool Old value
         */
        public function setEditSection( $x ) {
-               return wfSetVar( $this->mEditSection, $x );
+               wfDeprecated( __METHOD__, '1.31' );
+               return true;
        }
 
        /**
@@ -1259,7 +1254,7 @@ class ParserOptions {
                } elseif ( $value instanceof Language ) {
                        return $value->getCode();
                } elseif ( is_array( $value ) ) {
-                       return '[' . join( ',', array_map( [ $this, 'optionToString' ], $value ) ) . ']';
+                       return '[' . implode( ',', array_map( [ $this, 'optionToString' ], $value ) ) . ']';
                } else {
                        return (string)$value;
                }
@@ -1284,18 +1279,6 @@ class ParserOptions {
                $defaults = self::getCanonicalOverrides() + self::getDefaults();
                $inCacheKey = self::$inCacheKey;
 
-               // Historical hack: 'editsection' hasn't been a true parser option since
-               // Feb 2015 (instead the parser outputs a constant placeholder and post-parse
-               // processing handles the option). But Wikibase forces it in $forOptions
-               // and expects the cache key to still vary on it for T85252.
-               // @deprecated since 1.30, Wikibase should use addExtraKey() or something instead.
-               if ( in_array( 'editsection', $forOptions, true ) ) {
-                       $options['editsection'] = $this->mEditSection;
-                       $defaults['editsection'] = true;
-                       $inCacheKey['editsection'] = true;
-                       ksort( $inCacheKey );
-               }
-
                // We only include used options with non-canonical values in the key
                // so adding a new option doesn't invalidate the entire parser cache.
                // The drawback to this is that changing the default value of an option
@@ -1312,7 +1295,7 @@ class ParserOptions {
                        }
                }
 
-               $confstr = $values ? join( '!', $values ) : 'canonical';
+               $confstr = $values ? implode( '!', $values ) : 'canonical';
 
                // add in language specific options, if any
                // @todo FIXME: This is just a way of retrieving the url/user preferred variant
index e2efaff..8f0a1d7 100644 (file)
@@ -21,6 +21,7 @@
  * @file
  * @ingroup Parser
  */
+
 class ParserOutput extends CacheTime {
        /**
         * Feature flags to indicate to extensions that MediaWiki core supports and
@@ -150,12 +151,6 @@ class ParserOutput extends CacheTime {
         */
        public $mSections = [];
 
-       /**
-        * @deprecated since 1.31 Use getText() options.
-        * @var bool $mEditSectionTokens prefix/suffix markers if edit sections were output as tokens.
-        */
-       public $mEditSectionTokens = true;
-
        /**
         * @var array $mProperties Name/value pairs to be cached in the DB.
         */
@@ -171,12 +166,6 @@ class ParserOutput extends CacheTime {
         */
        public $mTimestamp;
 
-       /**
-        * @deprecated since 1.31 Use getText() options.
-        * @var bool $mTOCEnabled Whether TOC should be shown, can't override __NOTOC__.
-        */
-       public $mTOCEnabled = true;
-
        /**
         * @var bool $mEnableOOUI Whether OOUI should be enabled.
         */
@@ -270,26 +259,20 @@ class ParserOutput extends CacheTime {
         *     section edit link tokens are present in the HTML. Default is true,
         *     but might be statefully overridden.
         *  - unwrap: (bool) Remove a wrapping mw-parser-output div. Default is false.
+        *  - deduplicateStyles: (bool) When true, which is the default, `<style>`
+        *    tags with the `data-mw-deduplicate` attribute set are deduplicated by
+        *    value of the attribute: all but the first will be replaced by `<link
+        *    rel="mw-deduplicated-inline-style" href="mw-data:..."/>` tags, where
+        *    the scheme-specific-part of the href is the (percent-encoded) value
+        *    of the `data-mw-deduplicate` attribute.
         * @return string HTML
         */
        public function getText( $options = [] ) {
-               if ( !array_key_exists( 'allowTOC', $options ) && empty( $this->mTOCEnabled ) ) {
-                       wfDeprecated( 'ParserOutput stateful allowTOC', '1.31' );
-               }
-
-               //  Note that while $this->mEditSectionTokens formerly defaulted to false,
-               //  ParserOptions->getEditSection() defaults to true and Parser copies
-               //  that to us so true makes more sense as the stateless default.
-               if ( !array_key_exists( 'enableSectionEditLinks', $options ) && !$this->mEditSectionTokens ) {
-                       wfDeprecated( 'ParserOutput stateful enableSectionEditLinks', '1.31' );
-               }
-
                $options += [
-                       // empty() here because old cached versions might lack the field somehow.
-                       // In that situation, the historical behavior (possibly buggy) is to remove the TOC.
-                       'allowTOC' => !empty( $this->mTOCEnabled ),
-                       'enableSectionEditLinks' => $this->mEditSectionTokens,
+                       'allowTOC' => true,
+                       'enableSectionEditLinks' => true,
                        'unwrap' => false,
+                       'deduplicateStyles' => true,
                ];
                $text = $this->mText;
 
@@ -301,10 +284,16 @@ class ParserOutput extends CacheTime {
                        ] );
                        $startLen = strlen( $start );
                        $end = Html::closeElement( 'div' );
+                       $endPos = strrpos( $text, $end );
                        $endLen = strlen( $end );
 
-                       if ( substr( $text, 0, $startLen ) === $start && substr( $text, -$endLen ) === $end ) {
-                               $text = substr( $text, $startLen, -$endLen );
+                       if ( substr( $text, 0, $startLen ) === $start && $endPos !== false
+                               // if the closing div is followed by real content, bail out of unwrapping
+                               && preg_match( '/^(?>\s*<!--.*?-->)*\s*$/s', substr( $text, $endPos + $endLen ) )
+                       ) {
+                               $text = substr( $text, $startLen );
+                               $text = substr( $text, 0, $endPos - $startLen )
+                                       . substr( $text, $endPos - $startLen + $endLen );
                        }
                }
 
@@ -344,6 +333,35 @@ class ParserOutput extends CacheTime {
                        );
                }
 
+               if ( $options['deduplicateStyles'] ) {
+                       $seen = [];
+                       $text = preg_replace_callback(
+                               '#<style\s+([^>]*data-mw-deduplicate\s*=[^>]*)>.*?</style>#s',
+                               function ( $m ) use ( &$seen ) {
+                                       $attr = Sanitizer::decodeTagAttributes( $m[1] );
+                                       if ( !isset( $attr['data-mw-deduplicate'] ) ) {
+                                               return $m[0];
+                                       }
+
+                                       $key = $attr['data-mw-deduplicate'];
+                                       if ( !isset( $seen[$key] ) ) {
+                                               $seen[$key] = true;
+                                               return $m[0];
+                                       }
+
+                                       // We were going to use an empty <style> here, but there
+                                       // was concern that would be too much overhead for browsers.
+                                       // So let's hope a <link> with a non-standard rel and href isn't
+                                       // going to be misinterpreted or mangled by any subsequent processing.
+                                       return Html::element( 'link', [
+                                               'rel' => 'mw-deduplicated-inline-style',
+                                               'href' => "mw-data:" . wfUrlencode( $key ),
+                                       ] );
+                               },
+                               $text
+                       );
+               }
+
                return $text;
        }
 
@@ -399,7 +417,8 @@ class ParserOutput extends CacheTime {
         * @deprecated since 1.31 Use getText() options.
         */
        public function getEditSectionTokens() {
-               return $this->mEditSectionTokens;
+               wfDeprecated( __METHOD__, '1.31' );
+               return true;
        }
 
        public function &getLinks() {
@@ -489,7 +508,8 @@ class ParserOutput extends CacheTime {
         * @deprecated since 1.31 Use getText() options.
         */
        public function getTOCEnabled() {
-               return $this->mTOCEnabled;
+               wfDeprecated( __METHOD__, '1.31' );
+               return true;
        }
 
        public function getEnableOOUI() {
@@ -520,7 +540,8 @@ class ParserOutput extends CacheTime {
         * @deprecated since 1.31 Use getText() options.
         */
        public function setEditSectionTokens( $t ) {
-               return wfSetVar( $this->mEditSectionTokens, $t );
+               wfDeprecated( __METHOD__, '1.31' );
+               return true;
        }
 
        public function setIndexPolicy( $policy ) {
@@ -539,7 +560,8 @@ class ParserOutput extends CacheTime {
         * @deprecated since 1.31 Use getText() options.
         */
        public function setTOCEnabled( $flag ) {
-               return wfSetVar( $this->mTOCEnabled, $flag );
+               wfDeprecated( __METHOD__, '1.31' );
+               return true;
        }
 
        public function addCategory( $c, $sort ) {
index 4db2855..81243f3 100644 (file)
@@ -86,9 +86,9 @@ class Preprocessor_DOM extends Preprocessor {
                $xml .= "</list>";
 
                $dom = new DOMDocument();
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $result = $dom->loadXML( $xml );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$result ) {
                        // Try running the XML through UtfNormal to get rid of invalid characters
                        $xml = UtfNormal\Validator::cleanUp( $xml );
@@ -163,9 +163,9 @@ class Preprocessor_DOM extends Preprocessor {
                }
 
                $dom = new DOMDocument;
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $result = $dom->loadXML( $xml );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( !$result ) {
                        // Try running the XML through UtfNormal to get rid of invalid characters
                        $xml = UtfNormal\Validator::cleanUp( $xml );
index de7a6fa..b13e597 100644 (file)
@@ -515,9 +515,9 @@ class Sanitizer {
                                                $badtag = true;
                                        } elseif ( $slash ) {
                                                # Closing a tag... is it the one we just opened?
-                                               MediaWiki\suppressWarnings();
+                                               Wikimedia\suppressWarnings();
                                                $ot = array_pop( $tagstack );
-                                               MediaWiki\restoreWarnings();
+                                               Wikimedia\restoreWarnings();
 
                                                if ( $ot != $t ) {
                                                        if ( isset( $htmlsingleallowed[$ot] ) ) {
@@ -525,32 +525,32 @@ class Sanitizer {
                                                                # and see if we find a match below them
                                                                $optstack = [];
                                                                array_push( $optstack, $ot );
-                                                               MediaWiki\suppressWarnings();
+                                                               Wikimedia\suppressWarnings();
                                                                $ot = array_pop( $tagstack );
-                                                               MediaWiki\restoreWarnings();
+                                                               Wikimedia\restoreWarnings();
                                                                while ( $ot != $t && isset( $htmlsingleallowed[$ot] ) ) {
                                                                        array_push( $optstack, $ot );
-                                                                       MediaWiki\suppressWarnings();
+                                                                       Wikimedia\suppressWarnings();
                                                                        $ot = array_pop( $tagstack );
-                                                                       MediaWiki\restoreWarnings();
+                                                                       Wikimedia\restoreWarnings();
                                                                }
                                                                if ( $t != $ot ) {
                                                                        # No match. Push the optional elements back again
                                                                        $badtag = true;
-                                                                       MediaWiki\suppressWarnings();
+                                                                       Wikimedia\suppressWarnings();
                                                                        $ot = array_pop( $optstack );
-                                                                       MediaWiki\restoreWarnings();
+                                                                       Wikimedia\restoreWarnings();
                                                                        while ( $ot ) {
                                                                                array_push( $tagstack, $ot );
-                                                                               MediaWiki\suppressWarnings();
+                                                                               Wikimedia\suppressWarnings();
                                                                                $ot = array_pop( $optstack );
-                                                                               MediaWiki\restoreWarnings();
+                                                                               Wikimedia\restoreWarnings();
                                                                        }
                                                                }
                                                        } else {
-                                                               MediaWiki\suppressWarnings();
+                                                               Wikimedia\suppressWarnings();
                                                                array_push( $tagstack, $ot );
-                                                               MediaWiki\restoreWarnings();
+                                                               Wikimedia\restoreWarnings();
 
                                                                # <li> can be nested in <ul> or <ol>, skip those cases:
                                                                if ( !isset( $htmllist[$ot] ) || !isset( $listtags[$t] ) ) {
index c8e5e19..7e3afaa 100644 (file)
@@ -40,6 +40,7 @@ class ExtensionJsonValidator {
        }
 
        /**
+        * @codeCoverageIgnore
         * @return bool
         */
        public function checkDependencies() {
index fe617c5..0d0a6e4 100644 (file)
@@ -197,8 +197,20 @@ class ExtensionProcessor implements Processor {
                $this->extractMessagesDirs( $dir, $info );
                $this->extractNamespaces( $info );
                $this->extractResourceLoaderModules( $dir, $info );
-               $this->extractServiceWiringFiles( $dir, $info );
-               $this->extractParserTestFiles( $dir, $info );
+               if ( isset( $info['ServiceWiringFiles'] ) ) {
+                       $this->extractPathBasedGlobal(
+                               'wgServiceWiringFiles',
+                               $dir,
+                               $info['ServiceWiringFiles']
+                       );
+               }
+               if ( isset( $info['ParserTestFiles'] ) ) {
+                       $this->extractPathBasedGlobal(
+                               'wgParserTestFiles',
+                               $dir,
+                               $info['ParserTestFiles']
+                       );
+               }
                $name = $this->extractCredits( $path, $info );
                if ( isset( $info['callback'] ) ) {
                        $this->callbacks[$name] = $info['callback'];
@@ -499,19 +511,9 @@ class ExtensionProcessor implements Processor {
                $this->globals[$key] = $value;
        }
 
-       protected function extractServiceWiringFiles( $dir, array $info ) {
-               if ( isset( $info['ServiceWiringFiles'] ) ) {
-                       foreach ( $info['ServiceWiringFiles'] as $path ) {
-                               $this->globals['wgServiceWiringFiles'][] = "$dir/$path";
-                       }
-               }
-       }
-
-       protected function extractParserTestFiles( $dir, array $info ) {
-               if ( isset( $info['ParserTestFiles'] ) ) {
-                       foreach ( $info['ParserTestFiles'] as $path ) {
-                               $this->globals['wgParserTestFiles'][] = "$dir/$path";
-                       }
+       protected function extractPathBasedGlobal( $global, $dir, $paths ) {
+               foreach ( $paths as $path ) {
+                       $this->globals[$global][] = "$dir/$path";
                }
        }
 
index bb4c7fd..1876645 100644 (file)
@@ -82,6 +82,7 @@ class ExtensionRegistry {
        private static $instance;
 
        /**
+        * @codeCoverageIgnore
         * @return ExtensionRegistry
         */
        public static function getInstance() {
@@ -105,9 +106,11 @@ class ExtensionRegistry {
                        } else {
                                throw new Exception( "$path does not exist!" );
                        }
+                       // @codeCoverageIgnoreStart
                        if ( !$mtime ) {
                                $err = error_get_last();
                                throw new Exception( "Couldn't stat $path: {$err['message']}" );
+                               // @codeCoverageIgnoreEnd
                        }
                }
                $this->queued[$path] = $mtime;
@@ -406,16 +409,6 @@ class ExtensionRegistry {
                return $this->loaded;
        }
 
-       /**
-        * Mark a thing as loaded
-        *
-        * @param string $name
-        * @param array $credits
-        */
-       protected function markLoaded( $name, array $credits ) {
-               $this->loaded[$name] = $credits;
-       }
-
        /**
         * Fully expand autoloader paths
         *
index a31551c..02e3a7c 100644 (file)
@@ -175,13 +175,13 @@ class VersionChecker {
                if ( !isset( $this->loaded[$dependencyName]['version'] ) ) {
                        // If we depend upon any version, and none is set, that's fine.
                        if ( $constraint === '*' ) {
-                               wfDebug( "{$dependencyName} does not expose it's version, but {$checkedExt}
-                                       mentions it with constraint '*'. Assume it's ok so." );
+                               wfDebug( "{$dependencyName} does not expose its version, but {$checkedExt}"
+                                       . " mentions it with constraint '*'. Assume it's ok so." );
                                return false;
                        } else {
                                // Otherwise, mark it as incompatible.
-                               return "{$dependencyName} does not expose it's version, but {$checkedExt}
-                                       requires: {$constraint}.";
+                               return "{$dependencyName} does not expose its version, but {$checkedExt}"
+                                       . " requires: {$constraint}.";
                        }
                } else {
                        // Try to get a constraint for the dependency version
index a6ec72a..3be687b 100644 (file)
@@ -327,16 +327,6 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                return 'local';
        }
 
-       /**
-        * From where in the page HTML should this module be loaded?
-        *
-        * @deprecated since 1.29 Obsolete. All modules load async from `<head>`.
-        * @return string
-        */
-       public function getPosition() {
-               return 'top';
-       }
-
        /**
         * Whether this module's JS expects to work without the client-side ResourceLoader module.
         * Returning true from this function will prevent mw.loader.state() call from being
@@ -1069,9 +1059,9 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         * @return int UNIX timestamp
         */
        protected static function safeFilemtime( $filePath ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $mtime = filemtime( $filePath ) ?: 1;
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                return $mtime;
        }
 
index 2810bce..8e705c1 100644 (file)
@@ -54,9 +54,9 @@ class SearchMySQL extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $bits ) {
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
 
                                if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
index 3d4da42..af29212 100644 (file)
@@ -52,9 +52,9 @@ class SearchSqlite extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $bits ) {
-                               MediaWiki\suppressWarnings();
+                               Wikimedia\suppressWarnings();
                                list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
-                               MediaWiki\restoreWarnings();
+                               Wikimedia\restoreWarnings();
 
                                if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
index 44806ed..a376037 100644 (file)
@@ -243,7 +243,7 @@ final class SessionBackend {
 
                        if ( $restart ) {
                                session_id( (string)$this->id );
-                               \MediaWiki\quietCall( 'session_start' );
+                               \Wikimedia\quietCall( 'session_start' );
                        }
 
                        $this->autosave();
@@ -764,7 +764,7 @@ final class SessionBackend {
                                                'session' => $this->id,
                                ] );
                                session_id( (string)$this->id );
-                               \MediaWiki\quietCall( 'session_start' );
+                               \Wikimedia\quietCall( 'session_start' );
                        }
                }
        }
index 970290a..731897e 100644 (file)
@@ -50,9 +50,9 @@ class MediaWikiI18N {
                $m = [];
                while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
                        list( $src, $var ) = $m;
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $varValue = $this->context[$var];
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        $value = str_replace( $src, $varValue, $value );
                }
                return $value;
index e8466dc..1886746 100644 (file)
@@ -153,7 +153,7 @@ abstract class QuickTemplate {
        /**
         * An ugly, ugly hack.
         * @private
-        * @param string $str
+        * @param string $msgKey
         */
        function msgWiki( $msgKey ) {
                global $wgOut;
index bd43255..65a300a 100644 (file)
@@ -1253,30 +1253,38 @@ abstract class Skin extends ContextSource {
         *
         * @return array
         */
-       function buildSidebar() {
+       public function buildSidebar() {
                global $wgEnableSidebarCache, $wgSidebarCacheExpiry;
 
-               $callback = function () {
+               $callback = function ( $old = null, &$ttl = null ) {
                        $bar = [];
                        $this->addToSidebar( $bar, 'sidebar' );
                        Hooks::run( 'SkinBuildSidebar', [ $this, &$bar ] );
+                       if ( MessageCache::singleton()->isDisabled() ) {
+                               $ttl = WANObjectCache::TTL_UNCACHEABLE; // bug T133069
+                       }
 
                        return $bar;
                };
 
-               if ( $wgEnableSidebarCache ) {
-                       $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
-                       $sidebar = $cache->getWithSetCallback(
-                               $cache->makeKey( 'sidebar', $this->getLanguage()->getCode() ),
-                               MessageCache::singleton()->isDisabled()
-                                       ? $cache::TTL_UNCACHEABLE // bug T133069
-                                       : $wgSidebarCacheExpiry,
+               $msgCache = MessageCache::singleton();
+               $wanCache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+
+               $sidebar = $wgEnableSidebarCache
+                       ? $wanCache->getWithSetCallback(
+                               $wanCache->makeKey( 'sidebar', $this->getLanguage()->getCode() ),
+                               $wgSidebarCacheExpiry,
                                $callback,
-                               [ 'lockTSE' => 30 ]
-                       );
-               } else {
-                       $sidebar = $callback();
-               }
+                               [
+                                       'checkKeys' => [
+                                               // Unless there is both no exact $code override nor an i18n definition
+                                               // in the the software, the only MediaWiki page to check is for $code.
+                                               $msgCache->getCheckKey( $this->getLanguage()->getCode() )
+                                       ],
+                                       'lockTSE' => 30
+                               ]
+                       )
+                       : $callback();
 
                // Apply post-processing to the cached value
                Hooks::run( 'SidebarBeforeOutput', [ $this, &$sidebar ] );
diff --git a/includes/sparql/SparqlClient.php b/includes/sparql/SparqlClient.php
new file mode 100644 (file)
index 0000000..6c913d2
--- /dev/null
@@ -0,0 +1,220 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Sparql;
+
+use Http;
+use MediaWiki\Http\HttpRequestFactory;
+
+/**
+ * Simple SPARQL client
+ *
+ * @author Stas Malyshev
+ */
+class SparqlClient {
+
+       /**
+        * Limit on how long can be the query to be sent by GET.
+        */
+       const MAX_GET_SIZE = 2048;
+
+       /**
+        * User agent for HTTP requests.
+        * @var string
+        */
+       private $userAgent;
+
+       /**
+        * Query timeout (seconds)
+        * @var int
+        */
+       private $timeout = 30;
+
+       /**
+        * SPARQL endpoint URL
+        * @var string
+        */
+       private $endpoint;
+
+       /**
+        * Client options
+        * @var array
+        */
+       private $options = [];
+
+       /**
+        * @var HttpRequestFactory
+        */
+       private $requestFactory;
+
+       /**
+        * @param string $url SPARQL Endpoint
+        * @param HttpRequestFactory $requestFactory
+        */
+       public function __construct( $url, HttpRequestFactory $requestFactory ) {
+               $this->endpoint = $url;
+               $this->requestFactory = $requestFactory;
+               $this->userAgent = Http::userAgent() . " SparqlClient";
+       }
+
+       /**
+        * Set query timeout (in seconds)
+        * @param int $timeout
+        * @return $this
+        */
+       public function setTimeout( $timeout ) {
+               if ( $timeout >= 0 ) {
+                       $this->timeout = $timeout;
+               }
+               return $this;
+       }
+
+       /**
+        * Set client options
+        * @param array $options
+        * @return $this
+        */
+       public function setClientOptions( $options ) {
+               $this->options = $options;
+               return $this;
+       }
+
+       /**
+        * Get current user agent.
+        * @return string
+        */
+       public function getUserAgent() {
+               return $this->userAgent;
+       }
+
+       /**
+        * Set user agent string.
+        *
+        * Mote it is not recommended to completely override user agent for
+        * most applications.
+        * @see appendUserAgent() for recommended way of specifying user agent.
+        *
+        * @param string $agent
+        */
+       public function setUserAgent( $agent ) {
+               $this->userAgent = $agent;
+       }
+
+       /**
+        * Append specific string to user agent.
+        *
+        * This is the recommended way of specifying the user agent
+        * for specific applications of the SparqlClient inside MediaWiki
+        * and extension code.
+        *
+        * @param string $agent
+        */
+       public function appendUserAgent( $agent ) {
+               $this->userAgent .= ' ' . $agent;
+       }
+
+       /**
+        * Query SPARQL endpoint
+        *
+        * @param string $sparql query
+        * @param bool $rawData Whether to return only values or full data objects
+        *
+        * @return array List of results, one row per array element
+        *               Each row will contain fields indexed by variable name.
+        * @throws SparqlException
+        */
+       public function query( $sparql, $rawData = false ) {
+               if ( empty( $this->endpoint ) ) {
+                       throw new SparqlException( 'Endpoint URL can not be empty' );
+               }
+               $queryData = [ "query" => $sparql, "format" => "json" ];
+               $options = array_merge( [ 'method' => 'GET' ], $this->options );
+
+               if ( empty( $options['userAgent'] ) ) {
+                       $options['userAgent'] = $this->userAgent;
+               }
+
+               if ( $this->timeout >= 0 ) {
+                       // Blazegraph setting, see https://wiki.blazegraph.com/wiki/index.php/REST_API
+                       $queryData['maxQueryTimeMillis'] = $this->timeout * 1000;
+                       $options['timeout'] = $this->timeout;
+               }
+
+               if ( strlen( $sparql ) > self::MAX_GET_SIZE ) {
+                       // big requests go to POST
+                       $options['method'] = 'POST';
+                       $options['postData'] = 'query=' . urlencode( $sparql );
+                       unset( $queryData['query'] );
+               }
+
+               $url = wfAppendQuery( $this->endpoint, $queryData );
+               $request = $this->requestFactory->create( $url, $options, __METHOD__ );
+
+               $status = $request->execute();
+
+               if ( !$status->isOK() ) {
+                       throw new SparqlException( "HTTP error: {$status->getWikiText()}" );
+               }
+               $result = $request->getContent();
+               \MediaWiki\suppressWarnings();
+               $data = json_decode( $result, true );
+               \MediaWiki\restoreWarnings();
+               if ( $data === null || $data === false ) {
+                       throw new SparqlException( "HTTP request failed, response:\n" .
+                               substr( $result, 1024 ) );
+               }
+
+               return $this->extractData( $data, $rawData );
+       }
+
+       /**
+        * Extract data from SPARQL response format.
+        * The response must be in format described in:
+        * https://www.w3.org/TR/sparql11-results-json/
+        *
+        * @param array $data SPARQL result
+        * @param bool  $rawData Whether to return only values or full data objects
+        *
+        * @return array List of results, one row per element.
+        */
+       private function extractData( $data, $rawData = false ) {
+               $result = [];
+               if ( $data && !empty( $data['results'] ) ) {
+                       $vars = $data['head']['vars'];
+                       $resrow = [];
+                       foreach ( $data['results']['bindings'] as $row ) {
+                               foreach ( $vars as $var ) {
+                                       if ( !isset( $row[$var] ) ) {
+                                               $resrow[$var] = null;
+                                               continue;
+                                       }
+                                       if ( $rawData ) {
+                                               $resrow[$var] = $row[$var];
+                                       } else {
+                                               $resrow[$var] = $row[$var]['value'];
+                                       }
+                               }
+                               $result[] = $resrow;
+                       }
+               }
+               return $result;
+       }
+
+}
diff --git a/includes/sparql/SparqlException.php b/includes/sparql/SparqlException.php
new file mode 100644 (file)
index 0000000..d65521e
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Sparql;
+
+use Exception;
+
+/**
+ * Exception for SPARQLClient
+ * @author Stas Malyshev
+ */
+class SparqlException extends Exception {
+}
index 4b5dedf..5a98bb9 100644 (file)
@@ -380,9 +380,9 @@ class SpecialExport extends SpecialPage {
                        $buffer = WikiExporter::STREAM;
 
                        // This might take a while... :D
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        set_time_limit( 0 );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                }
 
                $exporter = new WikiExporter( $db, $history, $buffer );
index 2d087ca..fb04b90 100644 (file)
@@ -80,9 +80,9 @@ class SpecialLockdb extends FormSpecialPage {
                        return Status::newFatal( 'locknoconfirm' );
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $fp = fopen( $this->getConfig()->get( 'ReadOnlyFile' ), 'w' );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( false === $fp ) {
                        # This used to show a file not found error, but the likeliest reason for fopen()
index de3fd19..cc43580 100644 (file)
@@ -82,7 +82,7 @@ class SpecialLog extends SpecialPage {
                        if ( $offender ) {
                                if ( $offender->getId() > 0 ) {
                                        $qc = [ 'ls_field' => 'target_author_id', 'ls_value' => $offender->getId() ];
-                               } else {
+                               } elseif ( !empty( $opts->getValue( 'offender' ) ) ) {
                                        $qc = [ 'ls_field' => 'target_author_ip', 'ls_value' => $offender->getName() ];
                                }
                        }
index 7cc0dc6..4abdebf 100644 (file)
@@ -220,20 +220,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
        }
 
-       /**
-        * Get a FormOptions object containing the default options
-        *
-        * @return FormOptions
-        */
-       public function getDefaultOptions() {
-               $opts = parent::getDefaultOptions();
-
-               $opts->add( 'categories', '' );
-               $opts->add( 'categories_any', false );
-
-               return $opts;
-       }
-
        /**
         * Get all custom filters
         *
@@ -359,11 +345,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $join_conds
                );
 
-               // Build the final data
-               if ( $this->getConfig()->get( 'AllowCategorizedRecentChanges' ) ) {
-                       $this->filterByCategories( $rows, $opts );
-               }
-
                return $rows;
        }
 
@@ -667,16 +648,12 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         */
        function getExtraOptions( $opts ) {
                $opts->consumeValues( [
-                       'namespace', 'invert', 'associated', 'tagfilter', 'categories', 'categories_any'
+                       'namespace', 'invert', 'associated', 'tagfilter'
                ] );
 
                $extraOpts = [];
                $extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
 
-               if ( $this->getConfig()->get( 'AllowCategorizedRecentChanges' ) ) {
-                       $extraOpts['category'] = $this->categoryFilterForm( $opts );
-               }
-
                $tagFilter = ChangeTags::buildTagFilterSelector(
                        $opts['tagfilter'], false, $this->getContext() );
                if ( count( $tagFilter ) ) {
@@ -740,29 +717,17 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                return [ $nsLabel, "$nsSelect $invert $associated" ];
        }
 
-       /**
-        * Create an input to filter changes by categories
-        *
-        * @param FormOptions $opts
-        * @return array
-        */
-       protected function categoryFilterForm( FormOptions $opts ) {
-               list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
-                       'categories', 'mw-categories', false, $opts['categories'] );
-
-               $input .= ' ' . Xml::checkLabel( $this->msg( 'rc_categories_any' )->text(),
-                       'categories_any', 'mw-categories_any', $opts['categories_any'] );
-
-               return [ $label, $input ];
-       }
-
        /**
         * Filter $rows by categories set in $opts
         *
+        * @deprecated since 1.31
+        *
         * @param ResultWrapper &$rows Database rows
         * @param FormOptions $opts
         */
        function filterByCategories( &$rows, FormOptions $opts ) {
+               wfDeprecated( __METHOD__, '1.31' );
+
                $categories = array_map( 'trim', explode( '|', $opts['categories'] ) );
 
                if ( !count( $categories ) ) {
index f821eff..127a36b 100644 (file)
@@ -450,9 +450,7 @@ class SpecialUndelete extends SpecialPage {
                if ( ( $this->mPreview || !$isText ) && $content ) {
                        // NOTE: non-text content has no source view, so always use rendered preview
 
-                       // Hide [edit]s
                        $popts = $out->parserOptions();
-                       $popts->setEditSection( false );
 
                        $pout = $content->getParserOutput( $this->mTargetObj, $rev->getId(), $popts, true );
                        $out->addParserOutput( $pout, [
index 8cd86ce..3135653 100644 (file)
@@ -69,9 +69,9 @@ class SpecialUnlockdb extends FormSpecialPage {
                }
 
                $readOnlyFile = $this->getConfig()->get( 'ReadOnlyFile' );
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $res = unlink( $readOnlyFile );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $res ) {
                        return Status::newGood();
index c3fa2b1..e29467d 100644 (file)
@@ -427,14 +427,14 @@ class ContribsPager extends RangeChronologicalPager {
                 * we're definitely dealing with revision data and we may proceed, if not, we'll leave it
                 * to extensions to subscribe to the hook to parse the row.
                 */
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                try {
                        $rev = new Revision( $row );
                        $validRevision = (bool)$rev->getId();
                } catch ( Exception $e ) {
                        $validRevision = false;
                }
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $validRevision ) {
                        $attribs['data-mw-revid'] = $rev->getId();
index 8a76efb..1c31724 100644 (file)
@@ -207,14 +207,14 @@ class DeletedContribsPager extends IndexPager {
                 * we're definitely dealing with revision data and we may proceed, if not, we'll leave it
                 * to extensions to subscribe to the hook to parse the row.
                 */
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                try {
                        $rev = Revision::newFromArchiveRow( $row );
                        $validRevision = (bool)$rev->getId();
                } catch ( Exception $e ) {
                        $validRevision = false;
                }
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $validRevision ) {
                        $attribs['data-mw-revid'] = $rev->getId();
index ddb4bba..064ca67 100644 (file)
@@ -1425,9 +1425,9 @@ abstract class UploadBase {
                // detect the encoding in case is specifies an encoding not whitelisted in self::$safeXmlEncodings
                $attemptEncodings = [ 'UTF-16', 'UTF-16BE', 'UTF-32', 'UTF-32BE' ];
                foreach ( $attemptEncodings as $encoding ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $str = iconv( $encoding, 'UTF-8', $contents );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $str != '' && preg_match( "!<\?xml\b(.*?)\?>!si", $str, $matches ) ) {
                                if ( preg_match( $encodingRegex, $matches[1], $encMatch )
                                        && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
index 13ac6b2..f039d04 100644 (file)
@@ -56,7 +56,7 @@ class ExternalUserNames {
                        if ( $interwikiLookup->isValidInterwiki( $firstIw ) ) {
                                $title = MWNamespace::getCanonicalName( NS_USER ) . ':' . substr( $userName, $pos + 1 );
                                if ( $iw ) {
-                                       $title = join( ':', $iw ) . ':' . $title;
+                                       $title = implode( ':', $iw ) . ':' . $title;
                                }
                                return Title::makeTitle( NS_MAIN, $title, '', $firstIw );
                        }
index f771f42..e757e59 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use Wikimedia\Rdbms\IDatabase;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Represents a "user group membership" -- a specific instance of a user belonging
@@ -158,7 +159,7 @@ class UserGroupMembership {
                }
 
                // Purge old, expired memberships from the DB
-               self::purgeExpired( $dbw );
+               JobQueueGroup::singleton()->push( new UserGroupExpiryJob() );
 
                // Check that the values make sense
                if ( $this->group === null ) {
@@ -236,38 +237,59 @@ class UserGroupMembership {
 
        /**
         * Purge expired memberships from the user_groups table
-        *
-        * @param IDatabase|null $dbw
         */
-       public static function purgeExpired( IDatabase $dbw = null ) {
-               if ( wfReadOnly() ) {
+       public static function purgeExpired() {
+               $services = MediaWikiServices::getInstance();
+               if ( $services->getReadOnlyMode()->isReadOnly() ) {
                        return;
                }
 
-               if ( $dbw === null ) {
-                       $dbw = wfGetDB( DB_MASTER );
-               }
+               $lbFactory = $services->getDBLoadBalancerFactory();
+               $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
+               $dbw = $services->getDBLoadBalancer()->getConnection( DB_MASTER );
 
-               DeferredUpdates::addUpdate( new AtomicSectionUpdate(
-                       $dbw,
-                       __METHOD__,
-                       function ( IDatabase $dbw, $fname ) {
-                               $expiryCond = [ 'ug_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ];
-                               $res = $dbw->select( 'user_groups', self::selectFields(), $expiryCond, $fname );
+               $lockKey = $dbw->getDomainID() . ':usergroups-prune'; // specific to this wiki
+               $scopedLock = $dbw->getScopedLockAndFlush( $lockKey, __METHOD__, 0 );
+               if ( !$scopedLock ) {
+                       return; // already running
+               }
 
-                               // save an array of users/groups to insert to user_former_groups
-                               $usersAndGroups = [];
+               $now = time();
+               do {
+                       $dbw->startAtomic( __METHOD__ );
+
+                       $res = $dbw->select(
+                               'user_groups',
+                               self::selectFields(),
+                               [ 'ug_expiry < ' . $dbw->addQuotes( $dbw->timestamp( $now ) ) ],
+                               __METHOD__,
+                               [ 'FOR UPDATE', 'LIMIT' => 100 ]
+                       );
+
+                       if ( $res->numRows() > 0 ) {
+                               $insertData = []; // array of users/groups to insert to user_former_groups
+                               $deleteCond = []; // array for deleting the rows that are to be moved around
                                foreach ( $res as $row ) {
-                                       $usersAndGroups[] = [ 'ufg_user' => $row->ug_user, 'ufg_group' => $row->ug_group ];
+                                       $insertData[] = [ 'ufg_user' => $row->ug_user, 'ufg_group' => $row->ug_group ];
+                                       $deleteCond[] = $dbw->makeList(
+                                               [ 'ug_user' => $row->ug_user, 'ug_group' => $row->ug_group ],
+                                               $dbw::LIST_AND
+                                       );
                                }
+                               // Delete the rows we're about to move
+                               $dbw->delete(
+                                       'user_groups',
+                                       $dbw->makeList( $deleteCond, $dbw::LIST_OR ),
+                                       __METHOD__
+                               );
+                               // Push the groups to user_former_groups
+                               $dbw->insert( 'user_former_groups', $insertData, __METHOD__, [ 'IGNORE' ] );
+                       }
 
-                               // delete 'em all
-                               $dbw->delete( 'user_groups', $expiryCond, $fname );
+                       $dbw->endAtomic( __METHOD__ );
 
-                               // and push the groups to user_former_groups
-                               $dbw->insert( 'user_former_groups', $usersAndGroups, __METHOD__, [ 'IGNORE' ] );
-                       }
-               ) );
+                       $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
+               } while ( $res->numRows() > 0 );
        }
 
        /**
index 93f635d..9679bfe 100644 (file)
@@ -62,9 +62,9 @@ class ExecutableFinder {
        protected static function findExecutable( $path, $name, $versionInfo = false ) {
                $command = $path . DIRECTORY_SEPARATOR . $name;
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $file_exists = is_executable( $command );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $file_exists ) {
                        if ( !$versionInfo ) {
index afe9c0a..e390f21 100644 (file)
@@ -93,11 +93,11 @@ class FileContentsHasher {
                        $filePaths = (array)$filePaths;
                }
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
 
                if ( count( $filePaths ) === 1 ) {
                        $hash = $instance->getFileContentsHashInternal( $filePaths[0], $algo );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        return $hash;
                }
 
@@ -106,7 +106,7 @@ class FileContentsHasher {
                        return $instance->getFileContentsHashInternal( $filePath, $algo ) ?: '';
                }, $filePaths );
 
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $hashes = implode( '', $hashes );
                return $hashes ? hash( $algo, $hashes ) : false;
index 164615a..4d5c3af 100644 (file)
@@ -53,7 +53,7 @@ class UIDGenerator {
                }
                // Try to get some ID that uniquely identifies this machine (RFC 4122)...
                if ( !preg_match( '/^[0-9a-f]{12}$/i', $nodeId ) ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        if ( wfIsWindows() ) {
                                // https://technet.microsoft.com/en-us/library/bb490913.aspx
                                $csv = trim( wfShellExec( 'getmac /NH /FO CSV' ) );
@@ -67,7 +67,7 @@ class UIDGenerator {
                                        wfShellExec( '/sbin/ifconfig -a' ), $m );
                                $nodeId = isset( $m[1] ) ? str_replace( ':', '', $m[1] ) : '';
                        }
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( !preg_match( '/^[0-9a-f]{12}$/i', $nodeId ) ) {
                                $nodeId = MWCryptRand::generateHex( 12, true );
                                $nodeId[1] = dechex( hexdec( $nodeId[1] ) | 0x1 ); // set multicast bit
index 1439421..1a0f504 100644 (file)
@@ -131,4 +131,11 @@ class NoWriteWatchedItemStore implements WatchedItemStoreInterface {
                throw new DBReadOnlyError( null, 'The watchlist is currently readonly.' );
        }
 
+       public function clearUserWatchedItems( User $user ) {
+               throw new DBReadOnlyError( null, 'The watchlist is currently readonly.' );
+       }
+
+       public function clearUserWatchedItemsUsingJobQueue( User $user ) {
+               throw new DBReadOnlyError( null, 'The watchlist is currently readonly.' );
+       }
 }
index d5a3d7c..133f480 100644 (file)
@@ -288,4 +288,22 @@ interface WatchedItemStoreInterface {
         */
        public function duplicateEntry( LinkTarget $oldTarget, LinkTarget $newTarget );
 
+       /**
+        * Queues a job that will clear the users watchlist using the Job Queue.
+        *
+        * @since 1.31
+        *
+        * @param User $user
+        */
+       public function clearUserWatchedItems( User $user );
+
+       /**
+        * Queues a job that will clear the users watchlist using the Job Queue.
+        *
+        * @since 1.31
+        *
+        * @param User $user
+        */
+       public function clearUserWatchedItemsUsingJobQueue( User $user );
+
 }
index 0a48be3..6966832 100644 (file)
@@ -20,6 +20,7 @@
                "resources/src/mediawiki.special",
                "resources/src/mediawiki.toolbar",
                "resources/src/mediawiki.widgets",
+               "resources/src/mediawiki.widgets.visibleByteLimit",
                "resources/src/jquery/jquery.accessKeyLabel.js",
                "resources/src/jquery/jquery.byteLength.js",
                "resources/src/jquery/jquery.byteLimit.js",
index 252ce47..fc8ef87 100644 (file)
@@ -2140,7 +2140,7 @@ class Language {
                        return $ts;
                }
 
-               MediaWiki\suppressWarnings(); // E_STRICT system time bitching
+               Wikimedia\suppressWarnings(); // E_STRICT system time bitching
                # Generate an adjusted date; take advantage of the fact that mktime
                # will normalize out-of-range values so we don't have to split $minDiff
                # into hours and minutes.
@@ -2153,7 +2153,7 @@ class Language {
                        (int)substr( $ts, 0, 4 ) ); # Year
 
                $date = date( 'YmdHis', $t );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                return $date;
        }
@@ -2605,9 +2605,9 @@ class Language {
                # *input* string. We just ignore those too.
                # REF: https://bugs.php.net/bug.php?id=37166
                # REF: https://phabricator.wikimedia.org/T18885
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $text = iconv( $in, $out . '//IGNORE', $string );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                return $text;
        }
 
index 982f97a..2252645 100644 (file)
@@ -148,6 +148,7 @@ class Names {
                'en-gb' => 'British English', # British English
                'eo' => 'Esperanto', # Esperanto
                'es' => 'español', # Spanish
+               'es-formal' => 'español (formal)', # Spanish formal address
                'et' => 'eesti', # Estonian
                'eu' => 'euskara', # Basque
                'ext' => 'estremeñu', # Extremaduran
@@ -260,7 +261,7 @@ class Names {
                'ky' => 'Кыргызча', # Kirghiz
                'la' => 'Latina', # Latin
                'lad' => 'Ladino', # Ladino
-               'lb' => 'Lëtzebuergesch', # Luxemburguish
+               'lb' => 'Lëtzebuergesch', # Luxembourgish
                'lbe' => 'лакку', # Lak
                'lez' => 'лезги', # Lezgi
                'lfn' => 'Lingua Franca Nova', # Lingua Franca Nova
index 985f664..ed36e93 100644 (file)
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 kalön {{PLURAL:$1|ureuëng ngui}}]",
-       "rc_categories_any": "Pue-pue mantöng",
        "rc-change-size-new": "$1 {{PLURAL:$1|bita}} lheuëh neuubah",
        "newsectionsummary": "/* $1 */ bideung barô",
        "rc-enhanced-expand": "Peuleumah rincian",
index 2350e81..264a16d 100644 (file)
        "minoreditletter": "ц",
        "newpageletter": "КӀ",
        "boteditletter": "б",
-       "rc_categories_any": "ХэшыпыкIыгъэмэ ащыщ горэ",
        "rc-change-size-new": "$1 {{PLURAL:$1|байт}} зэхъокӀым ыуж",
        "newsectionsummary": "/* $1 */ секциякIэ",
        "rc-enhanced-expand": "Ӏэмэ-псымэхэр къэгъэлъагъу",
index 85441b6..c467a1e 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|gebruiker|gebruikers}} hou die bladsy dop]",
-       "rc_categories": "Beperk tot kategorieë (skei met \"|\"):",
-       "rc_categories_any": "Enige van die gekose",
        "rc-change-size-new": "$1 {{PLURAL:$1|greep|grepe}} na die wysiging",
        "newsectionsummary": "/* $1 */ nuwe afdeling",
        "rc-enhanced-expand": "Wys details",
index 92a8306..adae8ab 100644 (file)
        "newpageletter": "baluhay",
        "boteditletter": "kikay a tademaw",
        "number_of_watching_users_pageview": "[$1 imahini miazihay a {{PLURAL:$1|misaungayay}}]",
-       "rc_categories": "kakuniza kelec (ku \"|\" palaliyas):",
-       "rc_categories_any": "amahicahica tu mipili’ay",
        "rc-change-size-new": "masumadtu sa u $1 {{PLURAL:$1|wyiyincu}}",
        "newsectionsummary": "/* $1 */ baluhay a tusil",
        "rc-enhanced-expand": "paazih pulita kalunasulitan",
        "recentchangeslinked-feed": "sasuala a sumad",
        "recentchangeslinked-toolbox": "sasuala a sumad",
        "recentchangeslinked-title": "pulung \"$1\" sasuala a sumaday",
-       "recentchangeslinked-summary": "uyni kasabelih pasilsil micuzu’ kasabelih masasiketay saca hamin kasabelihan (hakya u matuzu’ay kakuniza\nilabu saca hamin mamikawaw)izaw ku  misumaday kasabelih piazihan tu sulit.\nizawtu ku [[Special:Watchlist|sapacukat a sulit nu misu]] ilabuay a kasabelih apatahkal ku <strong>kibetulay a sulit</strong> sacuzu’.",
+       "recentchangeslinked-summary": "uyni kasabelih pasilsil micuzu’ kasabelih masasiketay saca hamin kasabelihan (hakya u matuzu’ay kakuniza\nilabu saca hamin mamikawaw)izaw ku misumaday kasabelih piazihan tu sulit.\nizawtu ku [[Special:Watchlist|sapacukat a sulit nu misu]] ilabuay a kasabelih apatahkal ku <strong>kibetulay a sulit</strong> sacuzu’.",
        "recentchangeslinked-page": "kasabelih kalungangan:",
        "recentchangeslinked-to": "Show changes to pages linked to the given page instead\nmisumad ku paazih masasiket tayza matuzu’ay kasabelih a nisumad",
        "recentchanges-page-added-to-category": "[[:$1]] macunus tu ta kakuniza",
index 85ab197..7128e15 100644 (file)
        "newpageletter": "አ",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 የሚከታተሉ {{PLURAL:$1|ተጠቃሚ|ተጠቃሚዎች}}]",
-       "rc_categories_any": "ማንኛውም",
        "newsectionsummary": "/* $1 */ አዲስ ክፍል",
        "rc-enhanced-expand": "ዝርዝሩን አሳይ (JavaScript ያስፈልጋል)",
        "rc-enhanced-hide": "ዝርዝሩን ደብቅ",
index dac87ec..792b9e0 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} cosirando]",
-       "rc_categories": "Limite ta las categorías (deseparatas por \"|\")",
-       "rc_categories_any": "Todas",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dimpués d'o cambio",
        "newsectionsummary": "Nueva sección: /* $1 */",
        "rc-enhanced-expand": "Amostrar detalles",
index d1e4b14..84eaa79 100644 (file)
        "minoreditletter": "ly",
        "newpageletter": "N",
        "boteditletter": "þr",
-       "rc_categories_any": "Ǣnig",
        "rc-enhanced-expand": "Īwan stafas",
        "rc-enhanced-hide": "Hȳdan stafas",
        "recentchangeslinked": "Sibba andwendunga",
index 9a0844a..0062d99 100644 (file)
        "newpageletter": "ج‌",
        "boteditletter": "ب",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|لا مستخدمون يراقبون|مستخدم واحد يراقب|مستخدمان يراقبان|$1 مستخدمين يراقبون|$1 مستخدما يراقب|$1 مستخدم يراقب}}]",
-       "rc_categories": "حصر لتصنيفات (مفرقة برمز \"|\"):",
-       "rc_categories_any": "أي من المختار",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايت|بايت}} بعد التغيير",
        "newsectionsummary": "/* $1 */ قسم جديد",
        "rc-enhanced-expand": "عرض التفاصيل",
        "rollback-success": "تم استرجاع تعديلات {{GENDER:$3|$1}}، حتى آخر نسخة بواسطة {{GENDER:$4|$2}}.",
        "rollback-success-notify": "تم استرجاع التعديلات بواسطة $1;\nتم التغيير إلى آخر مراجعة بواسطة $2. [$3 عرض التغييرات]",
        "sessionfailure-title": "فشل في الجلسة",
-       "sessionfailure": "Ù\8aبدÙ\88 Ø£Ù\86Ù\87 Ù\87Ù\86اÙ\83 Ù\85Ø´Ù\83Ù\84Ø© Ù\81Ù\8a Ø¬Ù\84سة Ø§Ù\84دخÙ\88Ù\84 Ø§Ù\84خاصة Ø¨Ù\83Ø\9b\nÙ\84Ø°Ù\84Ù\83 Ù\81Ù\82د Ø£Ù\84غÙ\8aت Ù\87Ø°Ù\87 Ø§Ù\84عÙ\85Ù\84Ù\8aØ© Ù\83إجراء Ø§Ø­ØªØ±Ø§Ø²Ù\8a Ø¶Ø¯ Ø§Ù\84اختراÙ\82.\nÙ\85Ù\86 Ù\81ضÙ\84Ù\83 Ø§Ø¶ØºØ· Ø¹Ù\84Ù\89 Ù\85Ù\81تاح \"رجÙ\88ع\" Ù\84تحÙ\85Ù\8aÙ\84 Ø§Ù\84صÙ\81حة Ø§Ù\84تÙ\8a Ø¬Ø¦Øª Ù\85Ù\86Ù\87اØ\8c Ø«Ù\85 Ø­Ø§Ù\88Ù\84 مرة أخرى.",
+       "sessionfailure": "Ù\8aبدÙ\88 Ø£Ù\86Ù\87 Ù\87Ù\86اÙ\83 Ù\85Ø´Ù\83Ù\84Ø© Ù\81Ù\8a Ø¬Ù\84سة Ø§Ù\84دخÙ\88Ù\84 Ø§Ù\84خاصة Ø¨Ù\83Ø\9b\nÙ\84Ø°Ù\84Ù\83 Ù\81Ù\82د Ø£Ù\84غÙ\8aت Ù\87Ø°Ù\87 Ø§Ù\84عÙ\85Ù\84Ù\8aØ© Ù\83إجراء Ø§Ø­ØªØ±Ø§Ø²Ù\8a Ø¶Ø¯ Ø§Ù\84اختراÙ\82.\nÙ\85Ù\86 Ù\81ضÙ\84Ù\83 Ø£Ø¹Ø¯ Ø¥Ø±Ø³Ø§Ù\84 Ø§Ù\84استÙ\85ارة مرة أخرى.",
        "changecontentmodel": "غير نموذج المحتوى لصفحة",
        "changecontentmodel-legend": "غير نموذج المحتوى",
        "changecontentmodel-title-label": "عنوان الصفحة",
        "thumbnail_dest_directory": "غير قادر على إنشاء المجلد الهدف",
        "thumbnail_image-type": "نوع الصورة غير مدعوم",
        "thumbnail_gd-library": "ضبط مكتبة GD غير مكتمل: دالة مفقودة $1",
+       "thumbnail_image-size-zero": "حجم ملف الصورة يبدو أنه صفر.",
        "thumbnail_image-missing": "الملف يبدو أنه مفقود: $1",
        "thumbnail_image-failure-limit": "هناك الكثير من المحاولات الفاشلة مؤخراً ($1 أو أكثر) لتَصْيير هذه الصورة المصغرة. الرجاء المحاولة مرة أخرى لاحقاً.",
        "import": "استيراد صفحات",
        "watchlistedit-clear-titles": "العناوين:",
        "watchlistedit-clear-submit": "امسح قائمة المراقبة (هذا دائم!)",
        "watchlistedit-clear-done": "مُسِحت قائمة مراقبتك.",
+       "watchlistedit-clear-jobqueue": "قائمة مراقبتك يتم إفراغها. هذا قد يستغرق بعض الوقت!",
        "watchlistedit-clear-removed": "{{PLURAL:$1||أزيل العنوان التالي|أزيل العنوانان التاليان|أزيلت العناوين ال$1 التالية}}:",
        "watchlistedit-too-many": "الصفحات أكثر من أن تعرض هنا.",
        "watchlisttools-clear": "امسح قائمة المراقبة",
index 93fc59e..9a9b6a8 100644 (file)
        "minoreditletter": "ܙ",
        "newpageletter": "ܚ",
        "boteditletter": "ܒ",
-       "rc_categories_any": "ܐܝܢܐ ܕܗܘ",
        "rc-change-size-new": "$1 {{PLURAL:$1|ܒܐܝܛ|ܒܐܝܛ̈ܐ}} ܒܬܪ ܫܘܚܠܦܐ",
        "newsectionsummary": "/* $1 */ ܡܢܬܐ ܚܕܬܐ",
        "rc-enhanced-expand": "ܚܘܝ ܐܪ̈ܝܟܬܐ",
index ed0e562..367890f 100644 (file)
        "newpageletter": "J",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 katchof  {{PLURAL:$1|mostkhdim|mostkhdimin}}]",
-       "rc_categories": "limiti tsnifat (frqha b  \"|\")",
-       "rc_categories_any": "ay wahd",
        "rc-change-size": "$1",
        "newsectionsummary": "/* $1 */ qism jdid",
        "rc-enhanced-expand": "Werri ṫ-ṫafaṣil (kayḫṫaj JavaScript)",
index 1d36eba..b7d65d2 100644 (file)
        "summary-preview": "بروفه للملخص:",
        "subject-preview": "بروفة للعنوان/للموضوع",
        "blockedtitle": "اليوزر ممنوع",
-       "blockedtext": "'''تم منع اسم اليوزر أو عنوان الااى بى بتاعك .'''\n\nسبب المنع هو: ''$2''. وقام بالمنع $1.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nممكن التواصل مع $1 لمناقشة المنع، أو مع واحد من [[{{MediaWiki:Grouppage-sysop}}|الاداريين]] عن المنع>\nافتكر انه مش ممكن تبعت ايميل  لليوزرز الا اذا كنت سجلت عنوان ايميل صحيح فى صفحة [[Special:Preferences|التفضيلات]] بتاعتك.\nعنوان الااى بى بتاعك حاليا هو $3 وكود المنع هو #$5.من فضلك ضيف اى واحد منهم أو كلاهما فى اى رسالة للتساؤل عن المنع.",
+       "blockedtext": "'''تم منع اسم اليوزر أو عنوان الاى بى بتاعك .'''\n\nسبب المنع هو: ''$2''. وقام بالمنع $1.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nممكن التواصل مع $1 لمناقشة المنع، أو مع واحد من [[{{MediaWiki:Grouppage-sysop}}|الاداريين]] عن المنع>\nافتكر انه مش ممكن تبعت ايميل  لليوزرز الا اذا كنت سجلت عنوان ايميل صحيح فى صفحة [[Special:Preferences|التفضيلات]] بتاعتك.\nعنوان الااى بى بتاعك حاليا هو $3 وكود المنع هو #$5.من فضلك ضيف اى واحد منهم أو كلاهما فى اى رسالة للتساؤل عن المنع.",
        "autoblockedtext": "عنوان الأيبى بتاعك اتمنع اتوماتيكى  علشان فى يوزر تانى استخدمه واللى هو كمان ممنوع بــ $1.\nالسبب هو:\n\n:''$2''\n\n* بداية المنع: $8\n* انهاية المنع: $6\n* الممنوع المقصود: $7\n\nممكن تتصل  ب $1 أو واحد من\n[[{{MediaWiki:Grouppage-sysop}}|الإداريين]] االتانيين لمناقشة المنع.\n\nلاحظ أنه مش ممكن استخدام خاصية \"ابعت رسالة لليوزر دا\" إلا اذا كان عندك ايميل صحيح متسجل فى [[Special:Preferences|تفضيلاتك]].\n\nعنوان الأيبى الحالى الخاص بك هو $3، رقم المنع هو $5. لو سمحت تذكر الرقم دا فى اى استفسار.",
        "blockednoreason": "ما فيش سبب",
        "whitelistedittext": "لازم $1 علشان تقدر تعدل الصفحات.",
        "newpageletter": "ج",
        "boteditletter": "ب",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1| يوزر مراقب|يوزر مراقب}}]",
-       "rc_categories": "حصر لتصنيفات (مفصولة برمز \"|\")",
-       "rc_categories_any": "أى",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايت|بايتس}} بعد التغيير",
        "newsectionsummary": "/* $1 */ قسم جديد",
        "rc-enhanced-expand": "[اعرض التفاصيل]",
        "ipb_already_blocked": "\"$1\" ممنوع فعلا",
        "ipb-needreblock": "$1 ممنوع فعلا. عايز تغير الإعدادات؟",
        "ipb-otherblocks-header": "{{PLURAL:$1||المنع التانى|المنعين التانيين|المنوعات التانيين}}",
-       "ipb_cant_unblock": "غلطه: عنوان الااى بى الممنوع  مش موجود  $1.\nيمكن اترفع منعه فعلا.",
+       "ipb_cant_unblock": "غلطه: عنوان الاى بى الممنوع  مش موجود  $1.\nيمكن اترفع منعه فعلا.",
        "ipb_blocked_as_range": "غلط: الأيبى $1 مش ممنوع مباشرةو مش ممكن رفع المنع عنه.\nبس هو، على الرغم من كدا،ممنوع لانه جزء من النطاق $2، و اللى ممكن رفع المنع عنه.",
        "ip_range_invalid": "نطاق عناوين الأيبى مش صحيح.",
        "ip_range_toolarge": "حدود المنع اللى اكبر من /$1 مش مسموح بيها.",
index 98b5675..43e7591 100644 (file)
        "newpageletter": "ন",
        "boteditletter": "ব",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|জন সদস্যই|জন সদস্যই}} এই পৃষ্ঠা নিৰীক্ষণ কৰিছে]",
-       "rc_categories": "শ্ৰেণীসমূহৰ সীমাবদ্ধতা (\"|\" দি পৃথক কৰক):",
-       "rc_categories_any": "বাছনি কৰাৰ মাজত যিকোনো",
        "rc-change-size-new": "$1 {{PLURAL:$1|বাইট}} যোগ দিয়া হ’ল",
        "newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ",
        "rc-enhanced-expand": "সবিশেষ দেখুৱাওক",
index 10c3855..258e0c1 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuariu|usuarios}} vixilando]",
-       "rc_categories": "Llendar a les categoríes (dixebrar con \"|\"):",
-       "rc_categories_any": "Cualquiera de les esbillaes",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dempués del cambiu",
        "newsectionsummary": "/* $1 */ nueva seición",
        "rc-enhanced-expand": "Amosar detalles",
        "rollback-success": "Revertíes les ediciones de {{GENDER:$3|$1}}; devueltu a la última revisión de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]",
        "sessionfailure-title": "Fallu de sesión",
-       "sessionfailure": "Paez qu'hai un problema col aniciu de sesión;\natayóse esta aición por precaución escontra secuestru de sesiones.\nTorna a la páxina anterior, recarga esa páxina y vuelve a tentalo.",
+       "sessionfailure": "Paez qu'hai un problema col aniciu de sesión;\natayóse esta aición por precaución escontra secuestru de sesiones.\nUnvia'l formulariu otra vegada.",
        "changecontentmodel": "Cambiar el modelu de conteníu d'una páxina",
        "changecontentmodel-legend": "Cambiar el modelu de conteníu",
        "changecontentmodel-title-label": "Títulu de la páxina",
        "watchlistedit-clear-titles": "Títulos:",
        "watchlistedit-clear-submit": "Llimpiar la llista de siguimientu (¡Esto ye permanente!)",
        "watchlistedit-clear-done": "Llimpióse la to llista de siguimientu.",
+       "watchlistedit-clear-jobqueue": "Ta llimpiándose la llista de siguimientu. ¡Esta aición puede tardar daqué de tiempu!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Desanicióse 1 títulu|Desaniciáronse $1 títulos}}:",
        "watchlistedit-too-many": "Hai demasiaes páxines p'amosales equí.",
        "watchlisttools-clear": "Llimpiar la llista de siguimientu",
index a7d5330..39b2b30 100644 (file)
        "newpageletter": "W",
        "boteditletter": "s",
        "number_of_watching_users_pageview": "[$1 nedis {{PLURAL:$1|favesik|favesik}}]",
-       "rc_categories": "Kimara kare loma yo (solparsana kan \"|\")",
-       "rc_categories_any": "Kon",
        "newsectionsummary": "/* $1 */ warzaf gabot",
        "rc-enhanced-expand": "Pintanedira (JavaScript tir adraf)",
        "rc-enhanced-hide": "Pintapalsera",
index a1eadcb..6849379 100644 (file)
        "newpageletter": "न",
        "boteditletter": "बॉ",
        "number_of_watching_users_pageview": "[$1 ध्यान राखय वाले {{PLURAL:$1|सदस्य}}]",
-       "rc_categories": "श्रेणीन् तक सीमीत रक्खा जाय (\"|\" से अलग करा जाय)",
-       "rc_categories_any": "कवनो भी",
        "rc-change-size-new": "बदलाव कय बाद $1 {{PLURAL:$1|बाइट}}",
        "newsectionsummary": "/* $1 */ नँवा अनुभाग",
        "rc-enhanced-expand": "विस्तृत जानकारी देखावा जाय",
index 48c0971..f428e9c 100644 (file)
        "newpageletter": "Y",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 izləyən istifadəçi]",
-       "rc_categories": "Kateqoriyalara limit qoy (\"|\" ilə ayır)",
-       "rc_categories_any": "Seçilənlərdən hər hansı biri",
        "rc-change-size": "$1",
        "rc-change-size-new": "Dəyişiklikdən sonrakı ölçü: $1 bayt",
        "newsectionsummary": "/* $1 */ yeni bölmə",
index 9abf0be..3137638 100644 (file)
        "newpageletter": "ی",
        "boteditletter": "ب",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|بیر|$1}} ایزله‌ین ایستیفاده‌چی]",
-       "rc_categories": "بؤلمه‌لره محدودلاشدیر («|» ایله آییر)",
-       "rc_categories_any": "سئچیلمیشلرین هر بیریسی",
        "rc-change-size-new": "دَییشیکلیک‌دن سوْنرا {{PLURAL:|بیر|$1}} بایت",
        "newsectionsummary": "/* $1 */ یئنی بؤلمه",
        "rc-enhanced-expand": "تفصیل‌لری گؤستر",
index 988ecdf..a44a7c0 100644 (file)
        "newpageletter": "Я",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 күҙәткән {{PLURAL:$1|ҡатнашыусы}}]",
-       "rc_categories": "Тик категорияларҙан ғына (бүлеүсе «|»):",
-       "rc_categories_any": "Һайланғандың теләһә ҡайһыһы",
        "rc-change-size-new": "Үҙгәртештән һуң күләм: $1 {{PLURAL:$1|1=байт|байт}}",
        "newsectionsummary": "/* $1 */ яңы бүлек",
        "rc-enhanced-expand": "Ваҡ-төйәгенә тиклем күрһәтергә",
index 5e6571d..143531c 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beówochtender|beówochtende}} Benutzer]",
-       "rc_categories": "Netter Seiten aus d' Kategorien (trennd mid \"l\"):",
-       "rc_categories_any": "Olle",
        "newsectionsummary": "Neicher Obschnit /* $1 */",
        "rc-enhanced-expand": "Details zoagn (braucht JavaScript)",
        "rc-enhanced-hide": "Details vastecka",
index 49f9457..22f8bbb 100644 (file)
        "newpageletter": "ن",
        "boteditletter": "ب",
        "number_of_watching_users_pageview": "[$1 چارگنت {{PLURAL:$1|کاربر|کابران}}]",
-       "rc_categories": "محدودیت په دسته جات(دورش گون\"|\")",
-       "rc_categories_any": "هرچی",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} رند چه تغییر",
        "newsectionsummary": "/* $1 */ نوکین بخش",
        "rc-enhanced-expand": "جزئیاتء پیس دارگ",
index cdacb1a..2208f5b 100644 (file)
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 naka-antabay sa {{PLURAL:$1|paragamit|mga paragamit}}]",
-       "rc_categories": "Limitado sa mga kategorya (suhayon nin \"|\")",
-       "rc_categories_any": "Dawà arín",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} pagtatapos kan pagbabago",
        "newsectionsummary": "/* $1 */ bàgong seksyon",
        "rc-enhanced-expand": "Ipahiling an mga detalye",
index 2cb1ec9..c428513 100644 (file)
        "right-reupload-shared": "Перазапіс файлаў з агульнага сховішча лякальнымі",
        "right-upload_by_url": "Загрузка файлаў з URL-адрасу",
        "right-purge": "ачыстка кэшу старонак бяз запыту пацьверджаньня",
-       "right-autoconfirmed": "ня дзейнічаюць абмежаваньні хуткасьці па IP",
-       "right-bot": "лічыцца аўтаматычным працэсам",
-       "right-nominornewtalk": "не паведамляць удзельнікам пра новыя паведамленьні на іх старонках гутарак, калі зробленыя там праўкі былі дробнымі",
+       "right-autoconfirmed": "Ð\9dя дзейнічаюць абмежаваньні хуткасьці па IP",
+       "right-bot": "Ð\9bічыцца аўтаматычным працэсам",
+       "right-nominornewtalk": "Ð\9dе паведамляць удзельнікам пра новыя паведамленьні на іх старонках гутарак, калі зробленыя там праўкі былі дробнымі",
        "right-apihighlimits": "менш абмежаваньняў на выкананьне API-запытаў",
        "right-writeapi": "выкарыстаньне API для запісу",
-       "right-delete": "выдаленьне старонак",
+       "right-delete": "Ð\92ыдаленьне старонак",
        "right-bigdelete": "Выдаленьне старонак зь вялікімі гісторыямі",
        "right-deletelogentry": "выдаленьне і аднаўленьне асобных запісаў журналу",
        "right-deleterevision": "выдаленьне і аднаўленьне асобных вэрсіяў старонак",
-       "right-deletedhistory": "пÑ\80аглÑ\8fд Ð²Ñ\8bдаленай Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\96 Ñ\81Ñ\82аÑ\80онак Ð±Ðµз доступу да выдаленага тэксту",
-       "right-deletedtext": "прагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак",
-       "right-browsearchive": "пошук выдаленых старонак",
-       "right-undelete": "аднаўленьне старонак",
+       "right-deletedhistory": "Ð\9fÑ\80аглÑ\8fд Ð²Ñ\8bдаленай Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\96 Ñ\81Ñ\82аÑ\80онак Ð±Ñ\8fз доступу да выдаленага тэксту",
+       "right-deletedtext": "Ð\9fрагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак",
+       "right-browsearchive": "Ð\9fошук выдаленых старонак",
+       "right-undelete": "Ð\90днаўленьне старонак",
        "right-suppressrevision": "праглядаць, хаваць і аднаўляць пэўныя вэрсіі старонак, зробленыя любым удзельнікам",
        "right-viewsuppressed": "праглядаць вэрсіі старонак, схаваныя ад усіх удзельнікаў",
-       "right-suppressionlog": "прагляд прыватных журналаў",
-       "right-block": "блякаваньне іншых удзельнікаў ад рэдагаваньняў",
+       "right-suppressionlog": "Ð\9fрагляд прыватных журналаў",
+       "right-block": "Ð\91лякаваньне іншых удзельнікаў ад рэдагаваньняў",
        "right-blockemail": "блякаваньне іншых ўдзельнікаў ад дасылкі электроннай пошты",
        "right-hideuser": "блякаваньне рахунку ўдзельніка і яго хаваньне",
        "right-ipblock-exempt": "абход блякаваньняў IP-адрасоў, аўта-блякаваньняў і блякаваньняў дыяпазонаў",
        "newpageletter": "Н",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]",
-       "rc_categories": "Абмежаваць катэгорыямі (разьдзяляйце знакам «|»):",
-       "rc_categories_any": "Любая з абраных",
        "rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасьля зьмены",
        "newsectionsummary": "/* $1 */ новая сэкцыя",
        "rc-enhanced-expand": "Паказаць падрабязнасьці",
        "rollback-success": "Адмененыя рэдагаваньні {{GENDER:$3|$1}};\nвернутая папярэдняя вэрсія {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Адмененыя праўкі $1;\nвернутая папярэдняя вэрсія $2. [$3 Паказаць зьмены]",
        "sessionfailure-title": "Памылка сэсіі",
-       "sessionfailure": "Ð\9cагÑ\87Ñ\8bма Ñ\9eзÑ\8cнÑ\96клÑ\96 Ð¿Ñ\80аблемÑ\8b Ñ\9e Ð\92аÑ\88Ñ\8bм Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96м Ñ\81Ñ\8dанÑ\81е Ð¿Ñ\80аÑ\86Ñ\8b;\nгÑ\8dÑ\82а Ð´Ð·ÐµÑ\8fнÑ\8cне Ð±Ñ\8bло Ñ\81каÑ\81авана Ð´Ð»Ñ\8f Ð¿Ñ\80адÑ\83Ñ\85Ñ\96ленÑ\8cнÑ\8f Ð¿ÐµÑ\80аÑ\85опÑ\83 Ñ\81Ñ\8dанÑ\81Ñ\83.\nÐ\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð½Ð°Ñ\86Ñ\96Ñ\81Ñ\8cнÑ\96Ñ\86е Â«Ð½Ð°Ð·Ð°Ð´Â» Ñ\96 Ð¿ÐµÑ\80азагÑ\80Ñ\83зÑ\96Ñ\86е Ñ\81Ñ\82аÑ\80онкÑ\83, Ð·Ñ\8c Ñ\8fкой Ð\92Ñ\8b Ð¿Ñ\80Ñ\8bйÑ\88лÑ\96, Ñ\96 Ð¿Ð°Ñ\81пÑ\80абÑ\83йÑ\86е Ñ\96зноÑ\9e.",
+       "sessionfailure": "Ð\9cагÑ\87Ñ\8bма Ñ\9eзÑ\8cнÑ\96клÑ\96 Ð¿Ñ\80аблемÑ\8b Ñ\9e Ð²Ð°Ñ\88Ñ\8bм Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96м Ñ\81Ñ\8dанÑ\81е Ð¿Ñ\80аÑ\86Ñ\8b;\nгÑ\8dÑ\82ае Ð´Ð·ÐµÑ\8fнÑ\8cне Ð±Ñ\8bло Ñ\81каÑ\81аванае Ð´Ð»Ñ\8f Ð¿Ñ\80адÑ\83Ñ\85Ñ\96ленÑ\8cнÑ\8f Ð¿ÐµÑ\80аÑ\85опÑ\83 Ñ\81Ñ\8dанÑ\81Ñ\83.\nÐ\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð¿Ð°Ð´Ð°Ð¹Ñ\86е Ñ\84оÑ\80мÑ\83 Ñ\8fÑ\88Ñ\87Ñ\8d Ñ\80аз.",
        "changecontentmodel": "Зьмена мадэлі зьместу старонкі",
        "changecontentmodel-legend": "Зьмена мадэлі зьместу",
        "changecontentmodel-title-label": "Назва старонкі",
        "thumbnail_dest_directory": "Немагчыма стварыць мэтавую дырэкторыю",
        "thumbnail_image-type": "Тып выявы не падтрымліваецца",
        "thumbnail_gd-library": "Няпоўная канфігурацыя бібліятэкі GD: няма функцыі $1",
+       "thumbnail_image-size-zero": "Падобна, што файл мае нулявы памер.",
        "thumbnail_image-missing": "Верагодна няма файла $1",
        "thumbnail_image-failure-limit": "Было зроблена зашмат няўдалых спробаў ($1 ці болей) сфармаваць гэтую мініятуру. Калі ласка, паспрабуйце пазьней.",
        "import": "Імпартаваць старонкі",
        "watchlistedit-clear-titles": "Старонкі:",
        "watchlistedit-clear-submit": "Ачысьціць сьпіс назіраньня (гэта незваротна!)",
        "watchlistedit-clear-done": "Ваш сьпіс назіраньня быў ачышчаны.",
+       "watchlistedit-clear-jobqueue": "Ваш сьпіс назіраньня ачышчаецца. Гэта можа заняць некаторы час!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|$1 запіс быў выдалены|$1 запісы былі выдаленыя|$1 запісаў былі выдаленыя}}:",
        "watchlistedit-too-many": "Зашмат старонак, каб паказаць іх тут.",
        "watchlisttools-clear": "Ачысьціць сьпіс назіраньня",
index 6dac67e..795ab33 100644 (file)
        "newpageletter": "Н",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]",
-       "rc_categories": "Абмежаваць катэгорыямі (размяжоўваць знакам \"|\"):",
-       "rc_categories_any": "Любая з абраных",
        "rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасля змены",
        "newsectionsummary": "/* $1 */ новы падраздзел",
        "rc-enhanced-expand": "Паказаць падрабязнасці",
index ff9c9a8..2b07773 100644 (file)
        "changeemail-no-info": "За да имате директен достъп до тази страница директно е необходимо да влезете в системата.",
        "changeemail-oldemail": "Текущ адрес за е-поща:",
        "changeemail-newemail": "Нов адрес за е-поща:",
+       "changeemail-newemail-help": "Това поле трябва да се остави празно, ако искате да премахнете е-пощата си. Няма да можете да възстановите забравена парола и няма да получавате писма от това уики, ако е-пощата се премахне.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Парола за {{SITENAME}}:",
        "changeemail-submit": "Промяна на е-пощата",
        "newpageletter": "Н",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдаващ потребител|наблюдаващи потребители}}]",
-       "rc_categories": "Само от категории (разделител „|“)",
-       "rc_categories_any": "Която и да е от избраните",
        "rc-change-size-new": "$1 {{PLURAL:$1|байт|байта}} след редакцията",
        "newsectionsummary": "Нова тема /* $1 */",
        "rc-enhanced-expand": "Показване на детайли",
index d919c28..c25ab3e 100644 (file)
        "newpageletter": "نوک",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کار زوروک}} دیستینوک]",
-       "rc_categories": "ای تهرهانی حد ئا (گۆ «|» ئا جیتا کنیت)",
-       "rc_categories_any": "هر گوجام",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایٹ}} پد شه تغیرا",
        "newsectionsummary": "/* $1 */ نوکین بخش",
        "rc-enhanced-expand": "جزئیات ئی نشان داتین",
index 79f2d7e..bda0e06 100644 (file)
        "newpageletter": "न",
        "boteditletter": "बॉ",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता लोग}} के धियानसूची में बा]",
-       "rc_categories": "श्रेणिन के सीमा (\"|\" से अलगा करीं):",
-       "rc_categories_any": "बीछल में से कौनों एक ठो",
        "rc-change-size-new": "बदलाव के बाद $1 {{PLURAL:$1|बाइट|बाइट्स}}",
        "newsectionsummary": "/* $1 */ नया खंड",
        "rc-enhanced-expand": "डिटेल देखावल जाय",
index 9431cf9..e1a1d8e 100644 (file)
        "newpageletter": "H",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|pa'itihi|papa'itihi}}]",
-       "rc_categories": "Watasi tutumbung (pisahakan lawan \"|\")",
-       "rc_categories_any": "Napa gin",
        "rc-change-size-new": "$1 {{PLURAL:$1|bita|bita}} limbah paubahan",
        "newsectionsummary": "/* $1 */ hagian hanyar",
        "rc-enhanced-expand": "Tampaiakan rincian (parlu ada JavaScript)",
index 48f961f..e39abd1 100644 (file)
        "newpageletter": "ন",
        "boteditletter": "ব",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|জন ব্যবহারকারী|জন ব্যবহারকারী}} এই পাতার উপর নজর রাখছেন]",
-       "rc_categories": "বিষয়শ্রেণীগুলিতে সীমা (\"|\" দিয়ে আলাদা করুন):",
-       "rc_categories_any": "চয়নের জন্য যেকোনো কিছু",
        "rc-change-size-new": "পরিবর্তনের পর $1 {{PLURAL:$1|বাইট}}",
        "newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ",
        "rc-enhanced-expand": "বিস্তারিত দেখাও",
index ca9d0bd..33a3f39 100644 (file)
        "minoreditletter": "སྒྲིག་ཆུང་།",
        "newpageletter": "ཤོག་གསར།",
        "boteditletter": "རང་འགུལ་འཕྲུལ་ཆས།",
-       "rc_categories_any": "གང་རུང་།",
        "rc-enhanced-expand": "ཞིབ་ཕྲར་སྟོན།",
        "rc-enhanced-hide": "ཞིབ་ཕྲ་སྦས་བ།",
        "recentchangeslinked": "འབྲེལ་བའི་བཟོ་བཅོས།",
index 3147d4c..8f05d05 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|implijer o heuliañ|implijer}} o heuliañ]",
-       "rc_categories": "Bevenniñ d'ar rummadoù (dispartiet gant \"|\") :",
-       "rc_categories_any": "Unan e-touez ar re zibabet",
        "rc-change-size-new": "$1 {{PLURAL:$1|okted|okted}} goude kemmañ",
        "newsectionsummary": "/* $1 */ rann nevez",
        "rc-enhanced-expand": "Diskouez ar munudoù",
index 2715118..991dc1e 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
-       "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
-       "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije izmjene",
        "newsectionsummary": "/* $1 */ novi odlomak",
        "rc-enhanced-expand": "Prikaži detalje",
index e06a65f..3eaf1b5 100644 (file)
        "minoreditletter": "m",
        "newpageletter": "B",
        "boteditletter": "b",
-       "rc_categories_any": "Dawa uno",
        "newsectionsummary": "/* $1 */ bagong seksyon",
        "rc-enhanced-expand": "Ipabayad a mga detalye",
        "filename": "Filename",
index 5657fb2..13918d8 100644 (file)
        "botpasswords-insert-failed": "No s'ha pogut afegir el nom del bot «$1». Ja hi estava afegit?",
        "botpasswords-update-failed": "No s'ha pogut actualitzar el nom del bot «$1». Hi estava suprimit?",
        "botpasswords-created-title": "S'ha creat la contrasenya del bot",
-       "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de l'usuari «$2».",
+       "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de {{GENDER:$2||l'usuari|la usuària}} «$2».",
        "botpasswords-updated-title": "Contrasenya de bot actualitzada",
-       "botpasswords-updated-body": "La contrasenya pel bot «$1» de l'usuari «$2» ha estat actualitzada.",
+       "botpasswords-updated-body": "La contrasenya pel bot «$1» de {{GENDER:$2|l'usuari|la usuària}} «$2» ha estat actualitzada.",
        "botpasswords-deleted-title": "S'ha eliminat la contrasenya del bot",
-       "botpasswords-deleted-body": "La contrasenya del bot \"$1\", pertanyent a l'usuari \"$2\", ha estat eliminada.",
+       "botpasswords-deleted-body": "La contrasenya pel bot «$1» de {{GENDER:$2|l'usuari|la usuària}} «$2» ha estat eliminada.",
        "botpasswords-newpassword": "La nova contrasenya per a iniciar sessió amb <strong>$1</strong> és <strong>$2</strong>. <em>Guardeu-la de cara al futur.</em><br> (Per a bots vells que necessiten que el nom per a iniciar sessió sigui el mateix que el nom d'usuari, també podeu usar <strong>$3</strong> com a nom d'usuari i <strong>$4</strong> com a contrasenya.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider no està disponible.",
        "botpasswords-restriction-failed": "Les restriccions de contrasenyes de bots impedeixen aquest inici de sessió.",
        "recentchangesdays-max": "(màxim $1 {{PLURAL:$1|dia|dies}})",
        "recentchangescount": "Nombre d'edicions a mostrar per defecte:",
        "prefs-help-recentchangescount": "Inclou els canvis recents, els historials de pàgines i els registres.",
-       "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\n[[Special:ResetTokens|Cliqueu aquí si voleu restaurar-la]].",
+       "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\nSi és necessari, [[Special:ResetTokens|la podeu restaurar]].",
        "savedprefs": "S’han desat les vostres preferències.",
        "savedrights": "S'han desat els grups d'usuari de {{GENDER:$1|$1}}.",
        "timezonelegend": "Fus horari:",
        "recentchanges-legend": "Opcions de canvis recents",
        "recentchanges-summary": "Seguiu els canvis més recents del wiki en aquesta pàgina.",
        "recentchanges-noresult": "Cap canvi corresponent a aquests criteris en el període indicat.",
+       "recentchanges-timeout": "Aquesta cerca ha temporitzat. Podeu provar amb paràmetres de cerca diferents.",
+       "recentchanges-network": "A causa d'un error tècnic no s'ha pogut recuperar cap resultat. Intenteu refrescar la pàgina.",
        "recentchanges-feed-description": "Segueix en aquest canal els canvis més recents del wiki.",
        "recentchanges-label-newpage": "Aquesta modificació creà una pàgina",
        "recentchanges-label-minor": "Aquesta és una modificació menor",
        "rcfilters-filter-previousrevision-label": "No la darrera revisió",
        "rcfilters-filter-previousrevision-description": "Tots els canvis que no són «la darrera revisió».",
        "rcfilters-filter-excluded": "Exclòs",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:no</strong> $1",
        "rcfilters-exclude-button-off": "Exclou els seleccionats",
        "rcfilters-exclude-button-on": "Excloent els seleccionats",
        "rcfilters-view-tags": "Canvis etiquetats",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|Un usuari vigila|$1 usuaris vigilen}} aquesta pàgina]",
-       "rc_categories": "Limita a les categories (separades amb «|»):",
-       "rc_categories_any": "Qualsevol de les triades",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} després del canvi",
        "newsectionsummary": "/* $1 */ secció nova",
        "recentchangeslinked-feed": "Canvis relacionats",
        "recentchangeslinked-toolbox": "Canvis relacionats",
        "recentchangeslinked-title": "Canvis relacionats amb «$1»",
-       "recentchangeslinked-summary": "Aquesta llista reflecteix els canvis recents a les pàgines enllaçades des d'una pàgina concreta (o als membres d'una categoria concreta).\nLes pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en <strong>negreta</strong>.",
+       "recentchangeslinked-summary": "Introduïu un nom de pàgina per veure els canvis en les pàgines enllaçades des de o cap a aquesta pàgina (per veure els membres d'una categoria, introduïu Categoria:Nom de la categoria).\nEls canvis en pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en <strong>negreta</strong>.",
        "recentchangeslinked-page": "Nom de la pàgina:",
        "recentchangeslinked-to": "Mostra els canvis de les pàgines enllaçades amb la pàgina donada",
        "recentchanges-page-added-to-category": "[[:$1]] afegida a la categoria",
        "doubleredirects": "Redireccions dobles",
        "doubleredirectstext": "Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.\nCada fila conté enllaços a la primera i la segona redireccions, així com la destinació de la segona redirecció, que generalment és la pàgina de destinació \"real\" a la qual hauria d'apuntar la primera redirecció.\nLes entrades <del>ratllades</del> s'han resolt.",
        "double-redirect-fixed-move": "S'ha reanomenat [[$1]].\nS'ha actualitzat automàticament i ara redirigeix a [[$2]].",
-       "double-redirect-fixed-maintenance": "S'ha arreglat automàticament la redirecció doble de [[$1]] a [[$2]] en un treball de manteniment.",
+       "double-redirect-fixed-maintenance": "Correcció automàtica de la redirecció doble de [[$1]] a [[$2]] en un tasca de manteniment",
        "double-redirect-fixer": "Supressor de dobles redireccions",
        "brokenredirects": "Redireccions rompudes",
        "brokenredirectstext": "Les següents redireccions enllacen a pàgines inexistents:",
        "import-mapping-namespace": "Importa a un espai de noms:",
        "import-mapping-subpage": "Importa com a subpàgines de la pàgina següent:",
        "import-upload-filename": "Nom de fitxer:",
+       "import-upload-username-prefix": "Prefix interwiki:",
        "import-comment": "Comentari:",
        "importtext": "Exporteu el fitxer des del wiki d'origen utilitzant l'[[Special:Export|eina d'exportació]].\nDeseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
        "importstart": "S'estan important pàgines...",
        "version-poweredby-others": "altres",
        "version-poweredby-translators": "Traductors de translatewiki.net",
        "version-credits-summary": "El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]",
-       "version-license-info": "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, sigui de la seva versió 2 o (a elecció vostra) de qualsevol versió posterior. \n\nMediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a  la Llicència Pública General GNU.\n\nAmb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].",
+       "version-license-info": "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, sigui de la seva versió 2 o (a elecció vostra) de qualsevol versió posterior. \n\nMediaWiki es distribueix en l'esperança de ser d'utilitat, però <em>SENSE CAP GARANTIA</em>; ni tan sols la garantia implícita de <strong>COMERCIALITZACIÓ</strong> o <strong>ADEQUACIÓ A UNA FINALITAT DETERMINADA</strong>. Vegeu la Llicència Pública General GNU per a més informació.\n\nAmb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].",
        "version-software": "Programari instal·lat",
        "version-software-product": "Producte",
        "version-software-version": "Versió",
index d5aa840..66aa5b2 100644 (file)
        "faq": "СиХХ",
        "actions": "Дийраш",
        "namespaces": "ЦӀерийн меттигаш",
-       "variants": "Ð\9aепаÑ\80аш",
+       "variants": "Ð\92аÑ\80ианÑ\82аш",
        "navigation-heading": "Навигацин меню",
        "errorpagetitle": "ГӀалат",
        "returnto": "ЮхагӀо оцу агӀоне $1.",
        "newpageletter": "К",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|тӀехьожу декъашхо|тӀехьожу декъашхой}}]",
-       "rc_categories": "Категори чура бен (къасторг «|»)",
-       "rc_categories_any": "Муьлха а хаьржиначух",
        "rc-change-size-new": "Хийцам бин чул тӀехьа болу барам: $1 {{PLURAL:$1|байт}}",
        "newsectionsummary": "/* $1 */ Керла хьедар",
        "rc-enhanced-expand": "Гайта мадарра",
        "changecontentmodel-title-label": "АгӀона цӀе",
        "changecontentmodel-reason-label": "Бахьана:",
        "changecontentmodel-submit": "Хийца",
+       "log-name-contentmodel": "Модулийн чулацам хийцаран тептар",
+       "log-description-contentmodel": "ХӀокху агӀонгахь гойтуш ю, чулацаман хийцамаш бина модулаш.",
        "logentry-contentmodel-change-revertlink": "юхаяккха",
        "logentry-contentmodel-change-revert": "Юхаяккха",
        "protectlogpage": "Ларяран тептар",
        "tag-filter": "[[Special:Tags|Билгалонаш]] луьттург:",
        "tag-filter-submit": "Литта",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Билгало|Билгалонаш}}]]: $2)",
+       "tag-mw-contentmodelchange": "модулан чулацаман хийцам",
        "tag-mw-new-redirect": "Керла дӀасахьажорг",
        "tag-mw-removed-redirect": "дӀаяьккхина дӀасхьажорг",
        "tag-mw-rollback": "Юхаяккха",
        "sessionprovider-generic": "$1 сесси",
        "randomrootpage": "Цахууш нисъелла ораман агӀо",
        "log-action-filter-block": "Блоктохаран тайпа:",
+       "log-action-filter-contentmodel": "Модулан чулацаман хийцамбаран тайпа:",
        "log-action-filter-all": "Ерриге",
        "log-action-filter-block-block": "Блоктохар",
        "log-action-filter-block-reblock": "Блоктохар хийцар",
        "log-action-filter-block-unblock": "БлокдӀаяхарш",
+       "log-action-filter-contentmodel-change": "Модулан чулацаман хийцам",
+       "log-action-filter-contentmodel-new": "Чулацаман стандартан йоцуш модулан агӀо кхоллар",
        "log-action-filter-rights-autopromote": "Авто хийцар",
        "log-action-filter-upload-upload": "Керла чудаккхар",
        "log-action-filter-upload-overwrite": "Юху чуяккха",
index f1145ad..21c7ea1 100644 (file)
@@ -8,7 +8,8 @@
                        "MisterWiki",
                        "Shirayuki",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Fanjiayi"
                ]
        },
        "tog-underline": "Na'raya i inachetton:",
        "nstab-template": "Plantiyas",
        "nstab-help": "P\81åhinan ayudo",
        "nstab-category": "Katigoria",
+       "mainpage-nstab": "Fanhaluman",
        "nosuchaction": "Tåya' na aksion taiguenao",
        "nosuchspecialpage": "Tåya' na påhinan espesiat taiguenao",
        "error": "Linachi",
        "titleprotected": "Prinetehi este na titulo ginen fina'tinas-ña as  [[User:$1|$1]].\nHa nå'i i rason <em>$2</em>.",
        "logouttext": "'''Malog-out hao på'go.'''\n\nSiña hao kumontinua manu'usa {{SITENAME}} sin nå'an, pat siña uma'log ta'lo pat siña un usa otra na nå'an muna'sesetbi.\nFanapunta na pålu na påhina siha para u na'annok na ma'log-in hao, asta ki un funas iyo-mu browser cache.",
        "yourname": "Nå'an ni muna'setbi:",
+       "userlogin-yourname": "Nå'an ni muna'setbi",
        "yourpassword": "Password:",
        "yourpasswordagain": "Taip ta'lo i password:",
        "yourdomainname": "Lugat-mu:",
        "accountcreatedtext": "Mafa'tinas i kuentan muna'sesetbi nu $1.",
        "createaccount-title": "Nina'huyong kuenta nu {{SITENAME}}",
        "loginlanguagelabel": "Lengguahe: $1",
+       "pt-login": "Log in",
+       "pt-login-button": "Log in",
+       "pt-createaccount": "Fa'tinas kuenta-hu",
+       "pt-userlogout": "Log out",
        "changepassword": "Tulaika password",
        "oldpassword": "Password bihu:",
        "newpassword": "Password nuebu:",
        "search-external": "Inaligao sanhiyong",
        "searchdisabled": "Mana'påra i inaligao {{SITENAME}}.\nSiña hao manaligao gi Google gi entretanto.\nFanapunta na fana'an ti gus nuebu i listan-ñiha i guinahan {{SITENAME}}.",
        "preferences": "I ga'ña-mu",
-       "mypreferences": "I ga'ña-hu",
+       "mypreferences": "I ga'ña-mu",
        "prefs-edits": "Numirun tinilaika:",
        "prefs-skin": "Låssas",
        "skin-preview": "Na'annok",
        "grouppage-sysop": "{{ns:project}}:Atministradot siha",
        "rightslog": "I log ni direchun muna'sesetbi",
        "nchanges": "$1 {{PLURAL:$1|na tinilaika|na tinilaika siha}}",
+       "enhancedrc-history": "historia",
        "recentchanges": "Tinilaika siha gi halacha",
        "rcnotefrom": "Gi papa' guåha i tinilaika siha ginen '''$2''' (fa'na'an '''$1''' ma'annok).",
        "rclistfrom": "Na'annok i mannuebun tinilaika siha ginen $3 $2",
        "rcshowhideminor": "$1 na mandikike' na tinilaika siha",
+       "rcshowhideminor-show": "Na'annok",
+       "rcshowhideminor-hide": "Nå'na'",
        "rcshowhidebots": "$1 na bots siha",
+       "rcshowhidebots-show": "Na'annok",
+       "rcshowhidebots-hide": "Nå'na'",
        "rcshowhideliu": "$1 na muna'sesetbi ni ma log in",
+       "rcshowhideliu-show": "Na'annok",
+       "rcshowhideliu-hide": "Nå'na'",
        "rcshowhideanons": "$1 i muna'sesetbi taina'an",
+       "rcshowhideanons-show": "Na'annok",
+       "rcshowhideanons-hide": "Nå'na'",
        "rcshowhidemine": "$1 na tinilaika-hu",
+       "rcshowhidemine-show": "Na'annok",
+       "rcshowhidemine-hide": "Nå'na'",
        "rclinks": "Na'annok na $1 tinilaika siha ginen $2 na dihas manmaloffan",
        "diff": "dif",
        "hist": "hist",
        "upload": "Na'kåtga hulu' i atkibu",
        "uploadbtn": "Na'kåtga hulu' atkibu",
        "uploadlogpage": "Na'kåtga i log",
+       "filedesc": "Sumaria",
+       "imgfile": "atkibu",
        "listfiles": "Listan atkibu",
        "file-anchor-link": "Atkibu",
        "filehist": "Historian atkibu",
        "filehist-help": "Yemme' i fecha/ora para un li'e' i atkibu annai annok guihi na momentu.",
+       "filehist-revert": "tulaika tatte",
        "filehist-current": "pa'go",
        "filehist-datetime": "Fecha/Ora",
        "filehist-user": "Muna'sesetbi",
        "move": "Kånya",
        "movethispage": "Kånya i påhina",
        "booksources": "I source i lepblo",
+       "booksources-search": "Aligao",
        "specialloguserlabel": "Muna'sesetbi:",
        "speciallogtitlelabel": "Titulo:",
        "log": "Logs",
        "linksearch-ok": "Aligao",
        "emailuser": "Na'e-mail i muna'sesetbi este",
        "watchlist": "Listan pinilan-hu",
-       "mywatchlist": "Listan pinilan-hu",
+       "mywatchlist": "Listan pinilan",
        "addedwatchtext": "Mana'suha i påhina \"[[:$1]]\" para iyo-mu [[Special:Watchlist|Listan pinilan]].\nI tinilaika siha mo'na gi tiempo kontodu i påhinan kombetsasion siha para u fana'lista guihi, yan para u '''na'potpot''' i påhina gi halom [[Special:RecentChanges|i listan tinilaika gi halacha]] para un ayek ha' mas libianu.",
        "removedwatchtext": "Mana'suha i påhinan \"[[:$1]]\" gi [[Special:Watchlist|listan pinilan-mu]].",
        "watch": "Pulan",
        "blanknamespace": "(Fanhaluman)",
        "contributions": "Kontribusion siha ni muna'sesetbi",
        "mycontris": "Kontribusion-hu",
-       "contribsub2": "Para $1 ($2)",
+       "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "uctop": "(sanhilo')",
        "month": "Ginen i mes (yan eståba):",
        "year": "Ginen i sakkan (yan eståba):",
        "sp-contributions-submit": "Aligao",
        "whatlinkshere": "Håfa ha na'chetton guini",
        "whatlinkshere-title": "I påhina siha ni mana'chetton yan \"$1\"",
+       "whatlinkshere-page": "Påhina:",
        "linkshere": "Umachetton i sigienten påhina siha yan '''[[:$1]]''':",
        "nolinkshere": "Taya' umachetton yan '''[[:$1]]'''.",
        "isredirect": "dirihi i påhina",
        "tooltip-pt-login": "Maolek-ña mohon yanggen humålom hao kuenta-mu, lao ti nesisariu ha'.",
        "tooltip-pt-logout": "Log out",
        "tooltip-ca-talk": "Diskuti i infotmasion i påhina",
-       "tooltip-ca-edit": "Siña un tulaika este na påhina. Pot fabot usa i batunes ni manchek åntes di un satba.",
+       "tooltip-ca-edit": "Tulaika i påhina",
        "tooltip-ca-addsection": "Nå'ye komentu gi kometsasion.",
        "tooltip-ca-viewsource": "Maprotehi i påhina. Siña un li'e' iyo-ña code.",
        "tooltip-ca-history": "I uttimo siha na tinilaika para este na påhina",
        "tooltip-diff": "Na'annok håfa i tinilaika-mu gi tinige'",
        "tooltip-compareselectedversions": "Na'annok i diferensia siha gi i dos ma'ayek na tinilaika ni påhina.",
        "tooltip-watch": "Po'lo i påhina gi listan pinilan-mu",
+       "pageinfo-article-id": "Påhina ID",
        "previousdiff": "← I må'pos na dif",
        "nextdiff": "Mamaila' na dif →",
        "file-info-size": "$1 × $2 na pixel, mineddong atkibu: $3, MIME klåsi: $4",
        "watchlisttools-raw": "Tulaika i listan pinilan ti mana'finu",
        "version": "Tinilaika",
        "version-specialpages": "Manespesiat na påhina",
+       "redirect-submit": "Hånao",
+       "redirect-page": "Påhina ID",
        "fileduplicatesearch-submit": "Aligao",
-       "specialpages": "Manespesiat na påhina"
+       "specialpages": "Manespesiat na påhina",
+       "searchsuggest-search": "Aligao gi {{SITENAME}}"
 }
index f6da1db..76d1f58 100644 (file)
        "newpageletter": "ن",
        "boteditletter": "بۆت",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|بەکارھێنەر}}ی چاودێر]",
-       "rc_categories": "بەرتەسککردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)",
-       "rc_categories_any": "هەرکامێک بێت",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری",
        "newsectionsummary": "/* $1 */ بەشی نوێ",
        "rc-enhanced-expand": "وردەکارییەکان نیشان بدە",
        "autosumm-replace": "«$1»ی لە جێی ناوەرۆک دانا",
        "autoredircomment": "ڕەوانە کرا بۆ [[$1]]",
        "autosumm-removed-redirect": "ڕەوانەکەرەکەی بۆ [[$1]] داندرا بوو لابرد",
+       "autosumm-changed-redirect-target": "ئامانجی ڕەوانەکەری لە [[$1]]ەوە گۆڕی بۆ [[$2]]",
        "autosumm-new": "پەڕەی دروست کرد بە «$1»ەوە",
        "autosumm-newblank": "پەڕەی واڵای دروست کرد",
        "size-bytes": "$1 بایت",
index 771d745..3eaeffe 100644 (file)
        "perfcached": "Ашагъыдаки малюмат кэштен алынды ве эскирген ола билир! Кэште энъ чокъ {{PLURAL:$1|1=бир нетидже|$1 нетидже}} сакъланып тура.",
        "perfcachedts": "Ашагъыдаки малюмат кэштен алынды, кэшнинъ сонъки янъартылгъан вакъты: $1. Кэште энъ чокъ {{PLURAL:$1|1=бир нетидже|$1 нетидже}} сакъланып тура.",
        "querypage-no-updates": "Бу саифени денъиштирмеге шимди изин ёкъ. Бу малюмат аман янъартылмайджакъ.",
-       "viewsource": "Ð\9cенба Ðºодуны косьтер",
+       "viewsource": "Ð\9aодуны косьтер",
        "viewsource-title": "«$1» саифесининъ менба коду",
        "actionthrottled": "Арекет токъталды",
        "actionthrottledtext": "Спамгъа къаршы куреш себебинден бу арекетни аз вакъыт ичинде чокъ кере текрарлап оламайсынъыз. Мумкюн олгъан къарардан зияде арекет яптынъыз. Бир къач дакъкъадан сонъ текрарлап бакъынъыз.",
        "newpageletter": "Я",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|1=къулланыджы|къулланыджы}} козете]",
-       "rc_categories": "Тек категориялардан («|» иле айырыла)",
-       "rc_categories_any": "Эр анги",
        "rc-change-size-new": "Денъиштирильген сонъ $1 {{PLURAL:$1|байт|байт}}",
        "newsectionsummary": "/* $1 */ янъы болюк",
        "rc-enhanced-expand": "Тафсилятыны косьтер",
index a46ff8b..13d8a41 100644 (file)
        "perfcached": "Aşağıdaki malümat keşten alındı ve eskirgen ola bilir! Keşte eñ çoq {{PLURAL:$1|bir netice|$1 netice}} saqlanıp tura.",
        "perfcachedts": "Aşağıdaki malümat keşten alındı, keşniñ soñki yañartılğan vaqtı: $1. Keşte eñ çoq {{PLURAL:$1|bir netice|$1 netice}} saqlanıp tura.",
        "querypage-no-updates": "Bu saifeni deñiştirmege şimdi izin yoq. Bu malümat aman yañartılmaycaq.",
-       "viewsource": "Menba kodunı köster",
+       "viewsource": "Kodunı köster",
        "viewsource-title": "“$1” saifesiniñ menba kodu",
        "actionthrottled": "Areket toqtaldı",
        "actionthrottledtext": "Spamğa qarşı küreş sebebinden bu areketni az vaqıt içinde çoq kere tekrarlap olamaysıñız. Mümkün olğan qarardan ziyade areket yaptıñız. Bir qaç daqqadan soñ tekrarlap baqıñız.",
        "newpageletter": "Y",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|qullanıcı|qullanıcı}} közete]",
-       "rc_categories": "Tek kategoriyalardan (\"|\" ile ayırıla)",
-       "rc_categories_any": "Er angi",
        "rc-change-size-new": "Deñiştirilgen soñ $1 {{PLURAL:$1|bayt|bayt}}",
        "newsectionsummary": "/* $1 */ yañı bölük",
        "rc-enhanced-expand": "Tafsilâtını köster",
index fb53616..55083ff 100644 (file)
        "postedit-confirmation-created": "Stránka byla založena.",
        "postedit-confirmation-restored": "Stránka byla obnovena.",
        "postedit-confirmation-saved": "Vaše změny byly uloženy.",
-       "postedit-confirmation-published": "Vaše editace byla uložena.",
+       "postedit-confirmation-published": "Vaše editace byla zveřejněna.",
        "edit-already-exists": "Nepodařilo se vytvořit novou stránku, protože již existuje.",
        "defaultmessagetext": "Výchozí text hlášení",
        "content-failed-to-parse": "Nepodařilo se zpracovat data $2 do modelu $1: $3",
        "revdelete-reasonotherlist": "Jiný důvod",
        "revdelete-edit-reasonlist": "Editovat důvody smazání",
        "revdelete-offender": "Autor revize:",
-       "suppressionlog": "Záznam utajení",
+       "suppressionlog": "Kniha utajení",
        "suppressionlogtext": "Toto je seznam mazání a blokování zahrnující skrytí obsahu i před správci.\nVizte též [[Special:BlockList|seznam všech probíhajících bloků]].",
        "mergehistory": "Slučování historií stránek",
        "mergehistory-header": "Tato stránka Vám umožní sloučit historii verzí jedné zdrojové stránky s novější stránkou.\nUjistěte se, že tato změna udrží souvislost a posloupnost verzí v historii.",
        "newpageletter": "N",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|sledující uživatel|sledující uživatelé|sledujících uživatelů}}]",
-       "rc_categories": "Omezit na kategorie (oddělené „|“):",
-       "rc_categories_any": "Jakákoli z vybraných",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtů}} po změně",
        "newsectionsummary": "Nová sekce /* $1 */",
        "rc-enhanced-expand": "Zobrazit detaily",
        "lockmanager-fail-closelock": "Soubor se zámkem pro „$1“ nelze zavřít.",
        "lockmanager-fail-deletelock": "Soubor se zámkem pro „$1“ nelze smazat.",
        "lockmanager-fail-acquirelock": "Zámek pro „$1“ nelze získat.",
-       "lockmanager-fail-openlock": "Soubor se zámkem „$1“ nelze otevřít. Ujistěte se, že vámi nahraný adresář je správně nakonfigurován a že váš webový server má povolení k editaci tohoto adresáře. Pro další informace vizte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory.",
+       "lockmanager-fail-openlock": "Soubor zámku „$1“ nelze otevřít. Ujistěte se, že váš adresář nahraných souborů je správně nakonfigurován a že váš webový server má povolení k zápisu do tohoto adresáře. Pro další informace vizte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory.",
        "lockmanager-fail-releaselock": "Zámek pro „$1“ nelze uvolnit.",
        "lockmanager-fail-db-bucket": "Nelze navázat spojení s dostatečným počtem databází zámků v bloku $1.",
        "lockmanager-fail-db-release": "Uzamčení databáze $1 nelze uvolnit.",
        "rollback-success": "Editace {{GENDER:$3|uživatele|uživatelky}} $1 byly vráceny na poslední verzi od {{GENDER:$4|uživatele|uživatelky}} $2.",
        "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
        "sessionfailure-title": "Chyba relace",
-       "sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
+       "sessionfailure": "Nastal problém s vaším přihlášením;\nvámi požadovaná činnost byla zrušena jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
        "changecontentmodel": "Změnit model obsahu stránky",
        "changecontentmodel-legend": "Změnit model obsahu",
        "changecontentmodel-title-label": "Název stránky",
        "thumbnail_dest_directory": "Nelze vytvořit cílový adresář",
        "thumbnail_image-type": "Nepodporovaný typ obrázku",
        "thumbnail_gd-library": "Neúplná konfigurace knihovny GD: chybí funkce $1",
+       "thumbnail_image-size-zero": "Velikost souboru je zřejmě nulová.",
        "thumbnail_image-missing": "Soubor patrně chybí: $1",
        "thumbnail_image-failure-limit": "V poslední době došlo k příliš mnoha neúspěšným pokusům (nejméně $1) o vytvoření tohoto náhledu. Zkuste to později.",
        "import": "Import stránek",
        "watchlistedit-clear-titles": "Názvy:",
        "watchlistedit-clear-submit": "Vyprázdnit seznam sledovaných stránek (natrvalo!)",
        "watchlistedit-clear-done": "Váš seznam sledovaných stránek byl vyprázdněn.",
+       "watchlistedit-clear-jobqueue": "Váš seznam sledovaných stránek bude vymazán. Může to zabrat nějaký čas.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Byl odstraněn jeden název|Byly odstraněny $1 názvy|Bylo odstraněno $1 názvů}}:",
        "watchlistedit-too-many": "Seznam obsahuje příliš mnoho stránek, než aby se zde daly zobrazit.",
        "watchlisttools-clear": "Vyprázdnit seznam sledovaných stránek",
index 400c353..38984f9 100644 (file)
        "hidden-category-category": "Zataconé kategòrëje",
        "category-subcat-count": "{{PLURAL:$2|Na kategòrrjô zamëkô w se blós nôslédną pòdkategòrëjã.|Na kategòrëjô mô {{PLURAL:$1|pòdkategòrëje|$1 pòdkategòrëjôw}}, w $2 kategòrëjach.}}",
        "category-subcat-count-limited": "Na kategòrëjô zamëkô w se {{PLURAL:$1|1 pòdkategòrëjã|$1 pòdkategòrëje|$1 pòdkategòrëjów}}.",
-       "category-article-count": "{{PLURAL:$2|Na kategòrëjô zamëkôw w se blós jedną starnã.|Niżi mómë $1 westrzód $2 starów w ti kategòrëji.}}",
+       "category-article-count": "{{PLURAL:$2|Na kategòrëjô zamëkô w se blós jedną starnã.|Niżi mómë $1 westrzód $2 starnów w ti kategòrëji.}}",
        "category-article-count-limited": "W ti kategòrëji {{PLURAL:$1|je 1 starna|są $1 starnë|je $1 starnów}}.",
        "category-file-count": "{{PLURAL:$2|Na kategòrëjô zamëkô w se blós jeden lopk.|W ti kategòrëji {{PLURAL:$1|je 1 lopk|są $1 lopczi|je $1 lopków}} z oòglowi wielënë $2 lopków.}}",
        "category-file-count-limited": "W ti kategòrëji {{PLURAL:$1|je 1 lopk|są $1 lopczi|je $1 lopków}}.",
        "rcfilters-savedqueries-defaultlabel": "Zapisóné filtrë",
        "rcfilters-savedqueries-add-new-title": "Zapiszë aktualné ùstôwë filtrów.",
        "rcfilters-clear-all-filters": "Wëczëszczë filtrë",
+       "rcfilters-show-new-changes": "Òbôcz nowszé zjinaczi",
        "rcfilters-search-placeholder": "Fitruj nowé zjinaczi (ùżij do te menu abò wëszukôj pòdle pòzwë filtra)",
        "rcfilters-filterlist-title": "Filtrë",
        "rcfilters-filterlist-feedbacklink": "Napiszë, jak cë sã widzą te nowé nôrzãdza filtrowaniô.",
        "specialpages": "Specjalné starnë",
        "tag-filter": "Filtr [[Special:Tags|znakòwników]]:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Znakòwnik|Znakòwniczi}}]]: $2)",
+       "tag-mw-changed-redirect-target": "Pòzmiana célu przeczerowaniô",
        "tag-mw-blank": "Rëmniãcé całi zamkłoscë starnë",
        "tag-mw-rollback": "Copniãcé zjinaków",
        "tags-title": "Znakòwniczi",
index 8a10d62..6d27e3e 100644 (file)
        "minoreditletter": "м҃л",
        "newpageletter": "н҃в",
        "boteditletter": "а҃ѵ",
-       "rc_categories_any": "Любы из выбраных",
        "rc-change-size-new": "$1 {{PLURAL:$1|баитъ|баита|баитъ}} послѣди мѣнꙑ",
        "rc-old-title": "напрьва страница створѥна ꙗко ⁖ $1 ⁖",
        "recentchangeslinked": "съвѧꙁанꙑ страницѧ",
index cac833e..946c6c9 100644 (file)
        "faq": "ЫйХу",
        "namespaces": "Ят хушшисем",
        "variants": "Вариантсем",
+       "navigation-heading": "Навигаци",
        "errorpagetitle": "Йăнăш",
        "returnto": "$1 таврăн.",
        "tagline": "{{SITENAME}}",
        "otherlanguages": "Урăх чĕлхесем",
        "redirectedfrom": "($1 çинчен куçарнă)",
        "redirectpagesub": "Куçаракан страница",
-       "lastmodifiedat": "Ку страницăна юлашки улăштарнă вăхăт: $2, $1.",
+       "lastmodifiedat": "Ку страницăна .юлашки хут хӑҫан улӑштарни: $1 $2.",
        "viewcount": "Ку страницăна $1 хут пăхнă.",
        "protectedpage": "Хӳтĕленĕ статья",
        "jumpto": "Куçас:",
        "nstab-template": "Шаблон",
        "nstab-help": "Пулăшу",
        "nstab-category": "Категори",
+       "mainpage-nstab": "Тӗпел",
        "nosuchaction": "Ку ĕçе тăваймастпăр",
        "nosuchactiontext": "URLта çырнă хушăва вики скрипчĕ ăнланмасть",
        "nosuchspecialpage": "Ун пек страница çук",
        "lineno": "$1-мĕш йĕрке:",
        "editundo": "унчченхи",
        "searchresults": "Шыранă результачĕсем",
+       "searchresults-title": "\"$1\" шыраса тупни",
        "textmatches": "Статьясенчи текст пĕрпеклĕхĕ",
        "prevn": "унчченхи {{PLURAL:$1|$1}}",
        "nextn": "урăххисем {{PLURAL:$1|$1}}",
        "prev-page": "унчченхи страницă",
        "next-page": "урăх страницă",
+       "shown-title": "Пӗр элте $1 результат кӑтарт",
        "viewprevnext": "Пăх ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchprofile-articles": "Статьясем",
+       "searchprofile-images": "Мультимедиа",
+       "searchprofile-everything": "Пур ҫӗрте",
+       "searchprofile-advanced": "Анлӑлатнӑ",
        "searchprofile-articles-tooltip": "$1 -ре шырани",
        "searchprofile-images-tooltip": "Файăлсене шырани",
+       "searchprofile-everything-tooltip": "Мӗнпур элсенче (сӳтсе явнинче те) шыра",
+       "searchprofile-advanced-tooltip": "Ятарлӑ ят талккӑшӗсенче шыра",
        "search-result-size": "$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})",
        "search-category": "(категори $1)",
        "search-interwiki-caption": "Тăван проектсем",
        "grouppage-sysop": "{{ns:project}}:Администраторсем",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократсем",
        "grouppage-suppress": "{{ns:project}}:Тĕрĕслекенсем",
+       "newuserlogpage": "Хутшӑнакан регистрациленнин кун-ҫулӗ",
        "rightslogtext": "Ку хутшăнакансен прависене улăштарнисен журналĕ.",
        "enhancedrc-history": "истори",
        "recentchanges": "Улăшăннисем",
        "newpageletter": "Ç",
        "boteditletter": "б",
        "unpatrolledletter": "!",
-       "rc_categories_any": "Кашни",
+       "rc-change-size-new": "Улӑштарнӑ хыҫҫӑн $1 байт пулать",
        "newsectionsummary": "/* $1 */ Çĕнĕ тема",
        "recentchangeslinked": "Çыхăннă улшăнусем",
        "recentchangeslinked-feed": "Çыхăннă улшăнусем",
        "listfiles_description": "Ăнлантаркăч",
        "file-anchor-link": "Файл",
        "filehist": "Файл историйĕ",
+       "filehist-help": "Вӑхӑт ҫине пуссан, ун чухнехи версине пӑхма пулать.",
        "filehist-current": "хальхи",
        "filehist-datetime": "Дата/Вăхăт",
        "filehist-thumb": "Миниатюра",
        "undelete-search-box": "Кăларса пăрахнă страницăсен хушшинчи шырав",
        "undelete-search-submit": "Шыра",
        "namespace": "Ят хушши:",
+       "invert": "Суйланине ҫавӑр",
        "blanknamespace": "(Тĕп)",
        "contributions": "{{GENDER:$1|Усă куракан}} ӳсĕмĕсем",
        "contributions-title": "Усă куракан $1 хушни",
        "tooltip-pt-watchlist": "Эсир пăхакан страницисем",
        "tooltip-pt-mycontris": "Сирĕн хушнисем",
        "tooltip-pt-anoncontribs": "Ку IP адреспа тӳрлетнисем",
+       "tooltip-pt-login": "Кӗме кирлех мар-ха та, ара аванрах.",
        "tooltip-pt-logout": "Сеансне пĕтер",
+       "tooltip-pt-createaccount": "Аккаунт ту та системӑна кӗр. Паллах, унсӑрах та юрать, анчах та аккаунтпа кӗни лайӑхрах.",
        "tooltip-ca-talk": "Статьяна сӳтсе явасси",
-       "tooltip-ca-edit": "Эсир ку страницӑна тӳрлетме пултаратӑр. Тархасшӑн ҫырса хӑваричен страницӑ мӗнле пулассине пӑхӑр.",
+       "tooltip-ca-edit": "Эле тӳрлет",
        "tooltip-ca-addsection": "Çĕнĕ пай ту",
        "tooltip-ca-viewsource": "Ку страницӑна эсир улӑштарма пултараймастӑр. Ӑна мӗнле ҫырнине кӑна пӑхма пултаратӑр.",
+       "tooltip-ca-history": "Эле улӑштарнин кун-ҫулӗ",
        "tooltip-ca-protect": "Улӑшратусенчен сыхласси",
        "tooltip-ca-delete": "Страницӑна кӑларса пӑрахмалли",
        "tooltip-ca-move": "Страницӑна урӑх ҫӗре куҫарасси",
        "tooltip-ca-watch": "Ку страницӑ хыҫҫӑн сӑнама пуҫласси",
        "tooltip-ca-unwatch": "Ку страницӑ хыҫҫӑн урӑх сӑнамалла мар",
        "tooltip-search": "Шырав {{SITENAME}}",
+       "tooltip-search-go": "Пур пулсан ҫак ятлӑ страницӑна куҫ",
+       "tooltip-search-fulltext": "Ҫак текстлӑ страницисене туп",
        "tooltip-p-logo": "Тӗп страницӑ",
+       "tooltip-n-mainpage": "Тӗпеле куҫ",
+       "tooltip-n-mainpage-description": "Тӗпеле куҫ",
+       "tooltip-n-portal": "Проект ҫинченне, мӗн тума пултарнине, япаласем ӑҫтине пӗл",
+       "tooltip-n-currentevents": "Хальхи пулӑмсем ҫинчен",
+       "tooltip-n-recentchanges": "Юлашки улӑштарнин йышӗ",
+       "tooltip-n-randompage": "Ӑнсӑртран суйланӑ страница кӑтарт",
+       "tooltip-n-help": "Ыйтса пӗлмелли вырӑн",
+       "tooltip-t-whatlinkshere": "Кунта каҫакан пур страницӑн ят-йышӗ",
        "tooltip-feed-atom": "Ку страницăн Atom куçару",
        "tooltip-t-upload": "Файлсем хушмалли",
+       "tooltip-t-specialpages": "Ятарлӑ страницӑсен пӗтӗм ят-йышӗ",
+       "tooltip-t-print": "Ҫак страницӑн пичет версийӗ",
+       "tooltip-t-permalink": "Элӗн ҫак версийӗн улӑштарман каҫҫи",
+       "tooltip-ca-nstab-main": "Статьяна пăх",
+       "tooltip-ca-nstab-special": "Ку ятарлӑ эл, ӑна тӳрлетме май ҫук",
        "tooltip-ca-nstab-image": "Файлăн страници",
        "tooltip-ca-nstab-template": "Шаблонăн страници",
        "tooltip-ca-nstab-category": "Категорин страницине пăхни",
        "tooltip-save": "Тӳрлетӳсене астуса хăвармалла",
        "tooltip-watch": "Çак страницăна пăхса тăмаллисем шутне хуш",
+       "tooltip-rollback": "Пӗрре пуссан, юлашки тӳрлетекенӗн улӑштарнине катерт",
        "tooltip-summary": "Кĕскĕн ăнлантарса парăр",
        "anonymous": "Паллă мар {{PLURAL:$1|хутшăнакан|хутшăнакансем}} {{SITENAME}}",
        "siteuser": "{{SITENAME}} усă куракан $1",
        "file-info": "файл пысăкăшĕ: $1, MIME-тĕсĕ: $2",
        "file-info-size": "$1 × $2 пиксел, файл пысăкăше: $3, MIME-тĕсĕ: $4",
        "file-nohires": "Пысăкрах калăпăшли çук.",
+       "show-big-image-size": "$1 × $2 пиксел",
        "newimages": "Çĕнĕ файлсен галерейи",
        "newimages-summary": "Ку ятарлă страницăра эсир нумай пулмасть кĕртнĕ файлсене куратăр",
        "noimages": "Ӳкерчĕксем çук.",
        "specialpages-group-media": "Медиа-материалсемпе тултарăшсем",
        "specialpages-group-users": "Хутшăнакансем тата правасем",
        "specialpages-group-highuse": "Нумай усă куракан страницăсем",
+       "tag-list-wrapper": "([[Special:Tags|$1 метка]]: $2)",
        "compare-submit": "Танлаштар",
        "htmlform-selectorother-other": "Урăххи",
        "htmlform-no": "Çук",
        "logentry-newusers-create": "Хутшăнакан $1 аккаунтне {{GENDER:$2|турĕ}}",
        "rightsnone": "(çук)",
        "feedback-back": "Каялла",
-       "searchsuggest-search": "Шырамалли",
+       "searchsuggest-search": "{{SITENAME}} сайтӗнче шыра",
        "pagelang-select-lang": "Чĕлхе суйлăр",
        "mediastatistics-header-audio": "Аудио",
        "mediastatistics-header-video": "Видеосем",
index 1a1e6a2..10b4025 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|defnyddwyr|defnyddiwr|ddefnyddiwr|defnyddiwr|defnyddiwr|o ddefnyddwyr}} yn gwylio]",
-       "rc_categories": "Cyfyngu i gategorïau (gwahanwch gyda \"|\")",
-       "rc_categories_any": "Unrhyw un",
        "rc-change-size-new": "$1 {{PLURAL:$1|beit}} wedi'r newid",
        "newsectionsummary": "/* $1 */ adran newydd",
        "rc-enhanced-expand": "Dangos y manylion",
index 9e4e93f..e065bb9 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|overvågende bruger|overvågende brugere}}]",
-       "rc_categories": "Grænse for kategorier (adskilt med \"|\"):",
-       "rc_categories_any": "Nogen af de valgte",
        "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter ændring",
        "newsectionsummary": "/* $1 */ nyt afsnit",
index 8a26c7d..642130b 100644 (file)
        "right-editmyprivateinfo": "Eigene private Daten bearbeiten (beispielsweise E-Mail-Adresse, richtiger Name)",
        "right-override-export-depth": "Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5",
        "recentchanges-label-plusminus": "Die Änderung der Seitengrösse in Bytes",
-       "rc_categories": "Nur Seiten aus den Kategorien (getrennt mit «|»):",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung",
        "rc-old-title": "ursprünglich erstellt als «$1»",
        "recentchangeslinked-title": "Änderungen an Seiten, die von «$1» verlinkt sind",
index 3a018c8..b343b68 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Benutzer]",
-       "rc_categories": "Nur Seiten aus den Kategorien (getrennt mit „|“):",
-       "rc_categories_any": "Beliebige der ausgewählten",
        "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung",
        "newsectionsummary": "Neuer Abschnitt /* $1 */",
        "rollback-success": "Die Änderungen von {{GENDER:$3|$1}} wurden rückgängig gemacht und die letzte Version von {{GENDER:$4|$2}} wurde wiederhergestellt.",
        "rollback-success-notify": "Bearbeitungen von $1 rückgängig gemacht;\nzurückgeändert auf die letzte Version von $2. [$3 Änderungen zeigen]",
        "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 gehe zurück zur vorherigen Seite, lade sie erneut und versuche, den Vorgang erneut auszuführen.",
+       "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",
        "thumbnail_dest_directory": "Zielverzeichnis kann nicht erstellt werden.",
        "thumbnail_image-type": "Bildtyp nicht unterstützt",
        "thumbnail_gd-library": "Unvollständige Konfiguration der GD-Bibliothek: Fehlende Funktion $1",
+       "thumbnail_image-size-zero": "Die Dateigröße des Bildes scheint null zu sein.",
        "thumbnail_image-missing": "Datei scheint fehlend zu sein: $1",
        "thumbnail_image-failure-limit": "Es wurden in letzter Zeit zu viele Versuche ($1 oder mehr) unternommen, dieses Vorschaubild zu rendern. Bitte versuche es später erneut.",
        "import": "Seiten importieren",
        "watchlistedit-clear-titles": "Seitennamen:",
        "watchlistedit-clear-submit": "Beobachtungsliste unwiderruflich leeren",
        "watchlistedit-clear-done": "Deine Beobachtungsliste wurde geleert.",
+       "watchlistedit-clear-jobqueue": "Deine Beobachtungsliste wird geleert. Dies kann einige Zeit in Anspruch nehmen!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Ein Seitenname wurde|$1 Seitennamen wurden}} entfernt:",
        "watchlistedit-too-many": "Es gibt hier zu viele Seiten zum Anzeigen.",
        "watchlisttools-clear": "Beobachtungsliste leeren",
index af8a580..de56748 100644 (file)
        "templatepage": "Pera şabloni bımotné",
        "viewhelppage": "Pera peşti bıvin",
        "categorypage": "Pera kategori bımotné",
-       "viewtalkpage": "Vaten bıvin",
+       "viewtalkpage": "Werênayışi bıvêne",
        "otherlanguages": "Zıwananê binan de",
        "redirectedfrom": "($1 ra kırışı yê)",
        "redirectpagesub": "Perra kırıştışi",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 ho seyr keno {{PLURAL:$1|karber|karberî}}]",
-       "rc_categories": "Kategoriyan rêz kı ( \"|“ ya ciya yo):",
-       "rc_categories_any": "Weçinayiyan ra her yew",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|bayt|bayti}} ra dıma vurnayış",
        "newsectionsummary": "/* $1 */ qısımo newe",
        "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ê karberan",
        "sp-contributions-blocked-notice": "verniyê no/na karber/e geriyayo/a\nqê referansi qeydê vernigrewtışi cêr de eşkera biyo:",
        "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "exportcuronly": "têna revizyonê peyin bıger",
        "exportnohistory": "----\n'''Not:''' pê no form teberdayişê verê (tarix) pelan battal biyo",
        "exportlistauthors": "zerre de qandê her pela listey iştiraxkara esto",
-       "export-submit": "Teber de",
+       "export-submit": "Teberdayış",
        "export-addcattext": "Kategoriye ra pelan têare ke",
        "export-addcat": "Têare ke",
        "export-addnstext": "pelan cayê nameyan ra têare ker",
        "import-interwiki-sourcepage": "Perra çımey:",
        "import-interwiki-history": "Qeydanê pele pêrune kopya ke",
        "import-interwiki-templates": "Şablonan pêro zerre ke",
-       "import-interwiki-submit": "Zerre ke",
+       "import-interwiki-submit": "Zerredayış",
        "import-mapping-default": "Hesıbyaye lokasyonan miyan ke",
        "import-mapping-namespace": "Dek yu canamey miyan",
        "import-mapping-subpage": "Bınnpeley ena peler deyne azere ke",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
        "tooltip-pt-logout": "Bıveciye",
        "tooltip-pt-createaccount": "Şıma rê tewsiyey ma xorê jew hesab akerê. Fına zi hesab akerdış mecburi niyo.",
-       "tooltip-ca-talk": "Heqa zerreki vaten",
+       "tooltip-ca-talk": "Heqa zerreki de werênayış",
        "tooltip-ca-edit": "Ena pele bıvurne",
        "tooltip-ca-addsection": "Bınleteyo newe akerê",
        "tooltip-ca-viewsource": "Ena pele kılit biya.\nŞıma şenê çımeyê aye bıvênê",
index 53f742a..2919aed 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|wobglědowaŕ|wobglědowarja|wobglědowarje}}]",
-       "rc_categories": "Jano boki z kategorijow (źělone z pomocu „|“):",
-       "rc_categories_any": "wše",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byta|byty|bytow}} pó změnje",
        "newsectionsummary": "Nowy wótrězk /* $1 */",
        "rc-enhanced-expand": "Drobnostki pokazaś",
index dc25eb0..5d5449a 100644 (file)
        "minoreditletter": "ना",
        "newpageletter": "नौ",
        "boteditletter": "बो",
-       "rc_categories": "श्रेणीहरूमी सीमित (\"|\" ले छुट्याओ)",
        "rc-change-size-new": "$1 {{PLURAL:$1|बाइट|बाइट्स}}फेरबदल पाछा",
        "recentchangeslinked": "सम्बन्धित फेरबदल",
        "recentchangeslinked-toolbox": "सम्बन्धित फेरबदल",
index 52595ad..4d97f4b 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[vésta da {{PLURAL:$1|un utèint|$1 utèint}}]",
-       "rc_categories": "Lémita al categoréi (separêdi da \"|\")",
-       "rc_categories_any": "Bast' ech sia fra còli sgnêdi",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} dôp la mudéfica",
        "newsectionsummary": "/* $1 */ sesiòn nōva",
        "rc-enhanced-expand": "Fà vèder i particulêr.",
index 7d9c891..5040de9 100644 (file)
        "default": "προεπιλογή",
        "prefs-files": "Αρχεία",
        "prefs-custom-css": "Προκαθορισμένη CSS",
-       "prefs-custom-js": "Προκαθορισμένη JS",
+       "prefs-custom-js": "Προσαρμοσμένη JavaScript",
        "prefs-common-css-js": "Κοινά CSS/JavaScript για όλα τα θέματα εμφάνισης:",
        "prefs-reset-intro": "Μπορείτε να χρησιμοποιήσετε αυτήν την σελίδα για να επαναρρυθμίσετε τις προτιμήσεις σας στις προεπιλογές του ιστότοπου. Αυτό δεν μπορεί να αναστρεφθεί.",
        "prefs-emailconfirm-label": "Επιβεβαίωση διεύθυνσης ηλεκτρονικού ταχυδρομείου:",
        "prefs-editor": "Συντάκτης",
        "prefs-preview": "Προεπισκόπηση",
        "prefs-advancedrc": "Προηγμένες επιλογές",
-       "prefs-opt-out": "Optar por no los mejoramientos",
+       "prefs-opt-out": "Απόρριψη βελτιώσεων",
        "prefs-advancedrendering": "Προηγμένες επιλογές",
        "prefs-advancedsearchoptions": "Προηγμένες επιλογές",
        "prefs-advancedwatchlist": "Προηγμένες επιλογές",
        "rcfilters-view-namespaces-tooltip": "Φιλτράρισμα αποτελεσμάτων κατά ονοματοχώρο",
        "rcfilters-liveupdates-button": "Ζωντανή ανανέωση",
        "rcfilters-liveupdates-button-title-on": "Απενεργοποίηση ζωντανής ανανέωσης",
+       "rcfilters-preference-label": "Απόκρυψη της βελτιωμένης έκδοσης των Πρόσφατων Αλλαγών",
+       "rcfilters-preference-help": "Αναστέλλει τον επανασχεδιασμό διεπαφής 2017 και όλα τα εργαλεία που προστέθηκαν στη συνέχεια και από τότε.",
        "rcnotefrom": "Παρακάτω {{PLURAL:$5|είναι η αλλαγή|είναι οι αλλαγές}} από <strong>$3, $4</strong> (έως <strong>$1</strong> που εμφανίζεται).",
        "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2",
        "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "newpageletter": "Ν",
        "boteditletter": "ρ",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|χρήστης|χρήστες}} παρακολουθούν]",
-       "rc_categories": "Περιορίστε τις κατηγορίες (διαχωρίστε τις με \"|\"):",
-       "rc_categories_any": "Οποιαδήποτε από τις επιλεγμένες",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} μετά από την αλλαγή",
        "newsectionsummary": "/* $1 */ νέα ενότητα",
        "rc-enhanced-expand": "Εμφάνιση λεπτομερειών",
        "log-title-wildcard": "Αναζήτησε τίτλους που αρχίζουν με αυτό το κείμενο",
        "showhideselectedlogentries": "Αλλαγή ορατότητας των επιλεγμένων καταχωρήσεων στο αρχείο καταγραφής συμβάντων",
        "log-edit-tags": "Επεξεργασία ετικετών των επιλεγμένων καταχωρήσεων του αρχείου καταγραφής",
+       "checkbox-select": "Επιλογή: $1",
        "checkbox-all": "Όλα",
        "checkbox-none": "Κανένα",
        "checkbox-invert": "Αντιστροφή",
        "newimages-user": "Διεύθυνση IP ή όνομα χρήστη",
        "newimages-showbots": "Εμφάνιση αρχείων ανεβασμένων από ρομπότ",
        "newimages-hidepatrolled": "Απόκρυψη ελεγμένων αρχείων.",
+       "newimages-mediatype": "Τύπος μέσου:",
        "noimages": "Δεν υπάρχουν εικόνες.",
        "ilsubmit": "Αναζήτηση",
        "bydate": "ημερομηνίας",
        "linkaccounts": "Σύνδεση λογαριασμών",
        "linkaccounts-success-text": "Ο λογαριασμός συνδέθηκε",
        "linkaccounts-submit": "Σύνδεση λογαριασμών",
+       "userjsispublic": "Σημείωση: Οι υποσελίδες JavaScript δεν πρέπει να περιέχουν εμπιστευτικά δεδομένα καθώς είναι ορατά από άλλους χρήστες.",
+       "usercssispublic": "Σημείωση: Οι υποσελίδες CSS δεν πρέπει να περιέχουν εμπιστευτικά δεδομένα καθώς είναι ορατά από άλλους χρήστες.",
        "revid": "αναθεώρηση $1",
        "pagedata-bad-title": "Μη έγκυρος τίτλος: $1."
 }
index 9d06c96..bcf0ec5 100644 (file)
        "unpatrolledletter": "!",
        "number_of_watching_users_RCview": "[$1]",
        "number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]",
-       "rc_categories": "Limit to categories (separate with \"|\"):",
-       "rc_categories_any": "Any of the chosen",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
        "newsectionsummary": "/* $1 */ new section",
        "thumbnail_dest_directory": "Unable to create destination directory",
        "thumbnail_image-type": "Image type not supported",
        "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1",
+       "thumbnail_image-size-zero": "Image file size seems to be zero.",
        "thumbnail_image-missing": "File seems to be missing: $1",
        "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.",
        "import": "Import pages",
index 31585fa..1ebc823 100644 (file)
        "newpageletter": "N",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|priatentanta uzanto|priatentantaj uzantoj}}]",
-       "rc_categories": "Nur paĝoj el jenaj kategorioj (disigu per \"|\"):",
-       "rc_categories_any": "Iuj el la elektitaj",
        "rc-change-size-new": "$1 {{PLURAL:$1|bitoko|bitokoj}} post ŝanĝo",
        "newsectionsummary": "/* $1 */ nova sekcio",
        "rc-enhanced-expand": "Montri detalojn (per JavaScript)",
        "suppress": "Forigu",
        "querypage-disabled": "Tiu ĉi speciala paĝo estas malfunkciigita pro rendimentaj kialoj.",
        "apihelp": "Helpo pri API",
-       "apihelp-no-such-module": "La modjulo „$1” ne estis trovita.",
+       "apihelp-no-such-module": "La modulo „$1” ne estis trovita.",
        "apisandbox": "API testejo",
        "apisandbox-jsonly": "JavaScript estas postulita por uzi la API provejon.",
        "apisandbox-api-disabled": "API estas malŝalta en ĉi tiu retejo.",
index e62887f..99d0511 100644 (file)
@@ -15,6 +15,7 @@
        "tog-hidepatrolled": "Ocultar ediciones patrulladas de los cambios recientes",
        "tog-newpageshidepatrolled": "Ocultar páginas patrulladas de la lista de páginas nuevas",
        "tog-showtoolbar": "Mostrar barra de edición",
+       "tog-oldsig": "Su firma actual:",
        "tog-ccmeonemails": "Enviarme una copia de los correos electrónicos que yo envíe a otros usuarios",
        "sunday": "domingo",
        "monday": "lunes",
        "views": "Vistas",
        "toolbox": "Herramientas",
        "otherlanguages": "Otros idiomas",
-       "lastmodifiedat": "Esta página fue modificada por última vez el $1, a las $2.",
+       "lastmodifiedat": "Esta página fue editada por última vez el $1, a las $2.",
        "protectedpage": "Página protegida",
        "jumpto": "Saltar a:",
        "jumptonavigation": "navegación",
        "jumptosearch": "buscar",
        "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nDemasiados usuarios están intentando ver esta página.\nPor favor espere unos instantes antes de reintentar acceder nuevamente a esta página.\n\n$1",
+       "generic-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios tratando de ver este recurso.\nPor favor espere un momento antes de intentar acceder de nuevo.",
        "aboutsite": "Acerca de {{SITENAME}}",
        "aboutpage": "Project:Acerca de",
        "currentevents": "Actualidad",
        "ok": "Aceptar",
        "retrievedfrom": "Obtenido de «$1»",
        "youhavenewmessages": "{{PLURAL:$3|Tiene}} $1 ($2).",
-       "youhavenewmessagesmulti": "Tienes mensajes nuevos en $1",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Tiene}} $1 de {{PLURAL:$3|otro usuario|$3 usuarios}} ($2).",
+       "youhavenewmessagesmanyusers": "Tiene $1 de muchos usuarios ($2).",
+       "youhavenewmessagesmulti": "Tiene mensajes nuevos en $1",
        "editsection": "editar",
        "editold": "editar",
        "viewsourceold": "ver código",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
+       "transaction-duration-limit-exceeded": "Con el fin de evitar un aumento excesivo del retardo de replicación, se anuló esta transacción porque la duración de escritura ($1) excedió el límite de $2 {{PLURAL:$2|segundo|segundos}}.\nSi está cambiando muchos elementos a la vez, trate de hacer operaciones similares más pequeñas.",
        "laggedslavemode": "<strong>Aviso:</strong> la página puede no contener las actualizaciones más recientes.",
+       "readonly": "Base de datos bloqueada",
        "enterlockreason": "Proporcione el motivo del bloqueo, así como una estimación de cuándo se producirá el desbloqueo",
-       "readonlytext": "La base de datos se encuentra actualmente bloqueada y no permite la creación de páginas nuevas y otras modificaciones, probablemente de forma temporal debido al mantenimiento rutinario de la base de datos. Después de esas operaciones el sitio se encontrará nuevamente disponible.\n\nLa razón dada por el administrador que bloqueó la base de datos es la que sigue: $1",
+       "readonlytext": "Actualmente la base de datos no permite nuevas entradas u otras modificaciones, probablemente por mantenimiento rutinario, tras lo cual volverá a la normalidad.\n\nLa explicación dada por el administrador que la bloqueó fue: $1",
        "missing-article": "La base de datos no encuentra el texto de una página que debería hallarse, llamada \"$1\" $2.\n\nLa causa de esto suele deberse a un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, usted puede haber encontrado un fallo en el sistema.\n\nPor favor, avise a un [[Special:ListUsers/sysop|administrador]], tomando nota de la URL.",
        "internalerror": "Error interno",
        "internalerror_info": "Error interno: $1",
        "viewsource": "Ver código",
-       "actionthrottledtext": "Como medida de protección contra el ''spam'', la acción que está realizando está limitada a un número determinado de veces en un periodo corto de tiempo. Usted ha excedido ese límite. Por favor pruebe de nuevo en unos minutos.",
-       "viewsourcetext": "Puede ver y copiar el código fuente de esta página:",
-       "editinginterface": "'''Aviso:''' Está usted editando una página usada para proporcionar texto de interfaz para el software. Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios. Para traducciones, por favor considere usar [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], el proyecto de traducción de MediaWiki.",
+       "actionthrottledtext": "Como medida contra los abusos, la acción que está realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y ha excedido ese límite.\nPor favor inténtelo de nuevo en unos minutos.",
+       "viewsourcetext": "Puede ver y copiar el código fuente de esta página.",
+       "viewyourtext": "Puede ver y copiar el código de <strong>sus ediciones</strong> en esta página.",
+       "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, use [https://translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
+       "editinginterface": "<strong>Advertencia:</strong> está editando una página usada para proporcionar texto de la interfaz al software. \nLos cambios en esta página afectarán la apariencia de la interfaz de los demás usuarios de este wiki.",
+       "translateinterface": "Para añadir o cambiar traducciones para todos los wikis, use [https://translatewiki.net/ translatewiki.net], el proyecto de traducción de MediaWiki.",
+       "namespaceprotected": "No tiene permiso para editar las páginas del espacio de nombres <strong>$1</strong>.",
+       "customcssprotected": "No tiene permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
+       "customjsprotected": "No tiene permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.",
+       "mycustomcssprotected": "No tiene permiso para editar esta página CSS.",
+       "mycustomjsprotected": "No tiene permiso para editar esta página JavaScript.",
+       "myprivateinfoprotected": "No tiene permiso para editar su información privada.",
+       "mypreferencesprotected": "No tiene permiso para editar sus preferencias.",
+       "exception-nologin-text": "Por favor inicie sesión para acceder a esta página o llevar a cabo esta acción.",
+       "exception-nologin-text-manual": "Necesita $1 para poder ver esta página o llevar a cabo esta acción.",
+       "logouttext": "<strong>Su sesión ha finalizado.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que actualice la caché de su navegador.",
        "welcomeuser": "Le damos la bienvenida, $1.",
        "welcomecreation-msg": "Se ha creado su cuenta.\nPuede cambiar las [[Special:Preferences|preferencias]] de {{SITENAME}} si lo desea.",
        "yourname": "Nombre de usuario:",
        "yourpasswordagain": "Escriba la contraseña otra vez:",
        "createacct-yourpasswordagain": "Confirme la contraseña",
        "createacct-yourpasswordagain-ph": "Escriba la contraseña otra vez",
+       "yourdomainname": "Su dominio:",
+       "password-change-forbidden": "No puede cambiar las contraseñas en este wiki.",
+       "externaldberror": "Hubo un error de autenticación en la base de datos, o bien no tiene autorización para actualizar su cuenta externa.",
        "login": "Acceder",
+       "login-security": "Verifique su identidad",
        "nav-login-createaccount": "Iniciar sesión / crear cuenta",
        "logout": "Desconectar",
        "userlogout": "Salir",
+       "notloggedin": "No ha accedido",
        "userlogin-noaccount": "¿No tiene una cuenta?",
        "userlogin-joinproject": "Únase a {{SITENAME}}",
        "userlogin-resetpassword-link": "¿Olvidó su contraseña?",
+       "userlogin-loggedin": "Ya está {{GENDER:$1|conectado|conectada}} como $1.\nUse el formulario de abajo para iniciar sesión como otro usuario.",
+       "userlogin-reauth": "Debe iniciar sesión de nuevo para verificar que usted es {{GENDER:$1|$1}}.",
        "createacct-emailrequired": "Dirección de correo electrónico",
        "createacct-emailoptional": "Dirección de correo electrónico (opcional)",
-       "anoneditwarning": "'''Aviso:''' No ha iniciado sesión con una cuenta de usuario.\nSu dirección IP se almacenará en el historial de ediciones de la página.",
+       "createacct-email-ph": "Escriba su dirección de correo electrónico",
+       "createacct-another-email-ph": "Escriba la dirección de correo electrónico",
+       "createacct-reason-ph": "Por qué está creando otra cuenta",
+       "createacct-submit": "Cree su cuenta",
+       "createacct-benefit-heading": "Personas como usted son las que construyen {{SITENAME}}.",
+       "badretype": "Las contraseñas que usted ha introducido no coinciden.",
+       "usernameinprogress": "Ya está en marcha la creación de una cuenta para este nombre de usuario.\nPor favor, espere.",
+       "userexists": "El nombre de usuario indicado ya está en uso.\nPor favor elija un nombre diferente.",
+       "nocookiesnew": "Se ha creado la cuenta de usuario, pero aún no ha iniciado sesión.\n{{SITENAME}} usa <em>cookies</em> para identificar a los usuarios registrados.\nSu navegador tiene desactivadas las <em>cookies</em>.\nPor favor, actívelas e inicie sesión con su nuevo nombre de usuario y contraseña.",
+       "nocookieslogin": "{{SITENAME}} utiliza <em>cookies</em> para la autenticación de usuarios. Las <em>cookies</em> están desactivadas en su navegador. Por favor, actívelas e inténtelo de nuevo.",
+       "nocookiesfornew": "No se pudo crear la cuenta de usuario, porque no pudimos confirmar su origen.\nAsegúrese de que tiene las <em>cookies</em> activadas, luego recargue esta página e inténtelo de nuevo.",
+       "createacct-loginerror": "La cuenta se ha creado correctamente, pero no se pudo ingresar automáticamente. Proceda al [[Special:UserLogin|acceso manual]].",
+       "loginsuccess": "<strong>Ha accedido a {{SITENAME}} como «$1».</strong>",
+       "nosuchuser": "No existe ninguna cuenta llamada «$1».\nLos nombres de usuario distinguen mayúsculas y minúsculas.\nCompruebe su escritura o [[Special:CreateAccount|cree una cuenta nueva]].",
+       "nosuchusershort": "No existe ningún usuario llamado «$1».\nCompruebe que lo ha escrito correctamente.",
+       "nouserspecified": "Debe especificar un nombre de usuario.",
+       "login-userblocked": "No puede iniciar sesión porque su cuenta está bloqueada.",
+       "wrongpassword": "El nombre de usuario o la contraseña que ha proporcionado son incorrectos.\nPor favor inténtelo de nuevo.",
+       "wrongpasswordempty": "No ha introducido una contraseña.\nPor favor inténtelo de nuevo.",
+       "password-name-match": "Su contraseña debe ser diferente de su nombre de usuario.",
+       "passwordsent": "Se ha enviado una nueva contraseña al correo electrónico de «$1».\nPor favor, identifíquese de nuevo tras recibirla.",
+       "emailconfirmlink": "Confirme su dirección de correo electrónico",
+       "invalidemailaddress": "No se puede aceptar la dirección de correo electrónico, pues parece que tiene un formato no válido.\nPor favor, escriba una dirección bien formada o deje el campo en blanco.",
+       "anoneditwarning": "<strong>Advertencia:</strong> no ha iniciado sesión. Su dirección IP se hará pública si hace cualquier edición en estas condiciones. Si <strong>[$1 inicia sesión]</strong> o <strong>[$2 crea una cuenta]</strong>, sus ediciones se atribuirán a su nombre de usuario, además de otros beneficios.",
        "newarticletext": "Ha seguido usted un enlace a una página que aún no existe.\nPara crear esta página, escriba en el campo a continuación. Para más información, consulte la [$1 página de ayuda].\nSi ha llegado aquí por error, vuelva a la página anterior.",
-       "noarticletext": "En este momento no hay texto en esta página.\nPuede [[Special:Search/{{PAGENAME}}|buscar el título de esta página]] en otras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.",
+       "noarticletext": "En este momento no hay texto en esta página.\nPuede [[Special:Search/{{PAGENAME}}|buscar el título de esta página]] en otras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros relacionados],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta página]</span>.",
        "copyrightwarning": "Por favor observe que todas las contribuciones realizadas en {{SITENAME}} serán consideradas como liberadas bajo $2 (véase $1 para más detalles).\nSi no desea que sus escritos sean editados o redistribuídos a voluntad, entonces no contribuya aquí.<br />\nAl mismo tiempo está usted prometiendo que lo que usted va a enviar lo ha escrito usted, o copiado de una fuente de dominio público.\n'''¡No envíe textos con derechos de autor sin el debido permiso!'''",
        "permissionserrorstext-withaction": "No tiene permiso para $2 por {{PLURAL:$1|la|las}} {{PLURAL:$1|siguiente|siguientes}} {{PLURAL:$1|razón|razones}}:",
        "rev-deleted-text-permission": "Esta revisión de la página ha sido '''borrada'''.\nPuede encontrar detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
-       "rev-deleted-text-unhide": "Esta revisión de página ha sido '''borrada'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nComo administrador todavía puede [$1 ver esta revisión] si así lo desea.",
-       "rev-suppressed-text-unhide": "Esta revisión de la página ha sido '''suprimida'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].\nComo administrador podrá seguir [$1 viendo esta revisión] si desea continuar.",
-       "rev-deleted-text-view": "Esta revisión de la página ha sido '''borrada'''.\nComo administrador puede verla; puede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
-       "rev-suppressed-text-view": "Esta revisión de la página ha sido '''suprimida'''.\nComo administrador puede verla; puede haber detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
+       "rev-deleted-text-unhide": "Esta revisión ha sido <strong>eliminada</strong>.\nPara más información, consulte el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nComo administrador, aún puede [$1 ver esta revisión] si lo desea.",
+       "rev-suppressed-text-unhide": "Esta revisión ha sido <strong>suprimida</strong>.\nPara más información, consulte el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].\nComo supresor, aún puede [$1 ver esta revisión] si lo desea.",
+       "rev-deleted-text-view": "Esta revisión ha sido <strong>eliminada</strong>.\nAún tiene la posibilidad de verla. Para más información, consulte el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "rev-suppressed-text-view": "Esta revisión ha sido <strong>suprimida</strong>.\nAún tiene la posibilidad de verla. Para más información, consulte el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
        "rev-deleted-no-diff": "No puede visualizarse este cambio debido a que las revisiones han sido '''borradas'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
-       "revdelete-nooldid-text": "No se ha especificado una revisión o revisiones destino sobre las que realizar esta función.",
+       "revdelete-nooldid-text": "O bien no se ha especificado una revisión destino sobre la que realizar esta función, o bien la revisión especificada no existe, o bien está intentando ocultar la revisión actual.",
        "revdelete-show-file-confirm": "¿Está seguro de que desea ver la revisión borrada del archivo \"<nowiki>$1</nowiki>\" del $2 a las $3?",
        "revdelete-confirm": "Confirme que quiere realizar la operación, que entiende las consecuencias y que está ejecutando dicha acción acorde con [[{{MediaWiki:Policy-url}}|las políticas]].",
        "lineno": "Línea $1:",
        "rightslog": "Registro de cambios de permisos de usuarios",
        "recentchanges": "Cambios recientes",
        "recentchangeslinked-toolbox": "Cambios relacionados",
-       "recentchangeslinked-summary": "Esta es una lista de cambios efectuados recientemente a páginas enlazadas desde una página dada (o de miembros de una categoría dada).\nLas páginas que se encuentran en tu [[Special:Watchlist|lista de seguimiento]] están en <strong>negritas</strong>.",
+       "recentchangeslinked-summary": "Escriba el nombre de una página para ver cambios realizados en páginas con enlaces entrantes o salientes a esa página. (Para ver lo que pertenece a una categoría, escriba «Categoría:Nombre de la categoría»). Los cambios en páginas de su [[Special:Watchlist|lista de seguimiento]] aparecen en <strong>negrita</strong>.",
        "upload": "Subir archivo",
        "filehist-help": "Haga clic sobre una fecha/hora para ver el archivo a esa fecha.",
        "randompage": "Página aleatoria",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "emailuser": "Enviar un correo electrónico a este usuario",
-       "addedwatchtext": "La página «[[:$1]]» ha sido añadida a su [[Special:Watchlist|lista de seguimiento]]. Los cambios futuros en esta página y en su página de discusión asociada se indicarán ahí, y la página aparecerá '''en negritas''' en la [[Special:RecentChanges|lista de cambios recientes]] para hacerla más fácil de detectar.\n\nCuando quiera eliminar la página de su lista de seguimiento, presione «Dejar de vigilar» en el menú.",
+       "addedwatchtext": "Se han añadido «[[:$1]]» y su página de discusión a su [[Special:Watchlist|lista de seguimiento]].",
        "removedwatchtext": "Se han eliminado «[[:$1]]» y su página de discusión de tu [[Special:Watchlist|lista de seguimiento]].",
        "confirmdeletetext": "Está a punto de borrar una página junto con su historial.\nPor favor confirme que desea realizar esto, que entiende las consecuencias y que está realizando esta acción de acuerdo con las [[{{MediaWiki:Policy-url}}|políticas]]",
        "deletedtext": "\"$1\" ha sido borrado.\nVea $2 para un registro de los borrados recientes.",
        "rollbacklink": "revertir",
        "protect-text": "Puede ver y modificar el nivel de protección de la página '''$1'''.",
        "protect-locked-access": "Su cuenta no tiene permiso para cambiar los niveles de protección de una página.\nA continuación se muestran las opciones actuales de la página '''$1''':",
-       "protect-cascadeon": "Actualmente esta página está protegida porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que tienen activada la opción de protección en cascada. Puede cambiar el nivel de protección de esta página, pero no afectará a la protección en cascada.",
+       "protect-cascadeon": "Actualmente esta página está protegida porque está transcluida en {{PLURAL:$1|la siguiente página, que tiene|las siguientes páginas, que tienen}} activada la opción de protección de cascada.\nPuede cambiar el nivel de protección de esta página, pero no afectará a la protección de cascada.",
        "protect-cantedit": "No puede cambiar el nivel de protección porque no tiene permiso para editarla.",
        "blanknamespace": "(Principal)",
        "whatlinkshere": "Lo que enlaza aquí",
        "confirmemail_body": "Alguien, probablemente usted mismo, ha registrado desde la dirección IP $1 la cuenta \"$2\" en {{SITENAME}}, utilizando esta dirección de correo.\n\nPara confirmar que esta cuenta realmente le pertenece y activar el correo en {{SITENAME}}, siga este enlace:\n\n$3\n\nSi la cuenta *no* es suya, siga este otro enlace para cancelar la confirmación de la dirección de correo:\n\n$5\n\nEl código de confirmación expirará en $4.",
        "confirmemail_body_changed": "Alguien, probablemente usted,\nha modificado la dirección de correo electrónico asociado a la cuenta \"$2\" hacia esta en {{SITENAME}}, desde la dirección IP $1.\n\nPara confirmar que esta cuenta realmente le pertenece y reactivar las funciones de correo electrónico en {{SITENAME}}, abra este enlace en su navegador:\n\n$3\n\nSi la cuenta *no* le pertenece, sigua el siguiente enlace para cancelar la confirmación:\n\n$5\n\nEste código de confirmación expirará el $4.",
        "deletedwhileediting": "'''Aviso''': ¡Esta página fue borrada después de que usted empezara a editar!",
-       "confirmrecreate": "El usuario [[User:$1|$1]] ([[User talk:$1|discusión]]) borró este artículo después de que usted empezara a editarlo y dio esta razón:\n: ''$2'' \nPor favor, confirme que realmente desea crear de nuevo esta página.",
+       "confirmrecreate": "{{GENDER:$1|El usuario|La usuaria}} [[User:$1|$1]] ([[User talk:$1|discusión]]) borró esta página después de que usted comenzara a editarla, por este motivo:\n: <em>$2</em>\nPor favor confirme que realmente quiere volver a crearla.",
        "watchlistedit-normal-explain": "Los títulos de su lista de seguimiento se muestran debajo.\nPara eliminar un título, marque la casilla junto a él, y haga clic en ''{{int:Watchlistedit-normal-submit}}''.\nTambién puede [[Special:EditWatchlist/raw|editar la lista de en crudo]].",
        "watchlistedit-raw-explain": "Los títulos de su lista de seguimiento se muestran debajo. Esta lista puede ser editada añadiendo o eliminando líneas de la lista;\nun título por línea.\nCuando acabe, haga clic en \"{{int:Watchlistedit-raw-submit}}\".\nTambién puede [[Special:EditWatchlist|usar el editor estándar]].",
        "watchlistedit-raw-done": "Su lista de seguimiento ha sido actualizada.",
index 64c62c9..d1989ac 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} vigilando]",
-       "rc_categories": "Limitar a categorías (sep.: |):",
-       "rc_categories_any": "Cualquiera de las elegidas",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} después del cambio",
        "newsectionsummary": "Sección nueva: /* $1 */",
        "rc-enhanced-expand": "Mostrar detalles",
        "rollback-success": "Revertidas las ediciones de {{GENDER:$3|$1}};\nrecuperada la última versión de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertidas las ediciones de $1 hasta la última revisión de $2. [$3 Ver cambios]",
        "sessionfailure-title": "Error de sesión",
-       "sessionfailure": "Parece que hay un problema con tu sesión;\nse ha cancelado esta acción como medida de precaución contra el robo de sesiones.\nVuelve a la página anterior, recárgala e inténtalo de nuevo.",
+       "sessionfailure": "Parece que hay un problema con tu sesión;\nse ha cancelado esta acción como medida de precaución contra el robo de sesiones.\nEnvía el formulario otra vez.",
        "changecontentmodel": "Cambiar el modelo de contenido de una página",
        "changecontentmodel-legend": "Cambiar el modelo de contenido",
        "changecontentmodel-title-label": "Título de página",
        "watchlistedit-clear-titles": "Títulos:",
        "watchlistedit-clear-submit": "Vaciar la lista de seguimiento (¡permanente!)",
        "watchlistedit-clear-done": "Se ha vaciado tu lista de seguimiento.",
+       "watchlistedit-clear-jobqueue": "Se está vaciando la lista de seguimiento. Esta acción puede demorar algo de tiempo.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|un título fue eliminado|$1 títulos fueron eliminados}}:",
        "watchlistedit-too-many": "Hay demasiadas páginas para mostrar aquí.",
        "watchlisttools-clear": "Vaciar la lista de seguimiento",
        "feedback-thanks-title": "¡Muchas gracias!",
        "feedback-useragent": "Agente de usuario:",
        "searchsuggest-search": "Buscar en {{SITENAME}}",
-       "searchsuggest-containing": "que contiene...",
+       "searchsuggest-containing": "que contenga…",
        "api-error-badtoken": "Error interno: Símbolo incorrecto.",
        "api-error-emptypage": "No se pueden crear páginas nuevas que estén vacías.",
        "api-error-publishfailed": "Error interno: el servidor no pudo publicar el archivo temporal.",
index 3030d0a..152bfc4 100644 (file)
        "newpageletter": "U",
        "boteditletter": "R",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|jälgiv kasutaja|jälgivat kasutajat}}]",
-       "rc_categories": "Ainult neist kategooriatest (eraldajaks \"|\"):",
-       "rc_categories_any": "Mõnes valitutest",
        "rc-change-size-new": "$1 {{PLURAL:$1|bait|baiti}} pärast muudatust",
        "newsectionsummary": "/* $1 */ uus alaosa",
        "rc-enhanced-expand": "Näita üksikasju",
index 8bb471c..3100c46 100644 (file)
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|lankide|lankide}} jarraitzen]",
-       "rc_categories": "Kategorietara mugatu (\"|\" karaktereaz banandu):",
-       "rc_categories_any": "Aukeratutako edozein",
        "rc-change-size-new": "{{PLURAL:$1|Byte 1|$1 byte}} aldaketaren ostean",
        "newsectionsummary": "/* $1 */ atal berria",
        "rc-enhanced-expand": "Erakutsi xehetasunak",
index 41cf60f..0b1ecfa 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuáriu está|usuárius están}} vehilandu]",
-       "rc_categories": "Arrayal a categorias (separás pol \"|\")",
-       "rc_categories_any": "Cualisquiá",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dempués el chambu",
        "newsectionsummary": "/* $1 */ seción nueva",
        "rc-enhanced-expand": "muestral detallis (es mestel JavaScript)",
index 9a69939..9c1f343 100644 (file)
        "newpageletter": "نو",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر}} پی‌گیرنده]",
-       "rc_categories": "محدود به این رده‌ها (رده‌ها را با «|» جدا کنید):",
-       "rc_categories_any": "هر کدام از منتخب‌ها",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پس از تغییر",
        "newsectionsummary": "/* $1 */ بخش جدید",
        "rc-enhanced-expand": "نمایش جزئیات",
index d8aae31..71c593e 100644 (file)
@@ -92,6 +92,7 @@
        "tog-watchlisthideminor": "Piilota pienet muokkaukset tarkkailulistalta",
        "tog-watchlisthideliu": "Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlistreloadautomatically": "Päivitä tarkkailulista automaattisesti aina kun jotakin suodatinta on muutettu (vaatii JavaScriptiä)",
+       "tog-watchlistunwatchlinks": "Lisää suorat tarkkailemattomat/tarkkaillut linkit tarkkailulistan merkintöihin (JavaScriptiä edellytetään nappuloiden toiminnallisuuteen)",
        "tog-watchlisthideanons": "Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthidepatrolled": "Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta",
        "tog-watchlisthidecategorization": "Piilota sivujen luokitusmuutokset",
        "postedit-confirmation-created": "Sivu on nyt luotu.",
        "postedit-confirmation-restored": "Sivu on nyt palautettu (aiempaan versioonsa).",
        "postedit-confirmation-saved": "Muokkauksesi on tallennettu.",
+       "postedit-confirmation-published": "Muokkauksesi julkaistiin.",
        "edit-already-exists": "Uuden sivun luominen ei onnistunut.\nSe on jo olemassa.",
        "defaultmessagetext": "Viestin oletusteksti",
        "content-failed-to-parse": "Sisältö tyypiltään $2 ei jäsenny tyypiksi $1: $3",
        "newpageletter": "U",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|tarkkaileva käyttäjä|tarkkailevaa käyttäjää}}]",
-       "rc_categories": "Rajoita luokkiin (erota luokat merkillä ”|”)",
-       "rc_categories_any": "Mikä tahansa valituista",
        "rc-change-size-new": "$1 {{PLURAL:$1|tavu|tavua}} muutosten jälkeen",
        "newsectionsummary": "/* $1 */ uusi osio",
        "rc-enhanced-expand": "Näytä yksityiskohdat",
        "uploadbtn": "Tallenna tiedosto",
        "reuploaddesc": "Peruuta tallennus ja palaa tallennuslomakkeelle.",
        "upload-tryagain": "Lähetä muutettu tiedostokuvaus",
+       "upload-tryagain-nostash": "Lähetä uudelleenlähetetty tiedosto ja muokattu kuvaus",
        "uploadnologin": "Et ole kirjautunut sisään",
        "uploadnologintext": "Sinun pitää $1, jotta voit tallentaa tiedostoja.",
        "upload_directory_missing": "Tallennushakemisto $1 puuttuu, eikä palvelin pysty luomaan sitä.",
        "file-deleted-duplicate-notitle": "Tämän tiedoston kanssa samanlainen tiedosto on aikaisemmin poistettu ja tiedoston nimi on häivytetty.\nSinun on syytä pyytää jotakuta häivytettyjen tietojen näkemiseen oikeutettua käyttäjää katsomaan tiedoston tiedot asian arvioimiseksi ennen kuin jatkat tiedoston lataamista tietokantaan.",
        "uploadwarning": "Tallennusvaroitus",
        "uploadwarning-text": "Muuta alla olevaa tiedostokuvausta ja yritä uudelleen.",
+       "uploadwarning-text-nostash": "Uudelleenlähetä tiedosto, muokkaa kuvausta alla ja yritä uudelleen.",
        "savefile": "Tallenna",
        "uploaddisabled": "Tiedostojen tallennus ei ole käytössä.",
        "copyuploaddisabled": "Tallennus URL:n kautta on poistettu käytöstä.",
        "php-uploaddisabledtext": "PHP:n tiedostojen lähetys ei ole käytössä. Tarkista asetukset kohdasta file_uploads.",
        "uploadscripted": "Tämä tiedosto sisältää HTML-koodia tai skriptejä, jotka selain saattaa virheellisesti suorittaa.",
        "upload-scripted-pi-callback": "Ei voida tallentaa tiedostoa, joka sisältää XML-tyylimääritteen käsittelyohjeen.",
+       "upload-scripted-dtd": "Ei voida lähettää SVG-tiedostoja, jotka sisältävät ei-standardin DTD-selityksen.",
        "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
        "uploaded-hostile-svg": "Tallennetun SVG-tiedoston tyylielementissä löytyi turvaton CSS.",
        "uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
        "uploadstash-not-logged-in": "Käyttäjää ei ole kirjautunut sisään, tiedostojen on kuuluttava käyttäjille.",
        "uploadstash-no-such-key": "Ei tälläistä avainta ($1), ei voi poistaa.",
        "uploadstash-no-extension": "Laajennus on tyhjä.",
+       "uploadstash-zero-length": "Tiedoston pituus on nolla.",
        "invalid-chunk-offset": "Kelpaamaton siirtymä lohkoissa",
        "img-auth-accessdenied": "Pääsy estetty",
        "img-auth-nopathinfo": "PATH_INFO puuttuu.\nPalvelintasi ei ole asetettu välittämään tätä tietoa.\nSe saattaa olla CGI-pohjainen eikä voi tukea img_authia.\nLisätietoja löytyy sivulta https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "pageswithprop-legend": "Sivut sivun ominaisuuden mukaan",
        "pageswithprop-text": "Tällä sivulla on lueteltu sivut, jotka käyttävät erityistä sivun ominaisuutta.",
        "pageswithprop-prop": "Ominaisuuden nimi",
+       "pageswithprop-reverse": "Lajittele päinvastaisessa järjestyksessä",
+       "pageswithprop-sortbyvalue": "Lajittele ominaisuuden arvon mukaan",
        "pageswithprop-submit": "Siirry",
        "pageswithprop-prophidden-long": "Pitkä tekstimuotoinen ominaisuuden arvo piilotettu ($1)",
        "pageswithprop-prophidden-binary": "ominaisuuden binääriarvo on piilotettu ($1)",
        "doubleredirects": "Kaksinkertaiset ohjaukset",
        "doubleredirectstext": "Tällä sivulla on lueteltu ne sivut, jotka ohjaavat toiseen ohjaussivuun.\nJokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteeseen, joka on yleensä ”oikea” kohdesivu, johon ensimmäisen ohjauksen pitäisi johtaa.\n<del>Yliviivatut</del> kohteet on korjattu.",
        "double-redirect-fixed-move": "[[$1]] on siirretty.\nSe on automaattisesti päivitetty ja se ohjaa nyt sivulle [[$2]].",
-       "double-redirect-fixed-maintenance": "Korjataan automaattisesti kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]].",
+       "double-redirect-fixed-maintenance": "Korjataan automaattisesti kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]] huoltotyössä",
        "double-redirect-fixer": "Ohjausten korjaaja",
        "brokenredirects": "Virheelliset ohjaukset",
        "brokenredirectstext": "Seuraavat ohjaukset osoittavat sivuihin, joita ei ole olemassa.",
        "delete_and_move_text": "Kohdesivu [[:$1]] on jo olemassa. \nHaluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää sen tilalle?",
        "delete_and_move_confirm": "Kyllä, poista kohdesivu",
        "delete_and_move_reason": "Sivu on sivun [[$1]] siirron tiellä.",
-       "selfmove": " Nimi on sama;\nSivua ei voi siirtää itsensä päälle.",
+       "selfmove": "Nimi on sama;\nSivua ei voi siirtää itsensä päälle.",
        "immobile-source-namespace": "Sivuja ei voi siirtää nimiavaruudessa ”$1”",
        "immobile-target-namespace": "Sivuja ei voi siirtää nimiavaruuteen ”$1”",
        "immobile-target-namespace-iw": "Kielilinkki ei ole kelvollinen kohde sivun siirrolle.",
        "fix-double-redirects": "Päivitä kaikki vanhalle nimelle viittaavat ohjaukset ohjaamaan uudelle nimelle",
        "move-leave-redirect": "Jätä paikalle ohjaus",
        "protectedpagemovewarning": "'''Varoitus:''' Tämä sivu on lukittu siten, että vain ylläpitäjät voivat siirtää sen.\nAlla on viimeisin lokitapahtuma:",
-       "semiprotectedpagemovewarning": "Tämä sivu on lukittu siten, että vain rekisteröityneet käyttäjät voivat siirtää sitä.\nAlla on viimeisin lokitapahtuma:",
+       "semiprotectedpagemovewarning": "<strong>Huomaa:</strong> Tämä sivu on lukittu siten, että vain rekisteröityneet käyttäjät voivat siirtää sen.\nAlla on viimeisin lokitapahtuma:",
        "move-over-sharedrepo": "[[:$1]] on olemassa yhteisessä tietovarastossa. Tiedoston siirtäminen tälle nimelle korvaa yhteisen tiedoston.",
        "file-exists-sharedrepo": "Valittu tiedostonimi on jo käytössä jaetussa varastossa.\nValitse toinen nimi.",
        "export": "Vie sivuja",
        "pageinfo-category-subcats": "Alaluokkien määrä",
        "pageinfo-category-files": "Tiedostojen määrä",
        "pageinfo-user-id": "Käyttäjän tunnistenumero",
+       "pageinfo-file-hash": "Hash-arvo",
        "markaspatrolleddiff": "Merkitse tarkastetuksi",
        "markaspatrolledtext": "Merkitse muutos tarkastetuksi",
        "markaspatrolledtext-file": "Merkitse tämä tiedoston versio tarkastetuksi",
        "watchlistedit-clear-titles": "Sivujen nimet:",
        "watchlistedit-clear-submit": "Tyhjennä tarkkailulista (pysyvästi ja peruuttamattomasti!)",
        "watchlistedit-clear-done": "Tarkkailulistasi on tyhjennetty.",
+       "watchlistedit-clear-jobqueue": "Tarkkailulistaasi ollaan tyhjentämässä. Tämä voi kestää jonkin aikaa!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Yksi sivu|$1 sivua}} on poistettu:",
        "watchlistedit-too-many": "Luettelossa on liikaa sivuja näytettäväksi tässä.",
        "watchlisttools-clear": "Tyhjennä tarkkailulista",
        "restrictionsfield-badip": "Virheellinen IP-osoite tai alue: $1",
        "restrictionsfield-label": "Sallitut IP-alueet:",
        "restrictionsfield-help": "Yksi IP-osoite tai CIDR-alue per rivi. Ottaaksesi kaiken käyttöön, käytä:<pre>0.0.0.0/0\n::/0</pre>",
-       "edit-error-short": "$1",
+       "edit-error-short": "Virhe: $1",
        "edit-error-long": "Virheet:\n\n$1",
        "revid": "versio $1",
        "pageid": "sivun tunnistenumero $1",
index 535d81f..d1142f8 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 ansar eftir {{PLURAL:$1|brúkara|brúkarum}}]",
-       "rc_categories": "Avmarkað til síður frá bólkunum (skil sundur við \"|\")",
-       "rc_categories_any": "Nakar",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} eftir broyting",
        "newsectionsummary": "/* $1 */ nýtt innlegg",
        "rc-enhanced-expand": "Vís smálutir",
index a5f9597..4168900 100644 (file)
        "protectedpagetext": "Cette page a été protégée pour empêcher sa modification ou d’autres actions.",
        "viewsourcetext": "Vous pouvez voir et copier le contenu de cette page.",
        "viewyourtext": "Vous pouvez voir et copier le contenu de <strong>vos modifications</strong> à cette page.",
-       "protectedinterface": "Cette page fournit du texte d’interface pour le logiciel sur ce wiki et est protégée pour éviter les abus.\nPour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
+       "protectedinterface": "Cette page fournit du texte d’interface pour le logiciel sur ce wiki et est protégée pour éviter les abus.\nPour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de régionalisation de MediaWiki.",
        "editinginterface": "<strong>Attention :</strong> vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel.\nLes changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.",
        "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de localisation linguistique de MediaWiki.",
        "cascadeprotected": "Cette page est protégée contre les modifications car elle est transcluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :\n$2",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 utilisateur{{PLURAL:$1||s}} en train de suivre]",
-       "rc_categories": "Limiter aux catégories (séparées par « | ») :",
-       "rc_categories_any": "Une des sélectionnées",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après changement",
        "newsectionsummary": "/* $1 */ nouvelle section",
        "rollback-success": "Révocation des modifications effectuées par {{GENDER:$3|$1}} ;\nrétablissement de la dernière version par {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 Voir les changements]",
        "sessionfailure-title": "Erreur de session",
-       "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez cliquer sur « Précédent », rechargez la page d'où vous venez, puis réessayez.",
+       "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez soumettre le formulaire de nouveau.",
        "changecontentmodel": "Modifier le modèle de contenu d’une page",
        "changecontentmodel-legend": "Modifier le modèle de contenu",
        "changecontentmodel-title-label": "Titre de la page",
        "thumbnail_dest_directory": "Impossible de créer le répertoire de destination",
        "thumbnail_image-type": "Type d’image non pris en charge",
        "thumbnail_gd-library": "Configuration incomplète de la bibliothèque GD : fonction $1 introuvable",
+       "thumbnail_image-size-zero": "La taille du fichier image semble être de zéro.",
        "thumbnail_image-missing": "Le fichier suivant est introuvable : $1",
        "thumbnail_image-failure-limit": "Il y a eu récemment trop de tentatives échouées ($1 ou plus) pour restituer cette vignette. Veuillez réessayer ultérieurement.",
        "import": "Importer des pages",
        "watchlistedit-clear-titles": "Titres :",
        "watchlistedit-clear-submit": "Effacer la liste de suivi (ceci est permanent !)",
        "watchlistedit-clear-done": "Votre liste de suivi a été effacée.",
+       "watchlistedit-clear-jobqueue": "Votre liste de suivi est en cours de supression. Ce qui peut prendre un certain temps.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Un titre a été|$1 titres ont été}} retirés :",
        "watchlistedit-too-many": "Il y a trop de pages à afficher ici.",
        "watchlisttools-clear": "Effacer la liste de suivi",
index 048526e..bebff59 100644 (file)
        "newpageletter": "N",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilisator qu’est|utilisators que sont}} aprés siuvre]",
-       "rc_categories": "Limitar a les catègories (sèparâyes per « | ») :",
-       "rc_categories_any": "Yona de les chouèsies",
        "rc-change-size-new": "$1 octèt{{PLURAL:$1||s}} aprés changement",
        "newsectionsummary": "/* $1 */ novèla sèccion",
        "rc-enhanced-expand": "Montrar los dètalys",
index 3c5c93a..396ff16 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|brüker|brükern}}, diar tuluke]",
-       "rc_categories": "Bluas sidjen ütj jo kategoriin (apdiald mä „|“):",
-       "rc_categories_any": "Arke ütjsoocht",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter't feranrin",
        "newsectionsummary": "Nei kirew /* $1 */",
        "rc-enhanced-expand": "Enkelthaiden wise",
index 3ed0d0d..c71f994 100644 (file)
        "newpageletter": "G",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[tignude di voli di {{PLURAL:$1|un utent|$1 utents}}]",
-       "rc_categories": "Limite aes categoriis (dividilis cun \"|\")",
-       "rc_categories_any": "Cualsisei",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la modifiche",
        "newsectionsummary": "/* $1 */ gnove sezion",
        "rc-enhanced-expand": "Cjale i detais (al covente JavaScript)",
index 25d3964..3a25100 100644 (file)
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 folgjende {{PLURAL:$1|meidogger|meidoggers}}]",
-       "rc_categories": "Alline kategoryen (skiede mei in \"|\")",
-       "rc_categories_any": "Elk",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nei de wiziging",
        "newsectionsummary": "/* $1 */ nije seksje",
index df5c885..40b2919 100644 (file)
        "newpageletter": "N",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|úsáideoir amháin|$1 úsáideoirí}} ag faire]",
-       "rc_categories_any": "Aon chatagóir",
        "rc-change-size-new": "$1 {{PLURAL:$1|bheart|beart}} tar éis an athraithe",
        "newsectionsummary": "/* $1 */ mír nua",
        "rc-enhanced-expand": "Taispeáin mionsonraithe",
index c57b95f..0764f30 100644 (file)
@@ -16,7 +16,8 @@
                        "Duolaimi",
                        "Impersonator 1",
                        "Babanwalia",
-                       "Macofe"
+                       "Macofe",
+                       "Fanjiayi"
                ]
        },
        "tog-underline": "下划链接",
        "nstab-template": "模版",
        "nstab-help": "帮助页",
        "nstab-category": "分类",
+       "mainpage-nstab": "封面",
        "nosuchaction": "冇有个只命令",
        "nosuchactiontext": "Wiki识别伓到个只URL命令",
        "nosuchspecialpage": "冇有个只特殊页",
        "createaccount-title": "到{{SITENAME}}创建𠮶帐户",
        "createaccount-text": "有人到{{SITENAME}}用倷𠮶电子邮件地址开设喽只名字系 \"$2\" 𠮶新帐户($4),密码系 \"$3\" 。请倷仰上登录同到修改密码。\n\n要系帐户创建不对𠮶话,倷就莫搭个只消息。",
        "loginlanguagelabel": "语言: $1",
+       "pt-login": "登入",
+       "pt-createaccount": "新开只帐户",
        "changepassword": "改过密码",
        "resetpass_announce": "倷系用到临时email𠮶代码登入𠮶。要登正入,倷要到个首设定只新密码:",
        "resetpass_header": "设过密码",
        "rclistfrom": "显示自$3 $2后𠮶新改动",
        "rcshowhideminor": "$1细编辑",
        "rcshowhidebots": "$1机器人𠮶编辑",
-       "rcshowhideliu": "$1登入用户𠮶编辑",
+       "rcshowhideliu": "$1注册用户",
        "rcshowhideanons": "$1匿名用户𠮶编辑",
        "rcshowhidepatr": "$1检查过𠮶编辑",
        "rcshowhidemine": "$1偶𠮶编辑",
-       "rclinks": "显示最晏$2日之内最新𠮶$1改动。",
+       "rclinks": "显示最晏$2日之内最新𠮶$1改动。",
        "diff": "差异",
        "hist": "历史",
        "hide": "弆到",
        "newpageletter": "新",
        "boteditletter": "机",
        "number_of_watching_users_pageview": "[$1只监视用户]",
-       "rc_categories": "分类界定(用\"|\"隔开)",
-       "rc_categories_any": "任何",
        "newsectionsummary": "/* $1 */ 新段落",
        "rc-enhanced-expand": "显到细节(需要 JavaScript)",
        "rc-enhanced-hide": "弆到细节",
        "namespace": "空间名:",
        "invert": "反选",
        "blanknamespace": "(主要)",
-       "contributions": "用户贡献",
+       "contributions": "{{GENDER:$1|用户}}贡献",
        "contributions-title": "$1𠮶用户贡献",
        "mycontris": "偶𠮶贡献",
        "contribsub2": "$1𠮶贡献 ($2)",
        "tooltip-t-recentchangeslinked": "从个页连出𠮶全部页面𠮶改动",
        "tooltip-feed-rss": "个页𠮶RSS订阅",
        "tooltip-feed-atom": "个页𠮶Atom订阅",
-       "tooltip-t-contributions": "望吖个只用户𠮶贡献",
+       "tooltip-t-contributions": "由{{GENDER:$1|此用户}}做出的贡献列表",
        "tooltip-t-emailuser": "发封邮件到个只用户",
        "tooltip-t-upload": "上传图像或多媒体文件",
        "tooltip-t-specialpages": "全部特殊页列表",
        "file-info-size": "$1 × $2 像素,档案大细:$3 ,MIME类型:$4",
        "file-nohires": "冇更高分辨率𠮶图像。",
        "svg-long-desc": "SVG档案,表面大细: $1 × $2 像素,档案大细:$3",
-       "show-big-image": "å®\8cæ\95´å\88\86辨ç\8e\87",
+       "show-big-image": "å\8e\9få§\8bæ\96\87件",
        "newimages": "新建图像画廊",
        "imagelisttext": "底下系按$2排列𠮶$1只档案列表。",
        "noimages": "冇什哩可望。",
        "external_image_whitelist": "#留住个行字<pre>\n#到下首(//𠮶中间)输入正规表达式\n#佢俚会同得外部(已超连结𠮶)图片配合\n#许滴配合到出来𠮶会显示做图片,否则就光会显示做连结\n#有 # 开头𠮶行会当做注解\n#大小写冇有差别\n\n#到个行上首输入所有𠮶regex。留住个行字</pre>",
        "tag-filter": "[[Special:Tags|标签]]过滤器:",
        "rightsnone": "(冇)",
-       "searchsuggest-search": "寻吖"
+       "searchsuggest-search": "寻吖{{SITENAME}}"
 }
index 03c6063..a683acb 100644 (file)
        "newpageletter": "新",
        "boteditletter": "機",
        "number_of_watching_users_pageview": "[$1隻監視用戶]",
-       "rc_categories": "分類界定(用\"|\"隔開)",
-       "rc_categories_any": "任何",
        "newsectionsummary": "/* $1 */ 新段落",
        "rc-enhanced-expand": "顯到細節(需要 JavaScript)",
        "rc-enhanced-hide": "弆到細節",
index 600f0e9..b30a5bd 100644 (file)
        "boteditletter": "bt",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[Tha $1 {{PLURAL:$1|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} a' cumail sùil air]",
-       "rc_categories": "Dìreach sna roinnean-seòrsa (sgaraich le “|”):",
-       "rc_categories_any": "Gin dhe na chaidh a thaghadh",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}} às dèidh an atharrachaidh",
        "newsectionsummary": "Earrann ùr /* $1 */",
index 5be7056..fb44ca6 100644 (file)
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} vixiando]",
-       "rc_categories": "Limitar ás categorías (separadas por \"|\"):",
-       "rc_categories_any": "Calquera das elixidas",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} despois da modificación",
        "newsectionsummary": "Nova sección: /* $1 */",
index e8b07f6..beecd23 100644 (file)
        "minoreditletter": "द",
        "newpageletter": "न",
        "boteditletter": "र",
-       "rc_categories_any": "वेंचिल्ल्या मदलें खंयचेय",
        "rc-change-size-new": "$1 {{बहुवचन:$1|byte|bytes}}बदल केल्या उपरांत",
        "rc-enhanced-expand": "म्हायती दाखय",
        "rc-enhanced-hide": "म्हायती लिपय",
index 493e033..976847b 100644 (file)
        "minoreditletter": "d",
        "newpageletter": "N",
        "boteditletter": "r",
-       "rc_categories_any": "Vinchlele modlem khuimchem-i",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byti}} bodol kel'lea uprant",
        "rc-enhanced-expand": "Bariksann dakhoi",
        "rc-enhanced-hide": "Bariksann lipoi",
index 492adc8..c9d4291 100644 (file)
        "newpageletter": "Ν",
        "boteditletter": "αὐτ",
        "number_of_watching_users_pageview": "[$1 ἐφορᾶν {{PLURAL:$1|χρώμενον|χρωμένους}}]",
-       "rc_categories": "Ὅριον κατηγοριῶν (σήμανσις διαχωρίσεως: \"|\")",
-       "rc_categories_any": "Οἵα δήποτε",
        "rc-change-size-new": "$1 {{PLURAL:$1|δυφιολέξις|δυφιολέξεις}} μεθύστερον μεταβολής",
        "newsectionsummary": "/* $1 */ νέον τμῆμα",
        "rc-enhanced-expand": "Δεικνύναι λεπτομέρειας (ἀπαιτεῖ JavaScript)",
index 6814844..f16e09e 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|Benutzer, wu beobachtet|Benutzer, wu beobachte}}]",
-       "rc_categories": "Nume Syten us bestimmte Kategorie (mit «|» trenne):",
-       "rc_categories_any": "Beliebigi vo den usgwählte",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Byte}} no dr Änderig",
        "newsectionsummary": "Neje Abschnitt /* $1 */",
        "rc-enhanced-expand": "Detail aazeige",
index c0424f6..a75b84c 100644 (file)
        "newpageletter": "નવું",
        "boteditletter": "બૉટ",
        "number_of_watching_users_pageview": "[$1 જોઇરહેલ  {{PLURAL:$1|સભ્ય|સભ્યો}}]",
-       "rc_categories": "શ્રેણીઓ સુધી મર્યાદિત (\"|\" થી જુદા પાડો):",
-       "rc_categories_any": "કોઇ પણ પસંદ કરેલ",
        "rc-change-size-new": "બદલાયા પછી $1 {{PLURAL:$1|બાઈટ|બાઇટ્સ}}",
        "newsectionsummary": "/* $1 */ નવો વિભાગ",
        "rc-enhanced-expand": "વિગતો બતાવો",
index 0c4d19e..c80216e 100644 (file)
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "r",
-       "rc_categories_any": "Ronney erbee",
        "rc-enhanced-expand": "Taishbyn sonreeaghtyn (ta feme er JavaScript)",
        "rc-enhanced-hide": "Follee sonreeaghtyn",
        "recentchangeslinked": "Caghlaaghyn conastagh",
index 126d1e2..c4819f7 100644 (file)
        "newpageletter": "Sîn",
        "boteditletter": "kî",
        "number_of_watching_users_pageview": "[$1隻用戶關注]",
-       "rc_categories": "分類界限(以“|”分割)",
-       "rc_categories_any": "任意",
        "rc-change-size-new": "Kiên-kói heu ke $1 vi-ngièn-chû",
        "rc-enhanced-expand": "展示細節 (愛有JavaScript)",
        "rc-enhanced-hide": "隱藏細節",
index e309eec..8f7f434 100644 (file)
        "mytalk": "שיחה",
        "anontalk": "שיחה",
        "navigation": "ניווט",
-       "and": "&#32;ו",
+       "and": "&#32;וגם",
        "faq": "שאלות ותשובות",
        "actions": "פעולות",
        "namespaces": "מרחבי שם",
        "newpageletter": "ח",
        "boteditletter": "ב",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|משתמש אחד עוקב|$1 משתמשים עוקבים}} אחרי הדף]",
-       "rc_categories": "הגבלה לקטגוריות (מופרדות בתו \"|\"):",
-       "rc_categories_any": "כל אחת מהנבחרות",
        "rc-change-size-new": "{{PLURAL:$1|בית אחד|$1 בתים}} לאחר השינוי",
        "newsectionsummary": "/* $1 */ פסקה חדשה",
        "rc-enhanced-expand": "הצגת הפרטים",
        "rollback-success": "שוחזר מעריכות של {{GENDER:$3|$1}} לעריכה האחרונה של {{GENDER:$4|$2}}.",
        "rollback-success-notify": "שוחזר מעריכות של $1 לעריכה האחרונה של $2. [$3 הצגת שינויים]",
        "sessionfailure-title": "בעיה בחיבור",
-       "sessionfailure": "נר×\90×\94 ×©×\99ש ×\91×¢×\99×\94 ×\91×\97×\99×\91×\95ר ×©×\9c×\9a ×\9c×\90תר;\nפע×\95×\9c×\94 ×\96×\95 ×\91×\95×\98×\9c×\94 ×\9b×\90×\9eצע×\99 ×\96×\94×\99ר×\95ת × ×\92×\93 ×\94ת×\97×\96×\95ת ×\9cתקש×\95רת ×\9e×\9e×\97ש×\91×\9a.\n× ×\90 ×\9c×\97×\96×\95ר ×\9c×\93×£ ×\94ק×\95×\93×\9d, ×\9c×\98×¢×\95×\9f ×\90×\95ת×\95 ×\9e×\97×\93ש ×\95×\9cנס×\95ת ×©×\95×\91.",
+       "sessionfailure": "נר×\90×\94 ×©×\99ש ×\91×¢×\99×\94 ×\91×\97×\99×\91×\95ר ×©×\9c×\9a ×\9c×\90תר;\nפע×\95×\9c×\94 ×\96×\95 ×\91×\95×\98×\9c×\94 ×\9b×\90×\9eצע×\99 ×\96×\94×\99ר×\95ת × ×\92×\93 ×\94ת×\97×\96×\95ת ×\9cתקש×\95רת ×\9e×\9e×\97ש×\91×\9a.\n× ×\90 ×\9cש×\9c×\95×\97 ×\9e×\97×\93ש ×\90ת ×\94×\98×\95פס.",
        "changecontentmodel": "שינוי מודל התוכן של דף",
        "changecontentmodel-legend": "שינוי מודל התוכן",
        "changecontentmodel-title-label": "שם הדף",
        "watchlistedit-clear-titles": "כותרות:",
        "watchlistedit-clear-submit": "ניקוי רשימת המעקב (לצמיתות!)",
        "watchlistedit-clear-done": "רשימת המעקב שלך נוקתה.",
+       "watchlistedit-clear-jobqueue": "רשימת המעקב שלך נמצאת בתהליך ניקוי. התהליך עשוי לקחת זמן־מה!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}}:",
        "watchlistedit-too-many": "יש יותר מדי דפים ולא ניתן להציגם כאן.",
        "watchlisttools-clear": "ניקוי רשימת המעקב",
index fd01409..7e0397d 100644 (file)
        "newpageletter": "न",
        "boteditletter": "बॉ",
        "number_of_watching_users_pageview": "[$1 ध्यान रखने वाले {{PLURAL:$1|सदस्य}}]",
-       "rc_categories": "श्रेणीयों तक सीमीत रखें (\"|\" से अलग करें)",
-       "rc_categories_any": "कोई भी चुनिन्दा",
        "rc-change-size-new": "बदलाव के बाद $1 {{PLURAL:$1|बाइट}}",
        "newsectionsummary": "/* $1 */ नया अनुभाग",
        "rc-enhanced-expand": "विस्तृत जानकारी दिखाएँ",
index 0c8b570..c60a534 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|user|users}} ke dekhta hae]",
-       "rc_categories": "Categories me limit (\"|\" se separate karo)",
-       "rc_categories_any": "Chuna gais me se koi",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} badlao ke baad",
        "newsectionsummary": "/* $1 */ nawaa vibhag",
        "rc-enhanced-expand": "Details dekhao",
index 4a94fc3..4829231 100644 (file)
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 ginabantayan {{PLURAL:$1|naga-usar|mga naga-usar}}]",
-       "rc_categories": "Limitahan ang mga kategorya (ibulag lakip sang \"|\")",
-       "rc_categories_any": "Bisan ano",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|mga byte}} pagkatapos sang pag-ilis",
        "newsectionsummary": "/* $1 */ bag-o nga seksyon",
        "rc-enhanced-expand": "Ipakita ang mga detalye",
index 5fd0fe9..63b9bce 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|suradnik|suradnika|suradnika}} prati ovu stranicu]",
-       "rc_categories": "Ograniči na kategorije (odvoji sa \"|\")",
-       "rc_categories_any": "Bilo koji od odabranih",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije uređivanja",
        "newsectionsummary": "/* $1 */ novi odlomak",
        "rc-enhanced-expand": "Pokaži detalje (potreban JavaScript)",
index c20b3ad..09ee5b6 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Benutzer]",
-       "rc_categories": "Nur Seite aus den Kategorie (getrennt mit „|“):",
-       "rc_categories_any": "Alle",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} noh der Ännrung",
        "newsectionsummary": "Neier Abschnitt /* $1 */",
        "rc-enhanced-expand": "Einzelheite oonzeiche",
index 1394870..1a19adb 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|wobkedźbowacy wužiwar|wobkedźbowacaj wužiwarjej|wobkedźbowacy wužiwarjo|wobkedźbowacych wužiwarjow}}]",
-       "rc_categories": "Jenož kategorije (dźělene z \"|\")",
-       "rc_categories_any": "Někajka z wubranych",
        "rc-change-size": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}}",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}} po změnje",
        "newsectionsummary": "Nowy wotrězk: /* $1 */",
        "protect-otherreason-op": "Druha přičina",
        "protect-dropdown": "*Powšitkowne škitowe přičiny\n** Ekscesiwny wandalizm\n** Ekscesiwne spamowanje\n** Wobdźěłanska wójna\n** Strona z jara wjele změnami",
        "protect-edit-reasonlist": "Škitowe přičiny wobdźěłać",
-       "protect-expiry-options": "1 hodźinu:1 hour,1 dźeń:1 day,1 tydźeń:1 week,2 njedźeli:2 weeks,1 měsać:1 month,3 měsacy:3 months,6 měsacow:6 months,1 lěto:1 year,na přeco:infinite",
+       "protect-expiry-options": "1 hodźinu:1 hour,1 dźeń:1 day,1 tydźeń:1 week,2 njedźeli:2 weeks,1 měsac:1 month,3 měsacy:3 months,6 měsacow:6 months,1 lěto:1 year,na přeco:infinite",
        "restriction-type": "Škitowy status",
        "restriction-level": "Runina škita:",
        "minimum-size": "Minimalna wulkosć:",
        "ipbenableautoblock": "IP-adresy blokować kiž buchu přez tutoho wužiwarja hižo wužiwane kaž tež naslědne adresy, z kotrychž so wobdźěłanje pospytuje",
        "ipbsubmit": "Wužiwarja zablokować",
        "ipbother": "Druha doba",
-       "ipboptions": "2 hodźinje:2 hours,1 dźeń:1 day,3 dny:3 days,1 tydźeń:1 week,2 njedźeli:2 weeks,1 měsać:1 month,3 měsacy:3 months,6 měsacow:6 months,1 lěto:1 year,na přeco:infinite",
+       "ipboptions": "2 hodźinje:2 hours,1 dźeń:1 day,3 dny:3 days,1 tydźeń:1 week,2 njedźeli:2 weeks,1 měsac:1 month,3 měsacy:3 months,6 měsacow:6 months,1 lěto:1 year,na přeco:infinite",
        "ipbhidename": "Wužiwarske mjeno stawiznach a lisćinach schować",
        "ipbwatchuser": "Wužiwarsku a diskusijnu stronu tutoho wužiwarja wobkedźbować",
        "ipb-disableusertalk": "Tutomu wužiwarjej zadźěwać, swoju diskusijnu stronu wobdźěłać, mjeztym zo je zablokowany",
index 19d55e4..174e576 100644 (file)
        "newpageletter": "Ú",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[Jelenleg {{PLURAL:$1|egy|$1}} felhasználó figyeli]",
-       "rc_categories": "Szűkítés kategóriákra („|” jellel válaszd el őket):",
-       "rc_categories_any": "Választottak közül bármelyik",
        "rc-change-size-new": "$1 bájt módosítás után",
        "newsectionsummary": "/* $1 */ (új szakasz)",
        "rc-enhanced-expand": "Részletek megjelenítése",
        "rollback-success": "{{GENDER:$3|$1}} szerkesztéseit visszaállítottam {{GENDER:$4|$2}} utolsó változatára.",
        "rollback-success-notify": "$1 szerkesztései visszaállítva;\nhelyreállítva $2 utolsó változata. [$3 Változtatások megtekintése]",
        "sessionfailure-title": "Munkamenethiba",
-       "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, hogy nyomd meg a „vissza” gombot, és töltsd le újra az oldalt, ahonnan jöttél, majd próbáld újra.",
+       "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, küldd el újra az űrlapot.",
        "changecontentmodel": "A lap tartalommodelljének megváltoztatása",
        "changecontentmodel-legend": "Tartalommodell megváltoztatása",
        "changecontentmodel-title-label": "Lapcím",
        "thumbnail_dest_directory": "Nem hozható létre a célkönyvtár",
        "thumbnail_image-type": "A képformátum nem támogatott",
        "thumbnail_gd-library": "A GD-könyvtár nincs megfelelően beállítva: a(z) $1 függvény hiányzik",
+       "thumbnail_image-size-zero": "A képfájl mérete nullának tűnik.",
        "thumbnail_image-missing": "Úgy tűnik, hogy a fájl hiányzik: $1",
        "thumbnail_image-failure-limit": "Túl sok hibás bélyegkép létrehozás (több mint $1). Próbáld meg később!",
        "import": "Lapok importálása",
        "watchlistedit-clear-titles": "Címek:",
        "watchlistedit-clear-submit": "Figyelőlista kiürítése (Ez végleges!)",
        "watchlistedit-clear-done": "A figyelőlistád törölve.",
+       "watchlistedit-clear-jobqueue": "A figyelőlistád kiürítése folyamatban van. Ez eltarthat egy ideig.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|$1 oldal}} törölve:",
        "watchlistedit-too-many": "Túl sok lap a megjelenítéshez.",
        "watchlisttools-clear": "A figyelőlista kiürítése",
index 3f6c0cb..a16a994 100644 (file)
@@ -66,7 +66,7 @@
        "tog-watchlisthidebots": "Թաքցնել բոտերի խմբագրումները հսկացանկից",
        "tog-watchlisthideminor": "Թաքցնել չնչին խմբագրումները հսկացանկից",
        "tog-watchlisthideliu": "Թաքցնել մուտք գործած մասնակիցների խմբագրումները հսկացանկից",
-       "tog-watchlistreloadautomatically": "Ֆիլտրի ամեն փոփոխության դեպքում ինքնաշխատ կերպով վերբեռնել հսկացանկը (անհրաժեշտ է JavaScript)",
+       "tog-watchlistreloadautomatically": "Զտիչի ամեն փոփոխության դեպքում ինքնաշխատ կերպով վերբեռնել հսկացանկը (անհրաժեշտ է JavaScript)",
        "tog-watchlisthideanons": "Թաքցնել անանուն մասնակիցների խմբագրումները հսկացանկից",
        "tog-watchlisthidepatrolled": "Թաքցնել պարեկված խմբագրումները հսկացանկից",
        "tog-watchlisthidecategorization": "Թաքցնել էջերի կատեգորիզացիան",
        "userlogin-resetpassword-link": "Մոռացե՞լ եք գաղտնաբառը",
        "userlogin-helplink2": "Մուտք գործելու օգնություն",
        "userlogin-loggedin": "Դուք արդեն մտել է որպես {{GENDER:$1|$1}}.\nՕգտագործեք ստորև բերված ձևը մուտք գործելու համար այլ հաշից",
-       "userlogin-reauth": "Ô´Õ¸Ö\82Ö\84 ÕºÕ¥Õ¿Ö\84 Õ§ Õ¯Ö\80Õ¯Õ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö\80Õ£ Õ´Õ¸Ö\82Õ¿Ö\84 Õ£Õ¸Ö\80Õ®Õ¥Ö\84  Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬Õ¸Ö\82 Õ¸Ö\80 Õ¤Õ¸Ö\82Ö\84 Õ¤Õ¸Ö\82Ö\84 Õ¥Ö\84 {{GENDER:$1|$1}}.",
+       "userlogin-reauth": "Ô´Õ¸Ö\82Ö\84 ÕºÕ¥Õ¿Ö\84 Õ§ Õ¯Ö\80Õ¯Õ«Õ¶ Õ´Õ¸Ö\82Õ¿Ö\84 Õ£Õ¸Ö\80Õ®Õ¥Ö\84 Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö\80Õ£` Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬Õ¸Ö\82, Õ¸Ö\80 Õ¤Õ¸Ö\82Ö\84 Õ¤Õ¸Ö\82Ö\84 Õ¥Ö\84 {{GENDER:$1|$1}}Ö\89",
        "userlogin-createanother": "Ստեղծել այլ հաշիվ",
        "createacct-emailrequired": "Էլ–փոստի հասցե",
        "createacct-emailoptional": "Էլ–փոստի հասցե (ոչ պարտադիր)",
        "recentchanges-submit": "Ցույց տալ",
        "rcfilters-tag-remove": "Հեռացնել '$1'",
        "rcfilters-legend-heading": "<strong>Հապավումների ցանկ.</strong>",
+       "rcfilters-other-review-tools": "Վերանայման այլ գործիքներ",
+       "rcfilters-group-results-by-page": "Արդյունքները խմբավորել էջերով",
+       "rcfilters-activefilters": "Ակտիվ զտիչներ",
+       "rcfilters-advancedfilters": "Ընդլայնված ֆիլտրեր",
+       "rcfilters-limit-title": "Ցուցադրվող արդյունքներ",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|փոփոխություն|փոփոխություններ}}, $2",
+       "rcfilters-date-popup-title": "Որոնման ժամանակահատված",
        "rcfilters-days-title": "Վերջին օրերին",
        "rcfilters-hours-title": "Վերջին ժամերը",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|օր|օրեր}}",
+       "rcfilters-quickfilters": "Պահպանված զտիչներ",
+       "rcfilters-quickfilters-placeholder-title": "Պահպանված ֆիլտրեր դեռ չկան",
+       "rcfilters-quickfilters-placeholder-description": "Ձեր զտիչի կայանքները պահպանելու և հետագայում օգտագործելու համար՝ սեղմեք ստորև գտնվող «Ակտիվ ֆիլտր» դաշտի էջանշի պատկերակին։",
+       "rcfilters-savedqueries-defaultlabel": "Պահպանված ֆիլտրեր",
        "rcfilters-savedqueries-rename": "Վերանվանել",
        "rcfilters-savedqueries-remove": "Ջնջել",
        "rcfilters-savedqueries-new-name-label": "Անուն",
        "rcfilters-savedqueries-apply-label": "Ստեղծել արագ հղում",
        "rcfilters-savedqueries-cancel-label": "Չեղարկել",
+       "rcfilters-show-new-changes": "Դիտել ամենանոր փոփոխությունները",
+       "rcfilters-search-placeholder": "Զտիչի փոփոխություններ (զտիչի անվան համար օգտագործեք մենյուն կամ որոնումը)",
        "rcfilters-filterlist-title": "Զտիչներ",
        "rcfilters-filterlist-whatsthis": "Ինչպե՞ս է սա աշխատում:",
+       "rcfilters-highlightbutton-title": "Ընդգծել արդյունքները",
        "rcfilters-highlightmenu-title": "Ընտրեք գույնը",
+       "rcfilters-filterlist-noresults": "Զտիչներ չեն գտնվել",
+       "rcfilters-filtergroup-authorship": "Ներդրումների հեղինակ",
        "rcfilters-filter-editsbyself-label": "Ձեր խմբագրումներ",
+       "rcfilters-filter-editsbyother-label": "Այլոց փոփոխությունները",
+       "rcfilters-filtergroup-userExpLevel": "Մասնակիցների գրանցում և փորձ",
+       "rcfilters-filter-user-experience-level-registered-label": "Գրանցված",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Չգրանցված",
        "rcfilters-filter-user-experience-level-newcomer-label": "Նորեկներ",
        "rcfilters-filter-user-experience-level-newcomer-description": "Գրանցված խմբագիրներ՝ ոչ պակաս քան 10 խմբագրումով և 4 օր ակտիվությամբ:",
-       "rcfilters-filtergroup-lastRevision": "Ընթացիկ տարբերակ",
+       "rcfilters-filter-user-experience-level-learner-label": "Սովորողներ",
+       "rcfilters-filter-bots-label": "Բոտ",
+       "rcfilters-filter-humans-label": "Մարդ (ոչ բոտ)",
+       "rcfilters-filtergroup-significance": "Նշանակալիություն",
+       "rcfilters-filter-minor-label": "Չնչին խմբագրումներ",
+       "rcfilters-filter-major-label": "Սովորական խմբագրումներ",
+       "rcfilters-filtergroup-watchlist": "Հսկացանկի էջեր",
+       "rcfilters-filter-watchlist-watched-label": "Հսկացանկում",
+       "rcfilters-filter-watchlist-watchednew-label": "Հսկացանկի նոր փոփոխություններ",
+       "rcfilters-filter-watchlist-notwatched-label": "Հսկացանկից դուրս",
+       "rcfilters-filtergroup-changetype": "Փոփոխության տեսակ",
+       "rcfilters-filter-pageedits-label": "Էջի խմբագրումներ",
+       "rcfilters-filter-newpages-label": "Նոր էջեր",
+       "rcfilters-filter-logactions-label": "Մուտ գործած գործողություններ",
+       "rcfilters-filtergroup-lastRevision": "Ամենավերջին տարբերակ",
+       "rcfilters-filter-previousrevision-label": "Ոչ վերջին տարբերակ",
+       "rcfilters-view-tags": "Պիտակված խմբագրումներ",
+       "rcfilters-liveupdates-button": "Կենդանի թարմացումներ",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումները",
        "newpageletter": "Ն",
        "boteditletter": "բ",
        "number_of_watching_users_pageview": "[$1 հսկող {{PLURAL:$1|մասնակից|մասնակիցներին}}]",
-       "rc_categories": "Սահմանափակել կատեգորիաներով (բաժանեք «|» նշանով)",
-       "rc_categories_any": "Բոլոր",
        "rc-change-size-new": "$1 {{PLURAL:$1|բայթ|բայթ}} փոփոխությունից հետո",
        "newsectionsummary": "/* $1 */ Նոր բաժին",
        "rc-enhanced-expand": "Ցուցադրել մանրամասներ (պահանջում է ՋավաՍկրիպտ)",
        "show-big-image-size": "$1 × $2 պիքսել",
        "newimages": "Նոր նիշքերի սրահ",
        "imagelisttext": "Ստորև բերված է '''$1''' {{PLURAL:$1|նիշքի}} ցանկ՝ դասավորված ըստ $2։",
-       "newimages-legend": "Ֆիլտր",
+       "newimages-legend": "Զտիչ",
        "newimages-showbots": "Ցույց տալ բոտերի բեռնումները",
        "noimages": "Տեսնելու բան չկա։",
        "ilsubmit": "Որոնել",
        "tag-filter": "[[Special:Tags|Պիտակների]] զտիչ՝",
        "tag-filter-submit": "Ֆիլտրել",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Պիտակ}}]]: $2)",
+       "tags-title": "Պիտակներ",
        "tags-source-header": "Աղբյուր",
        "tags-actions-header": "Գործողություններ",
        "tags-edit": "խմբագրել",
        "tags-delete": "ջնջել",
        "tags-deactivate": "Ապաակտիվացնել",
+       "tags-hitcount": "$1 {{PLURAL:$1|փոփոխություն|փոփոխություններ}}",
        "tags-create-reason": "Պատճառ՝",
        "tags-create-submit": "Ստեղծել",
        "tags-delete-reason": "Պատճառ՝",
index fbd62a3..7703ba2 100644 (file)
        "nov": "nov",
        "dec": "dec",
        "january-date": "$1 de januario",
-       "february-date": "$1 de februario���",
+       "february-date": "$1 de februario",
        "march-date": "$1 de martio",
        "april-date": "$1 de april",
        "may-date": "$1 de maio",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[observate per $1 {{PLURAL:$1|usator|usatores}}]",
-       "rc_categories": "Limitar al categorias (separar con \"|\"):",
-       "rc_categories_any": "Qualcunque categoria seligite",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} post cambio",
        "newsectionsummary": "/* $1 */ nove section",
        "rc-enhanced-expand": "Revelar detalios",
        "lockmanager-fail-closelock": "Non poteva clauder le file de serratura pro \"$1\".",
        "lockmanager-fail-deletelock": "Non poteva deler le file de serratura pro \"$1\".",
        "lockmanager-fail-acquirelock": "Non poteva acquirer un serratura pro \"$1\".",
-       "lockmanager-fail-openlock": "Non poteva aperir le file de serratura pro \"$1\".",
+       "lockmanager-fail-openlock": "Non poteva aperir le file de serratura pro \"$1\". Assecura te que le directorio de incargamento es configurate correctemente e que tu servitor web ha le permission de scriber in ille directorio. Vide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory pro plus information.",
        "lockmanager-fail-releaselock": "Non poteva liberar le file de serratura pro \"$1\".",
        "lockmanager-fail-db-bucket": "Non poteva contactar sufficiente bases de datos de serratura in situla $1.",
        "lockmanager-fail-db-release": "Non poteva liberar le serraturas sur le base de datos $1.",
        "rollback-success": "Revocava modificationes per {{GENDER:$3|$1}};\nretornava al version per {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Modificationes de $1 revertite;\nultime version de $2 restaurate. [$3 Monstrar cambiamentos]",
        "sessionfailure-title": "Error de session",
-       "sessionfailure": "Il pare haber un problema con tu session de conto;\niste action ha essite cancellate como precaution contra le sequestramento de sessiones.\nPer favor preme \"retro\" e recarga le pagina de ubi tu ha venite, postea reprova.",
+       "sessionfailure": "Il pare haber un problema con tu session;\niste action ha essite cancellate como precaution contra le robamento de sessiones.\nPer favor, resubmitte le formulario.",
        "changecontentmodel": "Cambiar le modello de contento de un pagina",
        "changecontentmodel-legend": "Cambiar modello de contento",
        "changecontentmodel-title-label": "Titulo del pagina",
index 1d3b47c..62e0e97 100644 (file)
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|pemantau|pemantau}}]",
-       "rc_categories": "Batasi sampai kategori (dipisah dengan \"|\"):",
-       "rc_categories_any": "Setiap yang terpilih",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|bita}} setelah perubahan",
        "newsectionsummary": "/* $1 */ bagian baru",
index 6cb2c4f..4acbcf7 100644 (file)
@@ -14,7 +14,8 @@
                        "아라",
                        "Srdjan m",
                        "Macofe",
-                       "Stavanger7"
+                       "Stavanger7",
+                       "Fanjiayi"
                ]
        },
        "tog-underline": "Ultracatenun:",
        "october-date": "$1 octobre",
        "november-date": "$1 novembre",
        "december-date": "$1 decembre",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Categorie|Categories}}",
        "category_header": "Articules in categorie \"$1\"",
        "subcategories": "Subcategories",
        "newwindow": "(es apertet in un nov fenestre)",
        "cancel": "Anullar",
        "moredotdotdot": "Plu...",
-       "morenotlisted": "Ti liste ne es complet.",
+       "morenotlisted": "Forsan ti liste es íncomplet.",
        "mypage": "Págine",
        "mytalk": "Conversation",
        "anontalk": "Discussion",
        "badaccess-groups": "Ti action es limitat a usatores in {{PLURAL:$2|li gruppe|un del secuent gruppes:}} $1",
        "versionrequired": "Version $1 de MediaWiki exiget",
        "versionrequiredtext": "Version $1 de MediaWiki es exiget por usar ti págine.\nVider [[Special:Version|págine de version]].",
+       "ok": "OK",
        "retrievedfrom": "Cargat de «$1»",
        "youhavenewmessages": "Vu have $1 ($2).",
        "youhavenewmessagesfromusers": "Tu have $1 de {{PLURAL:$3|un altri usator|$3 usatores}} ($2).",
        "nstab-template": "Avise",
        "nstab-help": "Auxilie",
        "nstab-category": "Categorie",
+       "mainpage-nstab": "Principal págine",
        "nosuchaction": "Null tal action existe",
        "nosuchactiontext": "Li action indicat in li URL es ínvalid.\nForsan tu ha mistypat li URL o secuet un íncorrect ligament.\nForsan it indica un erra in li programma usat de {{SITENAME}}.",
        "nosuchspecialpage": "Null tal special págine",
        "userlogin-yourname-ph": "Vor nómine de usator",
        "createacct-another-username-ph": "Nómine del usator",
        "yourpassword": "Parol-clave:",
+       "userlogin-yourpassword": "Parol-clave",
        "yourpasswordagain": "Parol-clave denov:",
        "userlogin-signwithsecure": "Usar un secur conexion",
        "yourdomainname": "Tui dominia:",
        "createaccount-title": "Creation de conto por {{SITENAME}}",
        "loginlanguagelabel": "Lingue: $1",
        "suspicious-userlogout": "Tui petition por surtir esset desaprobat pro que probabilmen esset inviat per un navigator ruptet o servitor de autorisation che caching.",
+       "pt-login": "Aperter session",
        "pt-login-button": "Aperter session",
        "pt-createaccount": "Crear un conto",
+       "pt-userlogout": "Surtir",
        "changepassword": "Modificar passa-parol",
        "oldpassword": "Anteyan passa-parol:",
        "newpassword": "Nov passa-parol:",
        "template-protected": "(protectet)",
        "template-semiprotected": "(medie-gardat)",
        "hiddencategories": "Ti págine es un membre de {{PLURAL:$1|1 categorie ocultat|$1 categories ocultat}}:",
+       "permissionserrors": "Tu ne have sufficent jures",
        "permissionserrorstext-withaction": "Vu ne have permission por $2, por li sequent {{PLURAL:$1|motive|motives}}:",
        "recreate-moveddeleted-warn": "'''Advertiment: Vu es recreant un págine que esset anteriorimen deletet.'''\n\nVu deve considerar ca it es convenent por continuar redactant ti págine.\nLi deletion e diarium de movement por li págine es sub li condition ci por convenience:",
        "moveddeleted-notice": "Ti págine ha esset deletet.\nLi deletion e diarium de movement por li págine es sub li condition in infra por referentie.",
        "rclistfrom": "Monstrar li nov modificationes desde $3 $2",
        "rcshowhideminor": "$1 redactiones minori",
        "rcshowhideminor-show": "Monstrar",
+       "rcshowhideminor-hide": "Ocultar",
        "rcshowhidebots": "$1 machines",
+       "rcshowhidebots-show": "Monstrar",
        "rcshowhidebots-hide": "Ocultar",
        "rcshowhideliu": "$1 usatores registrat",
+       "rcshowhideliu-show": "Monstrar",
        "rcshowhideliu-hide": "Ocultar",
        "rcshowhideanons": "$1 usatores anonim",
        "rcshowhideanons-show": "Monstrar",
+       "rcshowhideanons-hide": "Ocultar",
        "rcshowhidepatr": "$1 redactiones vigilat",
        "rcshowhidepatr-hide": "Ocultar",
        "rcshowhidemine": "$1 mi redactiones",
        "rcshowhidemine-show": "Monstrar",
+       "rcshowhidemine-hide": "Ocultar",
        "rclinks": "Monstrar li $1 ultim modificationes fat durante li $2 ultim dies",
        "diff": "dif",
        "hist": "hist",
        "whatlinkshere-hideredirs": "$1 redirectiones",
        "whatlinkshere-hidetrans": "$1 transclusiones",
        "whatlinkshere-hidelinks": "$1 catenunes",
-       "whatlinkshere-hideimages": "$1 referenties a picturas.",
+       "whatlinkshere-hideimages": "$1 pictura links",
        "whatlinkshere-filters": "Filtres",
        "blockip": "Blocar usator",
        "ipbreason": "Motive:",
        "tooltip-pt-login": "Tu es incorrageat crear un conto, ma to ne es un deventie.",
        "tooltip-pt-logout": "Surtir",
        "tooltip-ca-talk": "Discussion pri li articul.",
-       "tooltip-ca-edit": "Redacter ti págine. Ples usar li buton de prevision antequam conservar.",
+       "tooltip-ca-edit": "Redacter ti-ci págine",
        "tooltip-ca-addsection": "Comensar un nov section",
        "tooltip-ca-viewsource": "Ti págine es protectet. Ma tu posse vider e copiar su fonte.",
        "tooltip-ca-history": "Passat versiones de ti págine",
        "tooltip-preferences-save": "Conservar preferenties",
        "tooltip-summary": "Ples intrar un curt resummation.",
        "simpleantispam-label": "Control anti-spam.\n<strong>Ne</strong> plena to ci!",
+       "pageinfo-article-id": "Págine ID",
        "pageinfo-toolboxlink": "Information pri li págine",
+       "pageinfo-contentpage-yes": "Yes",
        "previousdiff": "← Redaction anteriori",
        "nextdiff": "Proxim redaction →",
        "thumbsize": "Mesura de miniatura:",
        "version-software": "Software installat",
        "version-software-product": "Producte",
        "version-software-version": "Version",
+       "redirect-submit": "Ear",
+       "redirect-user": "Usator ID",
+       "redirect-page": "Págine ID",
+       "redirect-file": "File-nómine",
        "specialpages": "Special págines",
        "specialpages-group-maintenance": "Raportes de conservation",
        "specialpages-group-other": "Altri págines special",
        "tags-display-header": "Aspecte in listes de change",
        "tags-description-header": "Descrition complet de signification",
        "tags-hitcount-header": "Changes nómiat",
+       "tags-active-yes": "Yes",
+       "tags-active-no": "No",
        "tags-edit": "redacter",
        "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
        "logentry-delete-delete": "$1 ha removet li págine $3",
index 59306c6..d739147 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ọ'bànifé|ọ'bànifé}} ne lé anya]",
-       "rc_categories_any": "Nkówụlà",
        "newsectionsummary": "/* $1 */ nkeji ohúrù",
        "rc-enhanced-expand": "Zi ihe di ime (Í gí nwere JavaScript)",
        "rc-enhanced-hide": "Zonari ihe di ime",
index 78e20ff..abed7eb 100644 (file)
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 nga agbuybuya {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}}]",
-       "rc_categories": "Patingga dagiti kategoria (pagsinaen iti \"|\"):",
-       "rc_categories_any": "Ti ania man a napili",
        "rc-change-size-new": "$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panagsukat",
        "newsectionsummary": "/* $1 */ baro a seksion",
        "rc-enhanced-expand": "Ipakita dagiti salaysay",
index f4fe4cd..3e871a5 100644 (file)
        "minoreditletter": "зI",
        "newpageletter": "К",
        "boteditletter": "б",
-       "rc_categories_any": "МоллагIа яр хержа йолчарна юкъера",
        "rc-change-size-new": "Хувцам баьнначул тӀехьагIа бола боарам: $1 {{PLURAL:$1|байт}}",
        "rc-enhanced-expand": "Хьахьокха ма дарра",
        "rc-enhanced-hide": "Къайладаккха ма дарра дар",
index 595ae1f..648c280 100644 (file)
        "cannotcreateaccount-text": "Krear uzerokonto ne posibligas en ita wiki.",
        "yourdomainname": "Vua domano:",
        "password-change-forbidden": "Vu ne darfas chanjar pasovorti en ita wiki.",
+       "externaldberror": "Sive eventis eroro en la bazo di dati dum l'autentiko, sive vu ne permisesas aktualigar vua extera konto.",
        "login": "Enirar",
        "login-security": "Kontrolez vua identeso.",
        "nav-login-createaccount": "Enirar / Krear konto",
        "createacct-email-ph": "Prizentez vua e-postal adreso",
        "createacct-another-email-ph": "Prizentez vua e-postal adreso",
        "createaccountmail": "Uzez provizora pasovorto, ed ad adresizez ol a la korespondanta e-posto",
+       "createaccountmail-help": "Povas uzesar por krear konto por altra persono, sen lernar la pasovorto.",
        "createacct-realname": "Vera nomo (fakultativa)",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Pro quo tu kreas nova konto",
+       "createacct-reason-help": "Mesajo videbla dum la 'log' por krear konto",
        "createacct-submit": "Kreez konto",
        "createacct-another-submit": "Krear konto",
        "createacct-continue-submit": "Durez krear konto",
        "login-migrated-generic": "Vua konto esas migrata, e vua uzeronomo ne plus existas che ita wikio.",
        "loginlanguagelabel": "Linguo: $1",
        "suspicious-userlogout": "Vua demando pri ekiro ('log out') refuzesis, pro ke ol semblas sendesir de retnavigilo krevita, o de 'proxy' antee konservita.",
+       "createacct-another-realname-tip": "Uzar vera nomo esas fakultativa.\nSe vu deziras furnisar ol, ol uzesos por atribuar la verko a lua autoro.",
        "pt-login": "Enirar",
        "pt-login-button": "Enirar",
        "pt-login-continue-button": "Durez enirar",
        "changepassword-success": "Vua chanjo di pasovorto sucesis!",
        "changepassword-throttled": "Vu probis enirar tro multafoye.\nVoluntez vartar $1 ante riprobar.",
        "botpasswords": "Robotala pasovorti",
+       "botpasswords-summary": "<em>Bot passwords</em> allow access to a user account via the API without using the account's main login credentials. The user rights available when logged in with a bot password may be restricted.\n\nIf you don't know why you might want to do this, you should probably not do it. No one should ever ask you to generate one of these and give it to them.",
        "botpasswords-disabled": "Ne povas uzesar \"bot\"-pasovorti",
        "botpasswords-no-central-id": "Por uzar \"bot\"-pasovorti, vu mustas havar centraligata konto",
        "botpasswords-existing": "\"bot\"-pasovorti existanta",
        "botpasswords-label-grants": "Uzebla grantaji:",
        "botpasswords-label-grants-column": "Permisita",
        "botpasswords-bad-appid": "La nomo \"$1\" por la bot-programo esas nevalida.",
+       "botpasswords-created-title": "Kreita pasovorto por la 'bot'",
+       "botpasswords-created-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.",
        "botpasswords-updated-title": "La pasovorto dil 'bot' aktualigesis",
+       "botpasswords-updated-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.",
+       "botpasswords-deleted-title": "La pasovorto por la 'bot' efacesis",
+       "resetpass_forbidden": "La pasovorti ne povas chanjesar",
+       "resetpass_forbidden-reason": "Pasovorti ne povas chanjesar: $1",
+       "resetpass-no-info": "Vu mustas enirar la konto por acesar ita pagino direte.",
        "resetpass-submit-loggedin": "Chanjar pasovorto",
        "resetpass-submit-cancel": "Anular",
        "resetpass-wrong-oldpass": "Nevalida provizora od aktuala pasovorto.\nForsan vu ja chanjis vua pasovorto o demandis nova provizora pasovorto.",
        "resetpass-recycled": "Voluntez chanjar vua pasovorto ad ulo diferanta de vua aktuala pasovorto.",
        "resetpass-temp-emailed": "Vu eniris uzante provizora pasovorto.\nPor parkompletigar enirado, vu mustas krear nova pasovorto hike:",
        "resetpass-temp-password": "Provizora pasovorto:",
+       "resetpass-abort-generic": "La modifiko dil pasovorto interuptesis per ula 'extension'.",
+       "resetpass-expired": "Vua pasovorto perdis la valideso. Voluntez krear nova pasovorto por facar 'log in'.",
        "passwordreset": "Sendez nova pasovorto per e-posto",
        "passwordreset-text-one": "Garnisez ica formulario por recevar provizora pasovorto per vua e-posto.",
        "passwordreset-username": "Uzantonomo:",
        "passwordreset-emailtext-ip": "Ulu (probable vu, de la IP-adresO $1) demandis la remplaso di la pasovorto por {{SITENAME}} ($4). La sequanta {{PLURAL:$3|konto|konti}} esas asociita kun ta adreso di e-posto:\n\n$2\n\nIca tempala {{PLURAL:$3| pasovorto|pasovorti}} perdos la valideso pos {{PLURAL:$5|un dio|$5 dii}}.\nTu mustas facar 'log in' e selektar nova pasovorto nemediate. Se altra persono facis ica demando, o se vu rimemoris l'antea pasovorto e ne pluse bezonas modifikor ol, vu povas ignorar ica mesajo e durar l'uzo dil antea pasovorto.",
        "passwordreset-emailelement": "Uzantonomo:\n$1\n\nProvizora pasovorto:\n$2",
        "passwordreset-emailsentemail": "Se ica e-posto esas asociita kun vua konto, do la nova pasovorto sendesos a vu per e-posto.",
+       "passwordreset-nocaller": "Ula demandero mustas furnisesar",
+       "passwordreset-nosuchcaller": "La demandero ne existas: $1",
        "passwordreset-invalidemail": "Ne-valida e-posto-adreso",
        "passwordreset-nodata": "Nek uzeronomo nek e-posto-adreso esis provizita",
        "changeemail": "Chanjar od efacar e-postal adreso",
        "blankarticle": "<strong>Averto:</strong> La pagino vu kreas es vakua.\nSe vu ri-selektos \"$1\", la pagino kreesos sen irga kontenajo.",
        "anoneditwarning": "<strong>Averto:</strong> Vu ne eniris.\nVua IP-adreso esos videbla publike se vu redaktos. Se vu <strong>[$1 enirus]</strong> od <strong>[$2 kreus konto]</strong>, vua redakti atribuesos a vua uzeronomo, kune kun altra bonaji.",
        "anonpreviewwarning": "<em>Vu ne eniris. Konservar chanji registragos vua IP-adreso en la redakto-historio di ta pagino.</em>",
-       "missingcommenttext": "Voluntez, skribez komento sube.",
+       "missingcommenttext": "Voluntez skribar komento.",
+       "missingcommentheader": "<strong>Atencez:</strong> Vu ne furnisis titulo por ica komento.\nSe vu itere kliktos \"$1\", vua editado salveskos sen ula titulo.",
        "summary-preview": "Previdado di la rezumo:",
        "subject-preview": "Previdado di la temo:",
        "previewerrortext": "Eventis eroro kande on probis krear previdado pri vua modifikuri.",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "r",
-       "rc_categories_any": "Irga selektita",
        "rc-change-size-new": "$1 {{PLURAL:$1|bicoko|bicoki}} pos la modifiki",
        "newsectionsummary": "/* $1 */ nova seciono",
        "rc-enhanced-expand": "Montrez detali",
index f0d3cd3..3a54234 100644 (file)
@@ -63,6 +63,7 @@
        "tog-watchlisthideminor": "Ekki sýna minniháttar breytingar á vaktlistanum",
        "tog-watchlisthideliu": "Ekki sýna breytingar innskráðra notenda á vaktlistanum",
        "tog-watchlistreloadautomatically": "Endurhlaða vaktlista sjálfkrafa þegar síu er breytt (krefst JavaScript)",
+       "tog-watchlistunwatchlinks": "Bæta við beinum vakta/ekki vakta tenglum við færslur á vöktunarlista (krefst JavaScript til að víxla af/á)",
        "tog-watchlisthideanons": "Ekki sýna breytingar óþekktra notenda á vaktlistanum",
        "tog-watchlisthidepatrolled": "Fela yfirfarnar breytingar í vaktlistanum",
        "tog-watchlisthidecategorization": "Fela flokkun á síðum",
        "noindex-category": "Óraðaðar skrár",
        "broken-file-category": "Síður með brotna skráartengla",
        "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Um",
        "article": "Efnissíða",
        "newwindow": "(opnast í nýjum glugga)",
        "tagline": "Úr {{SITENAME}}",
        "help": "Hjálp",
        "search": "Leit",
+       "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": "Leita",
        "go": "Áfram",
        "searcharticle": "Áfram",
-       "history": "Breytingaskrá",
+       "history": "Breytingaskrá síðu",
        "history_short": "Breytingaskrá",
-       "history_small": "skrá",
+       "history_small": "breytingaskrá",
        "updatedmarker": "uppfært frá síðustu heimsókn minni",
        "printableversion": "Prentvæn útgáfa",
        "permalink": "Varanlegur tengill",
        "missingarticle-rev": "(breyting#: $1)",
        "missingarticle-diff": "(Munur: $1, $2)",
        "readonly_lag": "Gagnagrunninum hefur verið læst sjálfkrafa á meðan undirvefþjónarnir reyna að hafa í við aðalvefþjóninn",
+       "nonwrite-api-promise-error": "HTTP-hausinn 'Promise-Non-Write-API-Action' var sendur en beiðnin var til API-skrifeiningar.",
        "internalerror": "Kerfisvilla",
        "internalerror_info": "Innri villa: $1",
        "internalerror-fatal-exception": "Banvæn undantekning af gerðinni \"$1\"",
        "badtitletext": "Umbeðinn síðutitill er ógildur.",
        "title-invalid-empty": "Umbeðinn síðutitill er auður eða inniheldur aðeins heiti nafnrýmis.",
        "title-invalid-utf8": "Umbeðinn síðutitill inniheldur ógilda UTF-8 runu.",
+       "title-invalid-interwiki": "Umbeðinn síðutitill inniheldur interwiki-tengil sem ekki er hægt að nota í titlum.",
+       "title-invalid-talk-namespace": "Umbeðinn síðutitill vísar í spjallsíðu sem ekki getur verið til.",
        "title-invalid-characters": "Umbeðinn síðutitill inniheldur ógilda stafi: \"$1\".",
+       "title-invalid-relative": "Titillinn er með afstæða slóð. Afstæðir síðutitlar (./, ../) eru ekki gildir, því þeir verða oft ekki tiltækir í meðhöndlun í vöfrum notenda.",
        "title-invalid-magic-tilde": "Umbeðinn síðutitill inniheldur ógilda tildurunu (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Umbeðinn síðutitill er of langur. Hann má ekki vera lengri en $1 {{PLURAL:$1|bæti}} í UTF-8 stafatöflu.",
        "title-invalid-leading-colon": "Umbeðinn síðutitill inniheldur ógildan tvípunkt í byrjun.",
        "cannotloginnow-title": "Get ekki skráð inn núna",
        "cannotloginnow-text": "Innskráning er ekki möguleg þegar verið er að nota $1.",
        "cannotcreateaccount-title": "Ekki hægt að búa til aðganga",
+       "cannotcreateaccount-text": "Bein stofnun aðgangs er ekki virk á þessu wiki.",
        "yourdomainname": "Þitt lén:",
        "password-change-forbidden": "Þú getur ekki breytt lykilorðum á þessum wiki.",
        "externaldberror": "Uppfærsla mistókst. Annaðhvort varð villa í gagnasafninu eða að þér sé óheimilt að uppfæra aðra aðganga.",
        "createacct-email-ph": "Settu inn netfangið þitt",
        "createacct-another-email-ph": "Skrifaðu netfang",
        "createaccountmail": "Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan",
+       "createaccountmail-help": "Er hægt að nota til að útbúa aðgang fyrir einhvern annann án þess að sjá lykilorðið.",
        "createacct-realname": "Raunverulegt nafn (valfrjálst)",
        "createacct-reason": "Ástæða",
        "createacct-reason-ph": "Afhverju ertu að búa til annan aðgang",
+       "createacct-reason-help": "Skilaboð sem birtast í atvikaskrá við gerð notandaaðgangs",
        "createacct-submit": "Búa til aðganginn",
        "createacct-another-submit": "Stofna aðgang",
        "createacct-continue-submit": "Halda áfram við að búa til aðgang",
        "nocookiesnew": "Notandaaðgangur var búin til, en þú ert ekki skráð(ur) inn.\n{{SITENAME}} notar vefkökur til að skrá inn notendur.\nÞú hefur lokað fyrir vefkökur.\nEndilega opnaðu fyrir þær, skráðu þig svo inn með notandanafni og lykilorði.",
        "nocookieslogin": "{{SITENAME}} notar vefkökur til innskráningar. Vafrinn þinn er ekki að taka á móti þeim. Virkjaðu móttöku á vefkökum í vafranum þínum til að geta skráð þig inn.",
        "nocookiesfornew": "Notandaaðgangurinn var ekki stofnaður, því ekki var hægt að staðfesta uppruna beiðnarinnar.\nGakktu úr skugga um að vefkökur séu virkar, endurlestu þessa síðu og reyndu aftur.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Það tókst að útbúa notandaaðganginn en hins vegar var ekki hægt að skrá þig sjálfkrafa inn. Farðu áfram á [[Special:UserLogin|handvirka innskráningu]].",
        "noname": "Þú hefur ekki tilgreint gilt notandanafn.",
        "loginsuccesstitle": "Innskráning tókst",
        "loginsuccess": "'''Þú ert nú innskráð(ur) á {{SITENAME}} sem „$1“.'''",
        "pt-login-button": "Skrá inn",
        "pt-login-continue-button": "Halda áfram við að skrá þig inn",
        "pt-createaccount": "Stofna aðgang",
-       "pt-userlogout": "Útskrá",
+       "pt-userlogout": "Útskráning",
        "php-mail-error-unknown": "Óþekkt villa í PHP mail() aðgerð.",
        "user-mail-no-addy": "Gat ekki sent tölvupóst því ekkert tölvupóstfang fannst.",
        "user-mail-no-body": "Reyndi að senda tölvupóst með engu eða verulega stuttu meginmáli.",
        "resetpass_submit": "Skrifaðu aðgangsorðið og skráðu þig inn",
        "changepassword-success": "Það tókst að breyta lykilorðinu þínu!",
        "changepassword-throttled": "Þú hefur gert of margar tilraunir til innskráningar að undanförnu.\nBíddu í $1 áður en þú reynir aftur.",
-       "botpasswords": "Lykilorð róbóta",
-       "botpasswords-label-appid": "Nafn vélmennis:",
+       "botpasswords": "Lykilorð vélmenna",
+       "botpasswords-disabled": "Lykilorð vélmenna eru óvirk.",
+       "botpasswords-existing": "Fyrirliggjandi lykilorð vélmenna",
+       "botpasswords-createnew": "Búa til nýtt lykilorð vélmennis",
+       "botpasswords-editexisting": "Breyta fyrirliggjandi lykilorði vélmennis",
+       "botpasswords-label-appid": "Heiti vélmennis:",
        "botpasswords-label-create": "Búa til",
        "botpasswords-label-update": "Uppfæra",
        "botpasswords-label-cancel": "Hætta við",
        "botpasswords-label-delete": "Eyða",
        "botpasswords-label-resetpassword": "Endurstilla lykilorðið",
        "botpasswords-bad-appid": "Vélmennanafnið „$1“ er ógilt.",
+       "botpasswords-created-title": "Vélmennalykilorð var búið til",
+       "botpasswords-updated-title": "Vélmennalykilorð var uppfært",
+       "botpasswords-deleted-title": "Vélmennalykilorði var eytt",
        "resetpass_forbidden": "Ekki er hægt að breyta lykilorðum",
        "resetpass_forbidden-reason": "Ekki er hægt að breyta lykilorðum: $1",
        "resetpass-no-info": "Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.",
        "resetpass-submit-loggedin": "Breyta lykilorði",
        "resetpass-submit-cancel": "Hætta við",
        "resetpass-wrong-oldpass": "Vitlaust bráðabirgða- eða núverandi lykilorð.\nÞú gætir þegar verið búin/n að breyta lykilorðinu eða sótt um nýtt bráðabirgðalykilorð",
+       "resetpass-recycled": "Settu lykilorðið þitt til að vera eitthvað annað en lykilorðið sem þú ert núna með.",
        "resetpass-temp-emailed": "Þú skráðir þig inn með bráðabirgðakóða úr tölvupósti.\nTil að klára að skrá þig inn, verður þú að velja nýtt lykilorð hér:",
        "resetpass-temp-password": "Bráðabirgðalykilorð:",
        "resetpass-abort-generic": "Breytingum á lykilorðum hefur verið hætt með viðbót.",
        "resetpass-expired": "Lykilorðið þitt er útrunnið. Skráðu nýtt lykilorð til að skrá þig inn.",
+       "resetpass-expired-soft": "Lykilorðið þitt er útrunnið og þarf að endurstilla það. Veldu núna nýtt lykilorð, eða smelltu á \"{{int:authprovider-resetpass-skip-label}}\" til að endurstilla það síðar.",
+       "resetpass-validity-soft": "Lykilorðið þitt er ekki lengur gilt: $1\n\nVeldu núna nýtt lykilorð, eða smelltu á \"{{int:authprovider-resetpass-skip-label}}\" til að endurstilla það síðar.",
        "passwordreset": "Endurstilla lykilorð",
        "passwordreset-text-one": "Útfylltu þetta eyðublað til þess að endursetja lykilorðið.",
+       "passwordreset-text-many": "{{PLURAL:$1|Fylltu í einn af reitunum hér fyrir neðan til að fá tölvupóst með bráðabirgðalykilorði.}}",
        "passwordreset-disabled": "Lokað hefur verið fyrir að endurstilla lykilorð á þessum wiki.",
        "passwordreset-emaildisabled": "Tölvupósteiginleikar hafa verið gerðir óvirkir á þessum wiki.",
        "passwordreset-username": "Notandanafn:",
        "passwordreset-emailsentemail": "Ef þetta netfang er skráð fyrir aðganginum þínum þá hefur töluvpóstur verið sendur til að endursetja lykilorðið.",
        "passwordreset-emailsentusername": "Ef eitthvað netfang er skráð fyrir aðganginum þínum, þá mun verða sendur töluvpóstur til að endursetja lykilorðið.",
        "passwordreset-invalidemail": "Ógilt tölvupóstfang",
+       "passwordreset-nodata": "Hvorki notandanafn né tölvupóstfang var gefið upp",
        "changeemail": "Breyta eða fjarlægja netfang",
        "changeemail-header": "Fylltu út þetta eyðublað til að breyta netfanginu þínu. Ef þú vilt fjarlægja tengingu allra netfanga frá aðganginum þínum skildu þá netfangs reitinn eftir tóman.",
        "changeemail-no-info": "Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.",
        "changeemail-oldemail": "Núverandi netfang:",
        "changeemail-newemail": "Nýtt netfang:",
+       "changeemail-newemail-help": "Þessi reitur ætti að vera auður ef þú vilt fjarlægja tölvupóstfangið þitt. Þú munt þá ekki geta endurstillt gleymt lykilorð og munt ekki fá tilkynningu í tölvupósti ef tölvupóstfangið er fjarlægt.",
        "changeemail-none": "(ekkert)",
        "changeemail-password": "{{SITENAME}} lykilorðið þitt:",
        "changeemail-submit": "Breyta netfangi",
        "missingcommentheader": "<strong>Áminning:</strong> Þú hefur ekki gefið upp umræðuefni.\nEf þú smellir á \"$1\" aftur, verður breyting þín vistuð án þess.",
        "summary-preview": "Forskoða breytingarágrip:",
        "subject-preview": "Forskoðun viðfangsefnis:",
+       "previewerrortext": "Óvænt villa kom upp þegar reynt var að forskoða breytingarnar þínar.",
        "blockedtitle": "Notandi er bannaður",
        "blockedtext": "'''Notandanafn þitt eða vistfang hefur verið bannað.'''\n\nBannið var sett af $1.\nÁstæðan er eftirfarandi: ''$2''.\n\n* Bannið hófst: $8\n* Banninu lýkur: $6\n* Sá sem banna átti: $7\n\nÞú getur haft samband við $1 eða annan [[{{MediaWiki:Grouppage-sysop}}|stjórnanda]] til að ræða bannið.\nÞú getur ekki notað „Senda þessum notanda tölvupóst“ aðgerðina nema gilt netfang sé skráð í [[Special:Preferences|kjörstillingum þínum]] og að þér hafi ekki verið óheimilað það.\nNúverandi vistfang þitt er $3, og bannnúmerið er #$5.\nHafðu með allar þessar upplýsingar hér fyrir ofan í fyrirspurnum þínum.",
        "autoblockedtext": "Vistfang þitt hefur verið sjálfvirkt bannað því það var notað af öðrum notanda, sem var bannaður af $1.\nÁstæðan er eftirfarandi:\n\n:''$2''\n\n* Bannið hófst: $8\n* Banninu lýkur: $6\n* Sá sem banna átti: $7\n\nÞú getur haft samband við $1 eða annan [[{{MediaWiki:Grouppage-sysop}}|stjórnanda]] til að ræða bannið.\n\nAthugaðu að þú getur ekki notað „Senda þessum notanda tölvupóst“ aðgerðina nema gilt netfang sé skráð í [[Special:Preferences|kjörstillingum þínum]] og að þér hafi ekki verið óheimilað það.\n\nNúverandi vistfang þitt er $3, og bannnúmerið er #$5.\nHafðu með allar þessar upplýsingar hér fyrir ofan í fyrirspurnum þínum.",
+       "systemblockedtext": "Notandanafnið þitt eða IP-vistfangið hafa verið útilokuð sjálfvirkt af MediaWiki.\nUppgefin ástæða er:\n\n:<em>$2</em>\n\n* Upphaf útilokunar: $8\n* Útilokun rennur út: $6\n* Sá sem átti að útiloka: $7\n\nNúverandi IP-vistfang þitt er$3.\nHafðu allar þessar upplýsingar með í öllum þeim fyrirspurnum sem þú gætir gert vegna þessa.",
        "blockednoreason": "engin ástæða gefin",
        "whitelistedittext": "Þú þarft að $1 þig til að breyta síðum.",
        "confirmedittext": "Þú verður að staðfesta netfangið þitt áður en þú getur breytt síðum. Stilltu og staðfestu netfangið þitt í gegnum [[Special:Preferences|kjörstillingarnar]].",
        "yourtext": "Þinn texti",
        "storedversion": "Geymd útgáfa",
        "editingold": "'''ATH: Þú ert að breyta gamalli útgáfu þessarar síðu og munu allar breytingar sem gerðar hafa verið á henni frá þeirri útgáfu vera fjarlægðar ef þú vistar.'''",
+       "unicode-support-fail": "Það lítur út fyrir að vafrinn þinn styðji ekki Unicode. Það er nauðsynlegt til að geta breytt síðum, þannig að breytingarnar þínar voru ekki vistaðar.",
        "yourdiff": "Mismunur",
        "copyrightwarning": "Vinsamlegast athugaðu að öll framlög á {{SITENAME}} eru álitin leyfisbundin samkvæmt $2 (sjá $1 fyrir frekari upplýsingar).  Ef þú vilt ekki að skrif þín falli undir þetta leyfi og öllum verði frjálst að breyta og endurútgefa efnið samkvæmt því skaltu ekki leggja þau fram hér.<br />\nÞú berð ábyrgð á framlögum þínum, þau verða að vera þín skrif eða afrit texta í almannaeigu eða sambærilegs frjáls texta.\n<strong>AFRITIРEKKI HÖFUNDARRÉTTARVARIN VERK Á ÞESSA SÍÐU ÁN LEYFIS</strong>",
        "copyrightwarning2": "Vinsamlegast athugið að aðrir notendur geta breytt eða fjarlægt öll framlög til {{SITENAME}}.\nEf þú vilt ekki að textanum verði breytt skaltu ekki senda hann inn hér.<br />\nÞú lofar okkur einnig að þú hafir skrifað þetta sjálfur, að efnið sé í almannaeigu eða að það heyri undir frjálst leyfi. (sjá $1).\n<strong>EKKI SENDA INN HÖFUNDARRÉTTARVARIРEFNI ÁN LEYFIS RÉTTHAFA!</strong>",
        "postedit-confirmation-created": "Síðan hefur verið búin til.",
        "postedit-confirmation-restored": "Síðan hefur verið endurheimt.",
        "postedit-confirmation-saved": "Breytingin þín hefur verið vistuð.",
+       "postedit-confirmation-published": "Breytingin þín var gefin út.",
        "edit-already-exists": "Gat ekki skapað nýja síðu.\nHún er nú þegar til.",
        "defaultmessagetext": "Sjálfgefinn texti skilaboða",
        "content-failed-to-parse": "Gat ekki þáttað $2 efni samkvæmt $1 líkani: $3",
        "content-model-text": "hreinn texti",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "Tómur hlutur",
        "content-json-empty-array": "Tómt fylki",
        "duplicate-args-category": "Síður sem nota tvíteknar breytur við ítengingu sniðmáts",
        "history-feed-description": "Breytingaskrá fyrir þessa síðu á wiki-síðunni",
        "history-feed-item-nocomment": "$1 á $2",
        "history-feed-empty": "Síðan sem þú leitaðir að er ekki til.\nMöglegt er að henni hafi verið eytt út af þessari wiki síðu, eða endurnefnd.\nPrófaðu [[Special:Search|að leita á þessari wiki síðu]] að svipuðum síðum.",
+       "history-edit-tags": "Breyta merkjum á völdum breytingaútgáfum",
        "rev-deleted-comment": "(breytingarágrip fjarlægt)",
        "rev-deleted-user": "(notandanafn fjarlægt)",
        "rev-deleted-event": "(smáatriði atriðs fjarlægt)",
        "mergehistory-header": "Þessi síða gerir þér kleift að sameina breytingaskrá tveggja síðna.\nSjáðu til þess að þessi breyting sameini breytingaskrárnar samfellt.",
        "mergehistory-box": "Sameina breytingaskrár tveggja síðna:",
        "mergehistory-from": "Upprunaleg síða:",
-       "mergehistory-into": "Áætlunarsíða:",
+       "mergehistory-into": "Marksíða:",
        "mergehistory-list": "Breytingaskrár sem hægt er að sameina",
        "mergehistory-merge": "Eftirtaldar útgáfur [[:$1]] má sameina [[:$2]].\nNotaðu valreitadálkinn til þess að sameina aðeins þær útgáfur sem stofnaðar voru fyrir uppgefið tímamark.\nAthugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.",
        "mergehistory-go": "Sýna breytingar sem hægt er að sameina",
        "mergehistory-fail": "Gat ekki sameinað breytingaskrár. Athugaðu vel síðuna og tímabreyturnar.",
        "mergehistory-fail-bad-timestamp": "Tímamerkið er ógilt.",
        "mergehistory-fail-invalid-source": "Frumsíðan er ógild.",
+       "mergehistory-fail-invalid-dest": "Marksíða er ógild.",
+       "mergehistory-fail-self-merge": "Upprunasíðan og marksíðan eru sú sama.",
        "mergehistory-no-source": "Upprunasíðan $1 er ekki til.",
        "mergehistory-no-destination": "Marksíðan $1 er ekki til.",
        "mergehistory-invalid-source": "Upprunasíðan verður að hafa gildan titil.",
        "mergehistory-comment": "Sameinaði [[:$1]] inn í [[:$2]]: $3",
        "mergehistory-same-destination": "Upprunasíðan og marksíðan mega ekki vera sú sama",
        "mergehistory-reason": "Ástæða:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Sameiningar skrá",
        "revertmerge": "Taka aftur sameiningu",
        "mergelogpagetext": "Þetta er skrá yfir síðustu sameiningar einnar síðu við aðra.",
        "diff-multi-sameuser": "($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá sama notandanum)",
        "diff-multi-otherusers": "($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá $2 {{PLURAL:$2|notanda|notendum}})",
        "diff-multi-manyusers": "($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá fleiri en $2 {{PLURAL:$2|notanda|notendum}}.)",
+       "diff-paragraph-moved-tonew": "Málsgrein var færð. Smelltu til að hoppa á nýju staðsetninguna.",
+       "diff-paragraph-moved-toold": "Málsgrein var færð. Smelltu til að hoppa á gömlu staðsetninguna.",
        "difference-missing-revision": "$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.\n\nÞetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.\nFrekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].",
        "searchresults": "Leitarniðurstöður",
        "searchresults-title": "Leitarniðurstöður fyrir „$1“",
        "timezoneregion-pacific": "Kyrrahaf",
        "allowemail": "Leyfa öðrum notendum að senda mér tölvupóst",
        "email-allow-new-users-label": "Leyfa tölvupóst frá nýskráðum notendum",
+       "email-blacklist-label": "Banna þessum notendum að senda mér tölvupóst:",
        "prefs-searchoptions": "Leit",
        "prefs-namespaces": "Nafnrými",
        "default": "sjálfgefið",
        "prefs-diffs": "Breytingar",
        "prefs-help-prefershttps": "Þessi stilling tekur gildi í næsta skiptið sem þú skráir þig inn.",
        "prefswarning-warning": "Þú hefur gert breytingar á kjörstillingum þínum sem ekki er búið að vista.\nEf þú ferð af þessari síðu án þess að smella á \"$1\" verða kjörstillingar þínar ekki uppfærðar.",
+       "prefs-tabs-navigation-hint": "Ábending: Þú getur notað vinstri og hægri örvalyklana til að flakka á milli flipa í flipalistanum.",
        "userrights": "Notandaréttindi",
        "userrights-lookup-user": "Velja notanda",
        "userrights-user-editname": "Skráðu notandanafn:",
        "editusergroup": "Hlaða inn notanda hópum",
        "editinguser": "Breyti réttindum {{GENDER:$1|notandans}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Skoða notandaréttindi {{GENDER:$1|notandans}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Breyta hópum {{GENDER:$1|notanda}}",
        "userrights-viewusergroup": "Skoða hópa {{GENDER:$1|notanda}}",
        "saveusergroups": "Vista {{GENDER:$1|notanda}} hópa",
        "userrights-changeable-col": "Hópar sem þú getur breytt",
        "userrights-unchangeable-col": "Hópar sem þú getur ekki breytt",
        "userrights-irreversible-marker": "$1*",
+       "userrights-no-shorten-expiry-marker": "$1#",
        "userrights-expiry-current": "Rennur út $1",
        "userrights-expiry-none": "Rennur ekki út",
        "userrights-expiry": "Rennur út:",
        "right-sendemail": "Senda tölvupóst til annara notenda",
        "right-managechangetags": "Búa til og (af)virkja [[Special:Tags|merki]] úr gagnagrunni",
        "right-applychangetags": "Virkja [[Special:Tags|merki]] ásamt öðrum breytingum",
+       "grant-group-page-interaction": "Gagnvirkni með síður",
+       "grant-group-file-interaction": "Gagnvirkni með gögn",
+       "grant-group-watchlist-interaction": "Gagnvirkni með vaktlistann þinn",
        "grant-group-email": "Senda tölvupóst",
        "grant-group-high-volume": "Framkvæma magnaðgerðir",
        "grant-group-customization": "Sérsníðing og kjörstillingar",
        "action-deletechangetags": "eyða merkjum úr gagnagrunni",
        "action-purge": "hreinsa þessa síðu",
        "nchanges": "$1 {{PLURAL:$1|breyting|breytingar}}",
+       "ntimes": "$1×",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|síðan síðustu heimsókn}}",
        "enhancedrc-history": "breytingaskrá",
        "recentchanges": "Nýlegar breytingar",
        "boteditletter": "v",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|notandi skoðandi|$1 notendur skoðandi}}]",
-       "rc_categories": "Takmarka við flokka (aðskilja með \"|\"):",
-       "rc_categories_any": "Allt valið",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|bæt|bæti}} eftir breytingu",
        "newsectionsummary": "Nýr hluti: /* $1 */",
        "uploadstash-bad-path-unknown-type": "Óþekkt gerð \"$1\".",
        "uploadstash-bad-path-unrecognized-thumb-name": "Óþekkt heiti á smámynd.",
        "uploadstash-file-not-found-no-thumb": "Gat ekki náð í smámynd.",
+       "uploadstash-zero-length": "Lengd skráar er núll.",
        "invalid-chunk-offset": "Ógild raðbreyting bunka",
        "img-auth-accessdenied": "Aðgangur óheimill",
        "img-auth-nopathinfo": "PATH_INFO vantar.\nBiðlarinn þínn er ekki stilltur til að gefa upp þessar upplýsingar.\nÞær mega vera CGI-byggðar og mega ekki styðja img_auth.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "apisandbox-deprecated-parameters": "Úrelt viðföng",
        "apisandbox-submit-invalid-fields-title": "Sumir reitir eru ógildir",
        "apisandbox-results": "Niðurstöður",
+       "apisandbox-request-url-label": "Slóð á beiðni:",
+       "apisandbox-request-format-json-label": "JSON",
+       "apisandbox-request-json-label": "JSON beiðni:",
+       "apisandbox-request-time": "Tími beiðnar: {{PLURAL:$1|$1 ms}}",
        "apisandbox-alert-field": "Gildi þessa reits er ekki leyfilegt.",
        "apisandbox-continue": "Halda áfram",
        "apisandbox-continue-clear": "Hreinsa",
        "listgrouprights-namespaceprotection-namespace": "Nafnrými",
        "listgrouprights-namespaceprotection-restrictedto": "Réttindi sem leyfa notanda að breyta",
        "listgrants-rights": "Réttindi",
+       "listgrants-grant-display": "$1 <code>($2)</code>",
        "trackingcategories-name": "Heiti skilaboða",
        "restricted-displaytitle-ignored": "Síður með hunsaða sýnda titla",
        "trackingcategories-nodesc": "Enginn lýsing tiltæk.",
        "revertpage-nouser": "Tók aftur breytingar falins notanda til síðustu útgáfu {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Tók til baka breytingar eftir {{GENDER:$3|$1}};\nsetti yfir á síðustu útgáfu eftir {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Mistök í setu",
-       "sessionfailure": "Líklega er vandamál með innskráningarsetuna þína;\nhætt hefur verið við þessa aðgerð sem vörn gegn mögulegu samskiptaráni setunar.\nFarðu aftur á fyrri síðu, endurhladdu hana og reyndu aftur.",
+       "sessionfailure": "Líklega er vandamál með innskráningarsetuna þína;\nhætt hefur verið við þessa aðgerð sem vörn gegn mögulegu samskiptaráni setunar.\nReyndu að senda upplýsingarnar aftur inn.",
        "changecontentmodel-title-label": "Titill síðu",
        "changecontentmodel-reason-label": "Ástæða:",
        "changecontentmodel-submit": "Breyta",
        "movenosubpage": "Þessi síða hefur engar undirsíður.",
        "movereason": "Ástæða:",
        "revertmove": "taka til baka",
-       "delete_and_move_text": "Úttakssíðan „[[:$1]]“ er þegar til. Viltu eyða henni til þess að rýma til fyrir flutningi?",
+       "delete_and_move_text": "Marksíðan „[[:$1]]“ er þegar til. Viltu eyða henni til þess að rýma til fyrir flutningi?",
        "delete_and_move_confirm": "Já, eyða síðunni",
        "delete_and_move_reason": "Eytt til að rýma til fyrir flutning frá \"[[$1]]\"",
        "selfmove": "Nýi titillinn er sá sami og gamli, þú verður að velja annan titil.",
        "immobile-target-namespace": "Get ekki fært síður inn í nafnrýmið „$1“",
        "immobile-target-namespace-iw": "Óheimilt er að færa síðu með tungumálatengli.",
        "immobile-source-page": "Þessi síða er ekki færanleg.",
-       "immobile-target-page": "Get ekki fært Ã¡ Ã¡Ã¦tlaðan titil.",
+       "immobile-target-page": "Get ekki fært Ã¡ Ã¾ennan Ãºttakstitil.",
        "bad-target-model": "Markstaðurinn sem þú valdir notast við annað innihaldslíkan. Get ekki umbreytt frá $1 í $2.",
        "imagenocrossnamespace": "Get ekki fært skrá í skrálaust nafnrými",
        "nonfile-cannot-move-to-file": "Get ekki fært annað en skrár í nafnrými skráa.",
        "thumbnail-dest-create": "Gat ekki vistað smámynd á markstað",
        "thumbnail_invalid_params": "Breytur smámyndarinnar eru rangar",
        "thumbnail_toobigimagearea": "Skrá með málsetningar stærri en $1",
-       "thumbnail_dest_directory": "Mistókst að búa til niðurhals möppu",
+       "thumbnail_dest_directory": "Mistókst að búa til úttaksmöppu",
        "thumbnail_image-type": "Enginn stuðningur er við þetta skráarsnið",
        "thumbnail_gd-library": "Ófullkomin stilling GD-aðgerðasafns: Vantar aðgerðina $1",
        "thumbnail_image-missing": "Skrána virðist vanta: $1",
        "sunday-at": "Sunnudag klukkan $1",
        "yesterday-at": "Í gær klukkan $1",
        "bad_image_list": "Sniðið er eftirfarandi:\n\nAðeins listaeigindi (línur sem byrja á *) eru meðtalin.\nFyrsti tengillinn í hverri línu verður að tengja í slæma skrá.\nAllir síðari tenglar á sömu línu eru taldir vera undantekningar, þ.e. síður þar sem að skráin kann að koma fyrir innfelld.",
+       "variantname-zh-hans": "hans",
+       "variantname-zh-hant": "hant",
+       "variantname-zh-cn": "cn",
+       "variantname-zh-tw": "tw",
+       "variantname-zh-hk": "hk",
+       "variantname-zh-mo": "mo",
+       "variantname-zh-sg": "sg",
+       "variantname-zh-my": "my",
+       "variantname-zh": "zh",
+       "variantname-gan-hans": "hans",
+       "variantname-gan-hant": "hant",
+       "variantname-gan": "gan",
+       "variantname-sr-ec": "sr-ec",
+       "variantname-sr-el": "sr-el",
+       "variantname-sr": "sr",
+       "variantname-kk-kz": "kk-kz",
+       "variantname-kk-tr": "kk-tr",
+       "variantname-kk-cn": "kk-cn",
+       "variantname-kk-cyrl": "kk-cyrl",
+       "variantname-kk-latn": "kk-latn",
+       "variantname-kk-arab": "kk-arab",
+       "variantname-kk": "kk",
+       "variantname-ku-arab": "ku-Arab",
+       "variantname-ku-latn": "ku-Latn",
+       "variantname-ku": "ku",
+       "variantname-tg-cyrl": "tg-Cyrl",
+       "variantname-tg-latn": "tg-Latn",
+       "variantname-tg": "tg",
+       "variantname-ike-cans": "ike-Cans",
+       "variantname-ike-latn": "ike-Latn",
+       "variantname-iu": "iu",
+       "variantname-shi-tfng": "shi-Tfng",
+       "variantname-shi-latn": "shi-Latn",
+       "variantname-shi": "shi",
+       "variantname-uz": "uz",
+       "variantname-uz-latn": "uz-Latn",
+       "variantname-uz-cyrl": "uz-Cyrl",
+       "variantname-crh": "crh",
+       "variantname-crh-latn": "crh-Latn",
+       "variantname-crh-cyrl": "crh-Cyrl",
        "metadata": "Lýsigögn",
        "metadata-help": "Þessi skrá inniheldur viðbótarupplýsingar, líklega frá stafrænu myndavélinni eða skannanum sem notaður var til að gera eða stafræna hana.\nEf skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi ekki við um hana.",
        "metadata-expand": "Sýna frekari upplýsingar",
        "exif-gpstrack": "Átt hreyfingar",
        "exif-gpsimgdirection": "Stefna myndarinnar",
        "exif-gpsmapdatum": "Landmælingagögn",
+       "exif-gpsdestlatituderef": "Tilvísun breiddargráðu áfangastaðar",
        "exif-gpsdestlatitude": "Breiddargráða áfangastaðar",
+       "exif-gpsdestlongituderef": "Tilvísun lengdargráðu áfangastaðar",
        "exif-gpsdestlongitude": "Lengdargráða áfangastaðar",
+       "exif-gpsdestbearingref": "Tilvísun stefnu áfangastaðar",
        "exif-gpsdestbearing": "Stefna til áfangastaðar",
+       "exif-gpsdestdistanceref": "Tilvísun fyrir fjarlægð á áfangastað",
        "exif-gpsdestdistance": "Fjarlægð á áfangastað",
        "exif-gpsprocessingmethod": "GPS vinnsluaðferð",
        "exif-gpsareainformation": "Heiti GPS-svæðis",
        "version-libraries-description": "Lýsing",
        "version-libraries-authors": "Höfundar",
        "redirect": "Endurbeining miðað við skrá, notanda, síðu, útgáfu eða innskráningarauðkenni",
+       "redirect-summary": "Þessi kerfissíða endurbeinir á skrá (sé uppgefið skráarheiti), síðu (sé uppgefið auðkenni útgáfu eða auðkenni síðu), notandasíðu (sé uppgefið tölulegt gildi notanda), eða færslu í aðgerðaskrá (sé uppgefið auðkenni færslu). Notkun: [[{{#Special:Redirect}}/file/Dæmi.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Áfram",
        "redirect-lookup": "Fletta upp:",
        "redirect-value": "Gildi:",
        "tag-filter": "[[Special:Tags|Merkja]]sía:",
        "tag-filter-submit": "Sía",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merki}}]]: $2)",
+       "tag-mw-new-redirect": "Ný endurbeining",
+       "tag-mw-removed-redirect": "Fjarlægði endurbeiningu",
        "tag-mw-replace": "Skipt út",
        "tag-mw-undo": "Afturkalla",
        "tags-title": "Merki",
        "mediastatistics-header-text": "Textar",
        "mediastatistics-header-executable": "Uppsetninga skrár",
        "mediastatistics-header-archive": "Þjappaðar skrár",
+       "mediastatistics-header-3d": "3D",
        "mediastatistics-header-total": "Allar skrár",
        "json-warn-trailing-comma": "$1 eftirfylgjandi {{PLURAL:$1|komma var fjarlægð|kommur voru fjarlægðar}} úr JSON",
        "json-error-unknown": "Það varð villa í JSON. Villa: $1",
+       "json-error-depth": "Hámarki stafladýptar hefur verið náð",
        "json-error-state-mismatch": "Ógild eða ranglega uppsett JSON",
        "json-error-ctrl-char": "Villa í stýritákni, hugsanlega röng stafatafla (encoding)",
        "json-error-syntax": "Formvilla í málsetningu",
        "sessionprovider-nocookies": "Vefkökur gætu verið óvirkar. Gakktu úr skugga um að smákökur séu virkar og byrjaðu svo aftur.",
        "randomrootpage": "Handahófsvalin rótarsíða",
        "log-action-filter-all": "Allt",
-       "log-action-filter-delete-delete": "Eyðing síðu"
+       "log-action-filter-delete-delete": "Eyðing síðu",
+       "authmanager-email-label": "Tölvupóstur",
+       "authmanager-email-help": "Tölvupóstfang",
+       "authmanager-realname-label": "Raunverulegt nafn",
+       "authmanager-realname-help": "Raunverulegt nafn notandans",
+       "authmanager-provider-password": "Auðkenning með lykilorði",
+       "authmanager-provider-password-domain": "Auðkenning með lykilorði og léni",
+       "authmanager-provider-temporarypassword": "Bráðabirgðalykilorð",
+       "authprovider-confirmlink-option": "$1 ($2)",
+       "authprovider-confirmlink-request-label": "Aðgangar sem ættu að tengjast",
+       "authprovider-confirmlink-success-line": "$1: Tókst að tengja.",
+       "authprovider-confirmlink-failed-line": "$1: $2",
+       "authprovider-resetpass-skip-label": "Sleppa",
+       "authprovider-resetpass-skip-help": "Sleppa að endursetja lykilorð.",
+       "authform-newtoken": "Teikn vantar. $1",
+       "authform-notoken": "Teikn vantar",
+       "authform-wrongtoken": "Röng teikn",
+       "specialpage-securitylevel-not-allowed-title": "Ekki leyft",
+       "cannotauth-not-allowed-title": "Heimild hafnað",
+       "cannotauth-not-allowed": "Þú hefur ekki heimild til að nota þessa síðu",
+       "changecredentials": "Breyta auðkennum",
+       "changecredentials-submit": "Breyta auðkennum",
+       "credentialsform-provider": "Gerð auðkenna:",
+       "credentialsform-account": "Heiti aðgangs:",
+       "linkaccounts": "Tengja aðganga",
+       "linkaccounts-success-text": "Notandaaðgangurinn var tengdur.",
+       "linkaccounts-submit": "Tengja aðganga",
+       "unlinkaccounts": "Aftengja aðganga",
+       "unlinkaccounts-success": "Notandaaðgangurinn var aftengdur.",
+       "restrictionsfield-badip": "Ógilt IP-vistfang eða vistfangasvið: $1",
+       "restrictionsfield-label": "Leyfð svið IP-vistfanga:",
+       "edit-error-short": "Villa: $1",
+       "edit-error-long": "Villur: \n\n$1",
+       "revid": "útgáfa $1",
+       "pageid": "auðkennisnúmer síðu $1",
+       "gotointerwiki": "Fer af {{SITENAME}}",
+       "pagedata-title": "Síðugögn",
+       "pagedata-bad-title": "Ógildur titill: $1."
 }
index 88a605b..44c3da9 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[osservata da {{PLURAL:$1|un utente|$1 utenti}}]",
-       "rc_categories": "Limita alle categorie (separate da \"|\"):",
-       "rc_categories_any": "Qualsiasi fra quelle indicate",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte}} dopo la modifica",
        "newsectionsummary": "/* $1 */ nuova sezione",
        "rc-enhanced-expand": "Mostra dettagli",
        "rollback-success": "Annullate le modifiche di {{GENDER:$3|$1}}; pagina riportata all'ultima versione di {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Annullate le modifiche di $1;\npagina riportata all'ultima revisione di $2. [$3 Mostra le modifiche]",
        "sessionfailure-title": "Sessione fallita",
-       "sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
+       "sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Invia nuovamente il modulo.",
        "changecontentmodel": "Modifica il modello di contenuto di una pagina",
        "changecontentmodel-legend": "Modifica il modello di contenuto",
        "changecontentmodel-title-label": "Titolo della pagina",
        "thumbnail_dest_directory": "Impossibile creare la directory di destinazione",
        "thumbnail_image-type": "Tipo di immagine non supportato",
        "thumbnail_gd-library": "Configurazione incompleta della libreria GD: funzione $1 mancante",
+       "thumbnail_image-size-zero": "La dimensione del file di immagine sembra essere zero.",
        "thumbnail_image-missing": "Sembra essere mancante il file: $1",
        "thumbnail_image-failure-limit": "Ci sono stati recentemente troppi tentativi falliti ($1 o più) di generare questa miniatura. Riprova più tardi.",
        "import": "Importa pagine",
index 6be5b5d..0381d19 100644 (file)
        "boteditletter": "ボ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 人の利用者}}がウォッチしています]",
-       "rc_categories": "カテゴリを限定 (「|」で区切る):",
-       "rc_categories_any": "選択したもの全部",
        "rc-change-size": "$1",
        "rc-change-size-new": "変更後は $1 {{PLURAL:$1|バイト}}",
        "newsectionsummary": "/* $1 */ 新しい節",
index 9bb875a..b67539c 100644 (file)
        "newpageletter": "A",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|cacahé sing ngawasi|cacahé sing ngawasi}}]",
-       "rc_categories": "Watesi tekan kategori (dipisah nganggo \"|\")",
-       "rc_categories_any": "Apa waé sing dipilih",
        "rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sawisé diowahi",
        "newsectionsummary": "/* $1 */ pérangan anyar",
        "rc-enhanced-expand": "Tuduhaké princèn",
        "autosumm-blank": "Ngothongaké kaca",
        "autosumm-replace": "←Ngganti kaca karo '$1'",
        "autoredircomment": "Ngeneraké kaca menyang [[$1]]",
+       "autosumm-changed-redirect-target": "Ngowahi jujuganing alihan saka [[$1]] menyang [[$2]]",
        "autosumm-new": "Gawé kaca sing isi '$1'",
        "autosumm-newblank": "Nggawé kaca barès",
        "lag-warn-normal": "Owah-owahan pungkasan sing luwih anyar tinimbang $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
index f77067d..58fc69d 100644 (file)
@@ -69,7 +69,7 @@
        "tog-watchlisthideanons": "დამალეთ ანონიმურ მომხმარებელთა შესწორებები ჩემი კონტროლის სიიდან",
        "tog-watchlisthidepatrolled": "დამალეთ საკონტროლო სიიდან პატრულირებული რედაქტირებები",
        "tog-watchlisthidecategorization": "გვერდების კატეგორიზაციის დამალვა",
-       "tog-ccmeonemails": "გამომიგზავნე ელფოსტების ასლები, რომლებსაც მე სხვა მომხმარებლებს ვუგზავნი",
+       "tog-ccmeonemails": "á\83\92á\83\90á\83\9bá\83\9dá\83\9bá\83\98á\83\92á\83\96á\83\90á\83\95á\83\9cá\83\94 á\83\94á\83\9aá\83\94á\83¥á\83¢á\83 á\83\9dá\83\9cá\83£á\83\9aá\83\98 á\83¤á\83\9dá\83¡á\83¢á\83\94á\83\91á\83\98á\83¡ á\83\90á\83¡á\83\9aá\83\94á\83\91á\83\98, á\83 á\83\9dá\83\9bá\83\9aá\83\94á\83\91á\83¡á\83\90á\83ª á\83\9bá\83\94 á\83¡á\83®á\83\95á\83\90 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\94á\83\91á\83¡ á\83\95á\83£á\83\92á\83\96á\83\90á\83\95á\83\9cá\83\98",
        "tog-diffonly": "დამალე გვერდის შიგთავსი ცვლილების ქვევით",
        "tog-showhiddencats": "დამალული კატეგორიების ჩვენება",
        "tog-norollbackdiff": "ცვლილების გაუქმებისას არ მანახო ცვლილებათა განსხვავება",
        "timezoneregion-europe": "ევროპა",
        "timezoneregion-indian": "ინდოეთის ოკეანე",
        "timezoneregion-pacific": "წყნარი ოკეანე",
-       "allowemail": "სხვა მომხმარებლებისგან ელ. ფოსტის მიღების ჩართვა",
+       "allowemail": "სხვა მომხმარებლებისგან ელექტრონული ფოსტის მიღების ჩართვა",
+       "email-allow-new-users-label": "ელექტრონული ფოსტის მიღება ახალთახალი მომხმარებლებისაგან",
        "email-blacklist-label": "აუკრძალე შემდეგ მომხმარებლებს ჩემთვის მეილების გამოგზავნა:",
        "prefs-searchoptions": "ძიების პარამეტრები",
        "prefs-namespaces": "სახელთა სივრცეები",
        "boteditletter": "რ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 მომხმარებლის/ები კონტროლი]",
-       "rc_categories": "მხოლოდ კატეგორიებიდან (გამყოფი „|“)",
-       "rc_categories_any": "არჩეულიდან ნებისმიერი",
        "rc-change-size": "$1",
        "rc-change-size-new": "ზომა ცვლილების შემდეგ არის: {{PLURAL:$1|ბაიტი|ბაიტი}}",
        "newsectionsummary": "/* $1 */ ახალი სექცია",
index 9dc959c..2838ab1 100644 (file)
        "newpageletter": "T",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[Baqlag'an {{PLURAL:$1|1 paydalanıwshı|$1 paydalanıwshı}}]",
-       "rc_categories": "Kategoriyalarg'a sheklew (\"|\" belgisi menen ajıratın')",
-       "rc_categories_any": "Ha'r qanday",
        "newsectionsummary": "/* $1 */ taza bo'lim",
        "rc-enhanced-expand": "Tolıq mag'lıwmattı ko'rsetiw (JavaScriptti talap etedi)",
        "rc-enhanced-hide": "Tolıq mag'lıwmattı jasırıw",
index d79e343..e47ef2c 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|aɛessas|iɛessasen}}]",
-       "rc_categories": "Ḥedded i taggayin (ferreq s \"|\")",
-       "rc_categories_any": "Yiwet seg tid yettwafernen",
        "rc-change-size-new": "$1 {{PLURAL:$1|atamḍan|itamḍanen}} seld abeddel",
        "newsectionsummary": "/* $1 */ tigezmi tamaynut",
        "rc-enhanced-expand": "Ẓeṛ ttfaṣil",
index 3e7f13f..f412f1d 100644 (file)
        "templatepage": "Pela nımunu bıvêne",
        "viewhelppage": "Pela phoşti bıvêne",
        "categorypage": "Pela kategoriye bıvêne",
-       "viewtalkpage": "Hurênaişi bıvêne",
+       "viewtalkpage": "Hurênayişi bıvêne",
        "otherlanguages": "Zonunê binu de",
        "redirectedfrom": "($1 ra ard)",
        "redirectpagesub": "Pela berdene",
        "sp-contributions-blocklog": "qeydê engeli",
        "sp-contributions-uploads": "barbiyaey",
        "sp-contributions-logs": "qeydi",
-       "sp-contributions-talk": "hurênais",
+       "sp-contributions-talk": "hurênayiş",
        "sp-contributions-search": "Ebe iştıraku cı feteliye",
        "sp-contributions-username": "IP ya ki karber:",
        "sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne",
        "tooltip-pt-mycontris": "Lista iştıraqunê sıma",
        "tooltip-pt-login": "Serba cıkotene sıma rê sılaiya; hama, na zeruriye niya",
        "tooltip-pt-logout": "Veciye",
-       "tooltip-ca-talk": "Pela tedeesteu sero hurênais",
+       "tooltip-ca-talk": "Pela tedeesteyu sero hurênayiş",
        "tooltip-ca-edit": "Tı şikina na pele bıvurnê.\nKerem ke, qeydkerdene ra ver gozaga verqayti bıgurene.",
        "tooltip-ca-addsection": "Jü qısımo newe rake",
        "tooltip-ca-viewsource": "Na pele seveknaiya.\nTı şikina çımunê dae bıvênê",
index 27e73ff..bdc3318 100644 (file)
        "newpageletter": "ج",
        "boteditletter": "ب",
        "number_of_watching_users_pageview": "[باقىلاعان $1 قاتىسۋشى]",
-       "rc_categories": "ساناتتارعا شەكتەۋ (\"|\" بەلگىسىمەن بولىكتەڭىز)",
-       "rc_categories_any": "قايسىبىر",
        "newsectionsummary": "/* $1 */ جاڭا ٴبولىم",
        "recentchangeslinked": "قاتىستى وزگەرىستەر",
        "recentchangeslinked-feed": "قاتىستى وزگەرىستەر",
index d83a5ea..ca4071e 100644 (file)
        "newpageletter": "Ж",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[бақылаған $1 қатысушы]",
-       "rc_categories": "Санаттарға шектеу («|» белгісімен бөлектеңіз):",
-       "rc_categories_any": "Таңдалғанның кез келгені",
        "rc-change-size-new": "Өңдеуден кейінгі көлемі: $1 {{PLURAL:$1|байт|байт}}",
        "newsectionsummary": "/* $1 */ жаңа бөлім",
        "rc-enhanced-expand": "Толық ақпаратты көрсету",
index af23527..6b8e784 100644 (file)
        "newpageletter": "J",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[baqılağan $1 qatıswşı]",
-       "rc_categories": "Sanattarğa şektew (\"|\" belgisimen bölikteñiz)",
-       "rc_categories_any": "Qaýsıbir",
        "newsectionsummary": "/* $1 */ jaña bölim",
        "recentchangeslinked": "Qatıstı özgerister",
        "recentchangeslinked-feed": "Qatıstı özgerister",
index 4543380..f467d58 100644 (file)
        "tog-watchdefault": "បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំកែប្រែ​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
        "tog-watchmoves": "បន្ថែម​ទំព័រ​ទាំងឡាយដែលខ្ញុំប្តូរទីតាំង​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
        "tog-watchdeletion": "បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំលុបចោល​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
+       "tog-watchuploads": "បន្ថែមឯកសារថ្មីដែលខ្ញុំផ្ទុកឡើងទៅទំព័រតាមដានរបស់ខ្ញុំ",
        "tog-watchrollback": "បន្ថែមទំព័រដែលខ្ញុំបានមូលត្រឡប់ទៅកាន់បញ្ជីតាមដានរបស់ខ្ញុំ",
        "tog-minordefault": "ចំណាំ​គ្រប់កំណែប្រែ​របស់ខ្ញុំ​ថាជា​កំណែប្រែតិចតួច",
        "tog-previewontop": "បង្ហាញ​ការមើលមុន​ពីលើ​ប្រអប់​កែប្រែ",
        "tog-previewonfirst": "បង្ហាញ​ការមើលមុនសម្រាប់កំណែប្រែ​ដំបូងគេ",
-       "tog-enotifwatchlistpages": "ផ្ញើ​អ៊ីមែល​​មក​ខ្ញុំ​​កាល​បើ​​មាន​បន្លាស់​ប្ដូរ​នៃ​ទំព័រ​ណា​មួយ​ដែល​មាន​ក្នុង​បញ្ជី​តាម​ដាន​របស់​ខ្ញុំ",
-       "tog-enotifusertalkpages": "á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\93á\9f\85â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86",
+       "tog-enotifwatchlistpages": "ផ្ញើ​អ៊ីមែល​​មក​ខ្ញុំ​​កាល​បើ​​​ទំព័រឬឯកសារ​ណា​មួយ​ដែល​មាន​ក្នុង​បញ្ជី​តាម​ដាន​របស់​ខ្ញុំត្រូវបានផ្លាស់ប្ដូរ",
+       "tog-enotifusertalkpages": "á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a",
        "tog-enotifminoredits": "ផ្ញើអ៊ីមែល​មកខ្ញុំពេលមានបន្លាស់ប្ដូរតិចតួច​លើទំព័រឬឯកសារផងដែរ​",
        "tog-enotifrevealaddr": "បង្ហាញ​អាសយដ្ឋានអ៊ីមែល​របស់ខ្ញុំ​ក្នុង​​អ៊ីមែល​ក្រើនរំលឹក​",
        "tog-shownumberswatching": "បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលតាមដាន​ទំព័រនេះ",
-       "tog-oldsig": "á\9e á\9e\8fá\9f\92á\9e\90á\9e\9bá\9f\81á\9e\81á\9e¶á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e¶á\9e\93á\9e á\9e¾á\9e\99៖",
+       "tog-oldsig": "á\9e á\9e\8fá\9f\92á\9e\90á\9e\9bá\9f\81á\9e\81á\9e¶á\9e\98á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80៖",
        "tog-fancysig": "ចុះហត្ថលេខា​ជា​អត្ថបទវិគី​ (ដោយ​គ្មានតំណភ្ជាប់​ស្វ័យប្រវត្តិ)",
-       "tog-uselivepreview": "á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\80á\9e¶á\9e\9aá\9e\98á\9e¾á\9e\9bá\9e\98á\9e»á\9e\93á\9e\9aá\9e á\9f\90á\9e\9f",
+       "tog-uselivepreview": "á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\80á\9e¶á\9e\9aá\9e\98á\9e¾á\9e\9bá\9e\98á\9e»á\9e\93á\9e\8aá\9f\84á\9e\99á\9e\98á\9e·á\9e\93á\9e\85á\9e¶á\9f\86á\9e\94á\9e¶á\9e\85á\9f\8bá\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89",
        "tog-forceeditsummary": "សូមរំលឹកខ្ញុំ​កាលបើខ្ញុំទុកប្រអប់ចំណារពន្យល់ឱ្យនៅទំនេរ",
        "tog-watchlisthideown": "លាក់​កំណែប្រែ​របស់ខ្ញុំ​ពី​បញ្ជីតាមដាន",
        "tog-watchlisthidebots": "លាក់កំណែប្រែ​របស់​រូបយន្ត​ពី​បញ្ជីតាមដាន",
        "tog-watchlisthideminor": "លាក់​កំណែប្រែតិចតួច​ពីបញ្ជីតាមដាន",
        "tog-watchlisthideliu": "លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់ដែលបានកត់ឈ្មោះចូលពីបញ្ជីតាមដាន",
+       "tog-watchlistreloadautomatically": "ផ្ទុកបញ្ជីតាមដានឡើងវិញដោយស្វ័យប្រវត្តិពេលដែលតម្រងត្រូវបានផ្លាស់ប្ដូរ (ត្រូវការJavaScript)",
+       "tog-watchlistunwatchlinks": "បន្ថែមតំណភ្ជាប់ មិនតាមដាន/តាមដាន ផ្ទាល់ទៅវត្ថុក្នុងបញ្ជីតាមដាន(ត្រូវការJavaScript សម្រាប់មុខងារឆ្លាស់ទៅឆ្លាស់មក)",
        "tog-watchlisthideanons": "លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់អនាមិកពីបញ្ជីតាមដាន",
        "tog-watchlisthidepatrolled": "លាក់​កំណែប្រែ​ដែល​បាន​ល្បាតពី​បញ្ជីតាមដាន",
        "tog-watchlisthidecategorization": "លាក់ការដាក់ចំណាត់ថ្នាក់ក្រុមទំព័រ",
        "subcategories": "កូនចំណាត់ថ្នាក់ក្រុម",
        "category-media-header": "ឯកសារមេឌា​ដែលមានក្នុង​ចំណាត់ថ្នាក់ក្រុម \"$1\"",
        "category-empty": "''ចំណាត់ថ្នាក់ក្រុមនេះ​មិនមានផ្ទុកអត្ថបទឬ​ឯកសារមេឌា​ណាមួយទេ។''",
-       "hidden-categories": "{{PLURAL:|á\9e\85á\9f\86á\9e\8eá\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\98á\9e½á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e¶á\9e\80á\9f\8b\9e\85á\9f\86á\9e\8eá\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\85á\9f\86á\9e\93á\9e½á\9e\93$1á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e¶á\9e\80á\9f\8b}}",
+       "hidden-categories": "{{PLURAL:|á\9e\85á\9f\86á\9e\8eá\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\98á\9e½á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e¶á\9e\80á\9f\8b\9e\85á\9f\86á\9e\8eá\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e¶á\9e\80á\9f\8bá\9e\85á\9f\86á\9e\93á\9e½á\9e\93$1}}",
        "hidden-category-category": "ចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់",
        "category-subcat-count": "{{PLURAL:$2|ចំណាត់ថ្នាក់ក្រុមនេះមានតែកូនចំណាត់ថ្នាក់ក្រុមមួយដូចខាងក្រោមទេ។|ចំណាត់ថ្នាក់ក្រុមនេះមាន{{PLURAL:$1|កូនចំណាត់ថ្នាក់ក្រុមមួយ|កូនចំណាត់ថ្នាក់ក្រុមចំនួន$1}}ដូចខាងក្រោម ក្នុងចំណោមកូនចំណាត់ថ្នាក់ក្រុមសរុបចំនួន$2។}}",
        "category-subcat-count-limited": "ចំណាត់ថ្នាក់ក្រុមនេះមាន {{PLURAL:$1|កូនចំណាត់ថ្នាក់ក្រុមមួយ|កូនចំណាត់ថ្នាក់ក្រុមចំនួន$1}}ដូចខាងក្រោម។",
        "edit": "កែប្រែ",
        "edit-local": "កែប្រែចំណារពន្យល់ដើម",
        "create": "បង្កើត",
-       "create-local": "ចំណារពន្យល់ដើម",
+       "create-local": "á\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98á\9e\85á\9f\86á\9e\8eá\9e¶á\9e\9aá\9e\96á\9e\93á\9f\92á\9e\99á\9e\9bá\9f\8bá\9e\8aá\9e¾á\9e\98",
        "delete": "លុបចោល",
        "undelete_short": "ឈប់លុប{{PLURAL:$1|កំណែប្រែមួយ|កំណែប្រែចំនួន$1}}វិញ",
-       "viewdeleted_short": "á\9e\98á\9e¾á\9e\9b{{PLURAL:$1|á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\98á\9e½á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9b\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\85á\9f\86á\9e\93á\9e½á\9e\93 $1 á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9b}}",
+       "viewdeleted_short": "á\9e\98á\9e¾á\9e\9b{{PLURAL:$1|á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\98á\9e½á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9b\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9bá\9e\85á\9f\86á\9e\93á\9e½á\9e\93 $1}}",
        "protect": "ការពារ",
        "protect_change": "ផ្លាស់ប្តូរ",
        "unprotect": "ប្ដូរការការពារ",
        "jumptosearch": "ស្វែងរក",
        "view-pool-error": "សូមអភ័យទោស។ ប្រព័ន្ធបម្រើការមានការមមាញឹកខ្លាំងពេកនៅពេលនេះ។\nមានអ្នកប្រើប្រាស់ជាច្រើនកំពុងព្យាយាមចូលមើលទំព័រនេះ។\nសូមរង់ចាំមួយភ្លែតសិនរួចសាកល្បងចូលមកកាន់ទំព័រនេះឡើងវិញ។\n\n$1",
        "generic-pool-error": "សូមអភ័យទោស។ ប្រព័ន្ធបម្រើការមានការមមាញឹកខ្លាំងពេកនៅពេលនេះ។\nមានអ្នកប្រើប្រាស់ជាច្រើនកំពុងព្យាយាមចូលមើលទំព័រនេះ។\nសូមរង់ចាំមួយភ្លែតសិនរួចសាកល្បងចូលមកកាន់ទំព័រនេះឡើងវិញ។",
-       "pool-errorunknown": "កំហុសមិនស្គាល់",
+       "pool-errorunknown": "បញ្ហាមិនស្គាល់",
+       "poolcounter-usage-error": "បញ្ហាបម្រើបម្រាស់៖ $1",
        "aboutsite": "អំពី{{SITENAME}}",
        "aboutpage": "Project:អំពី",
        "copyright": "ខ្លឹមសារអត្ថបទប្រើប្រាស់បានក្រោមអាជ្ញាបណ្ឌ$1 លើកលែងតែមានបញ្ជាក់ផ្សេងពីនោះ។",
        "youhavenewmessagesfromusers": "អ្នកមាន $1 ទទួលបានពី {{PLURAL:$3|អ្នកប្រើប្រាស់ម្នាក់|អុ្នកប្រើប្រាស់ចំនួន $3 នាក់}} ($2)។",
        "youhavenewmessagesmanyusers": "អ្នកមាន $1 ទទួលបានពីអ្នកប្រើប្រាស់ជាច្រើន ($2)។",
        "newmessageslinkplural": "{{PLURAL:$1|សារថ្មីមួយ|សារថ្មី}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a\9e\94á\9f\86លាស់ប្ដូរ}}ចុងក្រោយ",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a|999=á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ}}ចុងក្រោយ",
        "youhavenewmessagesmulti": "អ្នកមានសារថ្មីៗនៅ $1",
        "editsection": "កែប្រែ",
        "editold": "កែប្រែ",
        "toc": "មាតិកា",
        "showtoc": "បង្ហាញ",
        "hidetoc": "លាក់",
-       "collapsible-collapse": "á\9e\94á\9e\84á\9f\92á\9e\9aá\9e½á\9e\98",
+       "collapsible-collapse": "á\9e\94á\9e\84á\9f\92á\9e\9aá\9e½á\9e\89",
        "collapsible-expand": "ពន្លាត",
        "confirmable-confirm": "តើ {{GENDER:$1|អ្នក}} ប្រាកដហើយ?",
-       "confirmable-yes": "បាទ/ចាស",
+       "confirmable-yes": "បាទ/ចាស",
        "confirmable-no": "ទេ",
        "thisisdeleted": "មើល ឬ​ ស្ដារ $1 ឡើងវិញ?",
        "viewdeleted": "មើល $1?",
-       "restorelink": "{{PLURAL:$1|á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\98á\9e½á\9e\99á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9b\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\85á\9f\86á\9e\93á\9e½á\9e\93 $1 á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9b}}",
+       "restorelink": "{{PLURAL:$1|á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\98á\9e½á\9e\99á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9b\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9bá\9e\85á\9f\86á\9e\93á\9e½á\9e\93 $1}}",
        "feedlinks": "Feed​៖",
        "feed-invalid": "ប្រភេទfeedដែលគ្មានសុពលភាព។",
        "feed-unavailable": "បម្រែ​បម្រួល ​Syndication feeds មិន​ទាន់​មាន​នៅ​ឡើយ​ទេ",
        "cannotlogoutnow-title": "មិនអាចកត់ឈ្មោះចេញបានទេនៅពេលនេះ",
        "cannotlogoutnow-text": "មិនអាចកត់ឈ្មោះចេញបានទេពេលកំពុងប្រើ$1។",
        "welcomeuser": "សូមស្វាគមន៍ $1!",
-       "welcomecreation-msg": "á\9e\82á\9e\8eá\9e\93á\9e¸á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e á\9e¾á\9e\99á\9f\94\ná\9e\80á\9e»á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a[[Special:Preferences|á\9e\85á\9f\86á\9e\8eá\9e\84á\9f\8bá\9e\85á\9f\86á\9e\8eá\9e¼á\9e\9bá\9e\85á\9e·á\9e\8fá\9f\92á\9e\8f{{SITENAME}}]]á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80។",
+       "welcomecreation-msg": "á\9e\82á\9e\8eá\9e\93á\9e¸á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e á\9e¾á\9e\99á\9f\94\ná\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a[[Special:Preferences|á\9e\85á\9f\86á\9e\8eá\9e\84á\9f\8bá\9e\85á\9f\86á\9e\8eá\9e¼á\9e\9bá\9e\85á\9e·á\9e\8fá\9f\92á\9e\8f]]{{SITENAME}}á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9e¶á\9e\98á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\90á\9f\92á\9e\93á\9e។",
        "yourname": "អត្តនាម៖",
        "userlogin-yourname": "អត្តនាម",
        "userlogin-yourname-ph": "បញ្ចូលអត្តនាមរបស់អ្នក",
        "createacct-yourpasswordagain": "អះអាង​ពាក្យ​សម្ងាត់",
        "createacct-yourpasswordagain-ph": "បញ្ចូលពាក្យសម្ងាត់ម្ដងទៀត",
        "userlogin-remembermypassword": "រក្សាស្ថានភាពកត់ឈ្មោះចូលរបស់ខ្ញុំ",
-       "userlogin-signwithsecure": "á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\8fá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bមានសុវត្ថិភាព",
+       "userlogin-signwithsecure": "á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9e\8eá\9f\92á\9e\8aá\9e¶á\9e\89មានសុវត្ថិភាព",
        "cannotlogin-title": "មិនអាចកត់ឈ្មោះចូលបានទេ",
        "cannotlogin-text": "មិនអាចកត់ឈ្មោះចូលបានទេ។",
        "cannotloginnow-title": "មិនអាចកត់ឈ្មោះចូលបានទេនៅពេលនេះ",
        "userlogin-noaccount": "តើលោកអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទេ​ឬ?",
        "userlogin-joinproject": "សូមចូលជាសមាជិក {{SITENAME}}",
        "createaccount": "បង្កើតគណនី",
-       "userlogin-resetpassword-link": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e á\9e¾á\9e\99?",
+       "userlogin-resetpassword-link": "á\9e\8fá\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e á\9e¾á\9e\99á\9e¬?",
        "userlogin-helplink2": "ជំនួយលើការកត់ឈ្មោះចូល",
        "userlogin-loggedin": "អ្នកបានកត់ឈ្មោះចូលជា {{GENDER:$1|$1}} ហើយ។\nប្រើសំណុំបែបបទខាងក្រោមដើម្បីកត់ឈ្មោះចូលជាអ្នកប្រើប្រាស់ផ្សេងម្នាក់ទៀត។",
        "userlogin-reauth": "អ្នកត្រូវតែកត់ឈ្មោះចូលម្ដងទៀតដើម្បីបញ្ជាក់ថាអ្នកជា{{GENDER:$1|$1}}។",
        "createacct-benefit-body1": "{{PLURAL:$1|កំណែ|កំណែ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ទំព័រ|ទំព័រ}}",
        "createacct-benefit-body3": "{{PLURAL:$1|អ្នករួមចំណែក|អ្នករួមចំណែក}}ថ្មីៗ",
-       "badretype": "ពាក្យសម្ងាត់ដែលអ្នកបានវាយបញ្ចូលនោះ គឺមិនស៊ីគ្នាទេ។",
+       "badretype": "ពាក្យសម្ងាត់ដែលអ្នកបានវាយបញ្ចូលនោះមិនត្រូវគ្នាទេ។",
        "usernameinprogress": "ការបង្កើតគណនីសម្រាប់អ្នកប្រើប្រាស់នេះកំពុងប្រព្រឹត្តទៅ។ សូមរង់ចាំបន្តិច។",
        "userexists": "អត្តនាមដែលអ្នកបានវាយបញ្ចូលមានគេប្រើហើយ។\nសូមជ្រើសរើសអត្តនាមផ្សេងពីនេះ។",
-       "loginerror": "á\9e\80á\9f\86á\9e á\9e»á\9e\9fá\9e\93á\9f\83ការកត់ឈ្មោះចូល",
+       "loginerror": "á\9e\94á\9e\89á\9f\92á\9e á\9e¶á\9e\80á\9f\92á\9e\93á\9e»á\9e\84ការកត់ឈ្មោះចូល",
        "createacct-error": "បញ្ហាក្នុងការបង្កើតគណនី",
        "createaccounterror": "មិនអាចបង្កើតគណនីបានទេ៖ $1",
        "nocookiesnew": "គណនីប្រើប្រាស់របស់អ្នកត្រូវបានបង្កើតហើយ ក៏ប៉ុន្តែអ្នកមិនទាន់បានកត់ឈ្មោះចូលទេ។\n\n{{SITENAME}}ប្រើប្រាស់ខូឃី ដើម្បីកត់ឈ្មោះចូល។\n\nអ្នកបានជ្រើសមិនប្រើខូឃី។\n\nសូមជ្រើសប្រើខូឃីវិញ រួចកត់ឈ្មោះចូលដោយប្រើអត្តនាមថ្មីនិងពាក្យសំងាត់ថ្មីរបស់អ្នក។",
        "nocookieslogin": "{{SITENAME}}ប្រើខូឃីដើម្បីកត់ឈ្មោះចូល។\n\nអ្នកបានជ្រើសមិនប្រើខូឃី។​\n\nសូមជ្រើសប្រើខូឃីវិញ រួចព្យាយាមម្តងទៀត។",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "គណនីត្រូវបានបង្កើតបានសម្រេចហើយ ប៉ុន្តែអ្នកមិនអាចកត់ឈ្មោះចូលដោយស្វ័យប្រវត្តិទេ។\nសូមបន្តទៅ [[Special:UserLogin|កត់ឈ្មោះចូលដោយខ្លួនឯង]]។",
        "noname": "អ្នកមិនបានផ្ដល់អត្តនាមត្រឹមត្រូវទេ។",
-       "loginsuccesstitle": "á\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bហើយ",
-       "loginsuccess": "'''ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"$1\"ហើយ។'''",
+       "loginsuccesstitle": "á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\94á\9e¶á\9e\93ហើយ",
+       "loginsuccess": "<strong>ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"$1\"ហើយ។</strong>",
        "nosuchuser": "មិនមានអ្នកប្រើដែលមានឈ្មោះ \"$1\" ទេ។\n\nសូម​ពិនិត្យ​ក្រែង​លោ​មានកំហុស​អក្ខរាវិរុទ្ធឬ [[Special:CreateAccount|បង្កើត​គណនី​ថ្មី]]។",
        "nosuchusershort": "គ្មានអ្នកប្រើដែលមានឈ្មោះ $1\" ទេ។\n\nសូម​ពិនិត្យ​​អក្ខរាវិរុទ្ធ​របស់អ្នក ។",
        "nouserspecified": "អ្នកត្រូវតែ​ផ្ដល់អត្តនាម។",
        "wrongpasswordempty": "ពាក្យសម្ងាត់មិនបានវាយបញ្ចូលទេ។\n\nសូមព្យាយាម​ម្តងទៀត។",
        "passwordtooshort": "ពាក្យសម្ងាត់ត្រូវ​មាន​យ៉ាងតិចណាស់​ {{PLURAL:$1|១ តួអក្សរ|$1តួអក្សរ}}។",
        "passwordtoolong": "ពាក្យសម្ងាត់មិនអាចវែងជាង{{PLURAL:$1|1 តួ|$1 តួ}}ទេ។",
+       "passwordtoopopular": "ពាក្យសម្ងាត់ដែលមានគេប្រើជាទូទៅមិនអាចប្រើបានទេ។ សូមជ្រើសរើសពាក្យសម្ងាត់ដែលពិសេសខុសគេ។",
        "password-name-match": "ពាក្យសម្ងាត់ត្រូវតែខុសគ្នាពីអត្តនាមរបស់អ្នក។",
        "password-login-forbidden": "ហាមប្រាមមិនអោយប្រើអត្តនាមនិងពាក្យសម្ងាត់នេះ។",
        "mailmypassword": "កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ",
        "noemail": "គ្មានអាសយដ្ឋានអ៊ីមែលណាមួយត្រូវបានកត់ត្រាទុកសម្រាប់អ្នកប្រើឈ្មោះ \"$1\" ទេ។",
        "noemailcreate": "អ្នកត្រូវតែផ្ដល់អាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ",
        "passwordsent": "ពាក្យសម្ងាត់​ថ្មី​ត្រូវ​បាន​ផ្ញើទៅ​អាសយដ្ឋាន​អ៊ីមែល​ដែល​បាន​ចុះបញ្ជី​សម្រាប់អ្នកប្រើឈ្មោះ \"$1\" ។\n\nសូម​កត់ឈ្មោះចូល​ម្តងទៀត​បន្ទាប់ពី​អ្នក​បាន​ទទួល​ពាក្យសម្ងាត់ថ្មីនោះ។",
-       "blocked-mailpassword": "á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82 á\9e\93á\9e·á\9e\84á\9e\98á\9e·á\9e\93á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e±á\9f\92á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\9fá\9e\84á\9f\92á\9e\82á\9f\92á\9e\9aá\9f\84á\9f\87á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e\80á\9e¶á\9e\9aá\9e\94á\9f\86á\9e\96á\9e¶á\9e\93á\9e\91á\9f\81។",
+       "blocked-mailpassword": "á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82 á\9f\94 á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e\80á\9e¶á\9e\9aá\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\9fá\9e\84á\9f\92á\9e\82á\9f\92á\9e\9aá\9f\84á\9f\87á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\93á\9f\81á\9f\87។",
        "eauthentsent": "អ៊ីមែល​សម្រាប់​ផ្ទៀងផ្ទាត់​បញ្ជាក់ត្រូវបានផ្ញើទៅ​អាសយដ្ឋានអ៊ីមែល​ដែលបានផ្ដល់ជូនហើយ។\n\nមុននឹងមាន​អ៊ីមែលផ្សេងមួយទៀត​ត្រូវផ្ញើទៅ​គណនីនេះ អ្នកត្រូវតែ​ធ្វើតាមសេចក្តីណែនាំ​ក្នុងអ៊ីមែល​នោះ ដើម្បីបញ្ជាក់ថា​គណនីបច្ចុប្បន្ន​ពិតជា​របស់អ្នកពិតប្រាកដមែន។",
        "throttled-mailpassword": "អ៊ីមែលប្ដូរពាក្យសម្ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។\n\nដើម្បីបង្ការអំពើបំពាន អ៊ីមែលប្ដូរពាក្យសម្ងាត់តែមួយគត់នឹងត្រូវបាន​ផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។",
        "mailerror": "បញ្ហាក្នុងការផ្ញើអ៊ីមែល៖ $1",
-       "acct_creation_throttle_hit": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e\91á\9e\9fá\9f\92á\9e\9fá\9e\93á\9e¶â\80\8bá\9e\9cá\9e·á\9e\82á\9e¸â\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\8aá\9f\84á\9e\99â\80\8bá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\9aá\9e\94á\9e\9fá\9f\8bâ\80\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8b á\9e\94á\9e¶á\9e\93á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8f{{PLURAL:$1|á\9e\82á\9e\8eá\9e\93á\9e¸á\9e\98á\9e½á\9e\99\9e\82á\9e\8eá\9e\93á\9e¸á\9e\85á\9f\86á\9e\93á\9e½á\9e\93$1}}á\9e\93á\9f\85â\80\8bá\9e\90á\9f\92á\9e\84á\9f\83â\80\8bá\9e\85á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\99។ ចំនួននេះ​ជា​ចំនួន​អតិបរមារ​ដែល​ត្រូវ​បាន​អនុញ្ញាត​សម្រាប់​រយៈពេល​នេះ​។\n\nហេតុនេះ អ្នកទស្សនា​ដោយ​ប្រើប្រាស់​អាសយដ្ឋានIPនេះ​​មិន​អាច​បង្កើត​គណនី​បន្ថែមទៀត​នៅ​ខណៈនេះ​បាន​ទេ​។",
+       "acct_creation_throttle_hit": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e\91á\9e\9fá\9f\92á\9e\9fá\9e\93á\9e¶â\80\8bá\9e\9cá\9e·á\9e\82á\9e¸â\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\8aá\9f\84á\9e\99â\80\8bá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\9aá\9e\94á\9e\9fá\9f\8bâ\80\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8b á\9e\94á\9e¶á\9e\93á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8f{{PLURAL:$1|á\9e\82á\9e\8eá\9e\93á\9e¸á\9e\98á\9e½á\9e\99\9e\82á\9e\8eá\9e\93á\9e¸á\9e\85á\9f\86á\9e\93á\9e½á\9e\93$1}}á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\9aá\9e\99á\9f\88á\9e\96á\9f\81á\9e\9b$2á\9e\90á\9f\92á\9e\98á\9e¸á\9f\97á\9e\93á\9f\81á\9f\87។ ចំនួននេះ​ជា​ចំនួន​អតិបរមារ​ដែល​ត្រូវ​បាន​អនុញ្ញាត​សម្រាប់​រយៈពេល​នេះ​។\n\nហេតុនេះ អ្នកទស្សនា​ដោយ​ប្រើប្រាស់​អាសយដ្ឋានIPនេះ​​មិន​អាច​បង្កើត​គណនី​បន្ថែមទៀត​នៅ​ខណៈនេះ​បាន​ទេ​។",
        "emailauthenticated": "អាសយដ្ឋានអ៊ីមែលរបស់លោកអ្នក​ត្រូវបានបញ្ជាក់ទទួលស្គាល់នៅ$2នៅ$3។",
        "emailnotauthenticated": "អាសយដ្ឋានអ៊ីមែលរបស់លោកអ្នក មិនទាន់ត្រូវបានបញ្ជាក់ទទួលស្គាល់នៅឡើយទេ។\n\nគ្មានអ៊ីមែលដែលនឹងត្រូវបានផ្ញើ សម្រាប់មុខងារពិសេសណាមួយដូចខាងក្រោមទេ។",
        "noemailprefs": "ផ្ដល់អាសយដ្ឋាន​អ៊ីមែល​នៅ​ក្នុង​ចំណង់ចំណូលចិត្ត​របស់​អ្នក​ដើម្បីប្រើប្រាស់មុខងារពិសេសទាំងនេះ​។",
        "resetpass_submit": "ដាក់ប្រើពាក្យសម្ងាត់និង​កត់ឈ្មោះចូល",
        "changepassword-success": "ពាក្យសម្ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរហើយ!",
        "changepassword-throttled": "អ្នកបានព្យាយាមកត់ឈ្មោះចូលជាប់ៗគ្នាច្រើនដងពេកហើយ។​\nសូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
+       "botpasswords": "ពាក្យសម្ងាត់រូបយន្ត",
+       "botpasswords-summary": "<em>ពាក្យសម្ងាត់រូបយន្ត</em> អនុញ្ញាតអោយចូលទៅក្នុងគណនីរបស់អ្នកប្រើប្រាស់ម្នាក់ តាមរយៈ API ដោយមិនចាំបាច់ប្រើមុខងារកត់ឈ្មោះចូលធម្មតា។ សិទ្ធិអ្នកប្រើប្រាស់ពេលកត់ឈ្មោះចូលដោយប្រើពាក្យសម្ងាត់រូបយន្តមានកំហិត។\n\nប្រសិនបើអ្នកគ្មានមូលហេតុប្រើប្រាស់ពាក្យសម្ងាត់នេះទេ អ្នកមិនគួរប្រើវាទេ។ គ្មាននរណាម្នាក់មានសិទ្ធិស្នើសុំអ្នកអោយបង្កើតវាហើយប្រាប់ទៅពួកគេទេ។",
+       "botpasswords-disabled": "មិនប្រើពាក្យសម្ងាត់រូបយន្ត។",
+       "botpasswords-no-central-id": "ដើម្បីប្រើពាក្យសម្ងាត់រូបយន្ត អ្នកត្រូវតែកត់ឈ្មោះចូលទៅក្នុងគណនីមជ្ឈិម។",
+       "botpasswords-existing": "ពាក្យសម្ងាត់រូបយន្តមានហើយ",
+       "botpasswords-createnew": "បង្កើតពាក្យសម្ងាត់រូបយន្តថ្មី",
+       "botpasswords-editexisting": "កែប្រែពាក្យសម្ងាត់រូបយន្តមានហើយ",
+       "botpasswords-label-appid": "ឈ្មោះរូបយន្ត៖",
+       "botpasswords-label-create": "បង្កើត",
+       "botpasswords-label-update": "បន្ទាន់សម័យ",
+       "botpasswords-label-cancel": "បោះបង់",
+       "botpasswords-label-delete": "លុបចោល",
+       "botpasswords-label-resetpassword": "កំណត់​ពាក្យសម្ងាត់​ឡើងវិញ",
+       "botpasswords-label-grants": "សិទ្ធិដែលអាចប្រើបាន៖",
+       "botpasswords-label-grants-column": "ផ្ដល់សិទ្ធិហើយ",
+       "botpasswords-bad-appid": "ឈ្មោះរូបយន្ត«$1»ប្រើមិនបានទេ។",
        "resetpass_forbidden": "ពាក្យសម្ងាត់មិនអាចផ្លាស់ប្តូរបានទេ",
        "resetpass-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "resetpass-submit-loggedin": "ប្តូរពាក្យសម្ងាត់",
        "passwordreset-emailtext-user": "អ្នកប្រើប្រាស់ $1 នៅក្នុង {{SITENAME}} បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកនៅក្នុង {{SITENAME}} ($4)។\n {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "passwordreset-emailelement": "អត្តនាម៖ \n$1\n\nពាក្យសម្ងាត់បណ្ដោះអាសន្ន៖ \n$2",
        "passwordreset-emailsentemail": "បើសិនជានេះអាសយដ្ឋានអ៊ីមែលដែលត្រូវបានចុះឈ្មោះសម្រាប់គណនីរបស់អ្នក នោះអ៊ីមែលសម្រាប់ស្ដារពាក្យសម្ងាត់មួយនឹងត្រូវបានផ្ញើទៅ។",
+       "passwordreset-invalidemail": "អាសយដ្ឋាន​អ៊ីមែល​មិន​ត្រឹម​ត្រូវ",
        "changeemail": "ផ្លាស់ប្ដូរឬលុបអាសយដ្ឋានអ៊ីមែល",
        "changeemail-header": "សូមបំពេញសំណុំបែបបទនេះដើម្បីផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល។ បើសិនជាអ្នកចង់លុបការតភ្ជាប់អាសយដ្ឋានអ៊ីមែលពីគណនីរបស់អ្នក សូមដាក់ប្រឡោះអាសយដ្ឋានថ្មីអោយនៅទំនេរពេលសម្រេចដាក់សំណុំបែបបទ។",
        "changeemail-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "changeemail-submit": "ផ្លាស់ប្ដូរអ៊ីមែល",
        "changeemail-throttled": "អ្នកបានព្យាយាមកត់ឈ្មោះចូលច្រើនដងពេកហើយ។​\nសូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
        "changeemail-nochange": "សូមវាយបញ្ចូលអាសយដ្ឋានអ៊ីមែលផ្សេងមួយទៀត។",
+       "resettokens": "កំណត់កូនសោរឡើងវិញ",
+       "resettokens-text": "អ្នកអាចកំណត់ឡើងវិញនូវកូនសោរដែលអនុញ្ញាតអោយចូលទៅមើលទិន្នន័យផ្ទាល់ខ្លួនដែលទាក់ទិនគណនីរបស់អ្នក។\n\nអ្នកគួរធ្វើបែបនេះប្រសិនបើអ្នកច្រលំចែកចាយវាទៅនរណាម្នាក់ ឬក្នុងករណីដែលគណនីរបស់អ្នកត្រូវបានគេបំពាន។",
+       "resettokens-no-tokens": "គ្មានកូនសោរសម្រាប់កំណត់ឡើងវិញទេ។",
+       "resettokens-tokens": "កូនសោរ៖",
+       "resettokens-token-label": "$1 (តម្លៃបច្ចុប្បន្ន $2)",
+       "resettokens-done": "កូនសោរកំណត់ឡើងវិញហើយ។",
+       "resettokens-resetbutton": "កំណត់ឡើងវិញនូវកូនសោរដែលបានរើស។",
        "bold_sample": "អក្សរដិត",
        "bold_tip": "អក្សរដិត",
        "italic_sample": "អក្សរទ្រេត",
        "missingcommentheader": "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ប្រធានបទរបស់មតិយោបល់នេះទេ។\nបើសិនជាអ្នកចុច \"$1\" ម្ដងទៀត នោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
        "summary-preview": "ការមើលជាមុនរបស់ចំណារពន្យល់៖",
        "subject-preview": "ការមើលជាមុនរបស់ប្រធានបទ៖",
-       "previewerrortext": "មានបញ្ហាកើតឡើងពេលព្យាយាមើលជាមុនបន្លាស់ប្ដូររបស់អ្នក។",
+       "previewerrortext": "á\9e\98á\9e¶á\9e\93á\9e\94á\9e\89á\9f\92á\9e á\9e¶á\9e\80á\9e¾á\9e\8fá\9e¡á\9e¾á\9e\84á\9e\96á\9f\81á\9e\9bá\9e\96á\9f\92á\9e\99á\9e¶á\9e\99á\9e¶á\9e\98á\9e\98á\9e¾á\9e\9bá\9e\87á\9e¶á\9e\98á\9e»á\9e\93á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9f\94",
        "blockedtitle": "អ្នកប្រើនេះត្រូវបានហាមឃាត់ហើយ",
        "blockedtext": "'''ឈ្មោះគណនីឬអាសយដ្ឋានIPរបស់អ្នកស្ថិតក្រោមការហាមឃាត់ហើយ។'''\n\nការហាមឃាត់ត្រូវបានធ្វើដោយ $1\n\nដោយសំអាងលើហេតុផល ''$2''។\n\n\n* ចាប់ផ្ដើមការហាមឃាត់ ៖ $8\n* ផុតកំណត់ការហាមឃាត់ ៖ $6\n* គណនីហាមឃាត់់ ៖ $7\n\n\nអ្នកអាចទាក់ទងទៅ $1 ឬ [[{{MediaWiki:Grouppage-sysop}}|អ្នកអភិបាល]]ដទៃទៀតដើម្បីពិភាក្សាពីការហាមឃាត់នេះ ។\n\nអ្នកមិនអាចប្រើប្រាស់មុខងារ \"អ៊ីមែលទៅអ្នកប្រើប្រាស់នេះ\" បានទេ លើកលែងតែអាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ​ត្រូវបានផ្ដល់អោយក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]​របស់លោកអ្នកហើយលោកអ្នកមិនត្រូវបានគេហាមឃាត់មិនឱ្យប្រើប្រាស់មុខងារនោះ។\n\nអាសយដ្ឋានIPបច្ចុប្បន្នរបស់លោកអ្នកគឺ $3 និងអត្តលេខហាមឃាត់គឺ #$5 ។\n\nសូមបញ្ចូលព័ត៌មានលំអិតទាំងអស់ខាងលើនេះ ក្នុងអ៊ីមែលទាក់ទងនឹងបញ្ហានេះ។",
        "autoblockedtext": "អាសយដ្ឋានIPរបស់អ្នកបានត្រូវហាមឃាត់ដោយស្វ័យប្រវត្តិ ព្រោះវាត្រូវបានប្រើប្រាស់ដោយអ្នកប្រើប្រាស់ម្នាក់ទៀត ដែលត្រូវបានហាមឃាត់ដោយ $1 ។\n\nមូលហេតុលើកឡើង៖\n\n:''$2''\n\n* ការចាប់ផ្តើមហាមឃាត់៖ $8\n* ពេលផុតកំណត់ហាមឃាត់៖ $6\n* គណនីហាមឃាត់៖ $7\n\nអ្នកអាចទាក់ទង $1 ឬ[[{{MediaWiki:Grouppage-sysop}}|អ្នកអភិបាល]]ណាម្នាក់ ដើម្បីពិភាក្សាអំពីការហាមឃាត់នេះ។\n\nសូមកត់សម្គាល់ថាអ្នកមិនអាចប្រើប្រាស់មុខងារ \"អ៊ីមែលអ្នកប្រើប្រាស់នេះ\" បានទេ លុះត្រាតែមានអាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ បានចុះឈ្មោះក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]របស់អ្នក ហើយអ្នកមិនត្រូវបានហាមឃាត់មិនឱ្យប្រើប្រាស់មុខងារនោះ ។\n\nអាសយដ្ឋានIPបច្ចុប្បន្នរបស់អ្នកគឺ $3។ អត្តលេខហាមឃាត់គឺ #$5។\nសូមបញ្ចូលព័ត៌មានលំអិតទាំងអស់ខាងលើនេះ ក្នុងអ៊ីមែលទាក់ទងនឹងបញ្ហានេះ។",
        "nohistory": "មិនមានប្រវត្តិកំណែប្រែ​ចំពោះទំព័រនេះ។",
        "currentrev": "កំណែបច្ចុប្បន្ន",
        "currentrev-asof": "កំណែប្រែបច្ចុប្បន្ន $1",
-       "revisionasof": "កំណែ​របស់ $1",
+       "revisionasof": "កំណែនៅ $1",
        "revision-info": "កំណែ​នៅ $1 ដោយ {{GENDER:$6|$2}}$7",
        "previousrevision": "← កំណែ​មុន",
        "nextrevision": "កំណែបន្ទាប់ →",
        "next": "បន្ទាប់",
        "last": "មុន",
        "page_first": "ដំបូង",
-       "page_last": "á\9e\85á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\99",
-       "histlegend": "á\9e\87á\9e\98á\9f\92á\9e\9aá\9e¾á\9e\9fá\9f\96 á\9e\9fá\9e¼á\9e\98á\9e\82á\9e¼á\9e\9fá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e¼á\9e\93á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\96á\9e¸á\9e\98á\9e»á\9e\81á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e\84á\9f\8bá\9e\94á\9f\92á\9e\9aá\9f\80á\9e\94á\9e\92á\9f\80á\9e\94 á\9e\9aá\9e½á\9e\85á\9e\85á\9e»á\9e\85á\9e\85á\9f\92á\9e\93á\9e»á\9e\85 ENTER á\9e¬á\9e\94á\9f\8aá\9e¼á\9e\8fá\9e»á\9e\84á\9e\93á\9f\85á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9f\94<br />\n'''á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\8fá\9f\86á\9e\8eá\9e¶á\9e\84'''á\9f\96\9e\94á\9e\85á\9f\92á\9e\85á\9e»á\9e\94á\9f\92á\9e\94á\9e\93á\9f\92á\9e\93) = á\9e\97á\9e¶á\9e\96á\9e\81á\9e»á\9e\9fá\9e\82á\9f\92á\9e\93á\9e¶á\9e\87á\9e¶á\9e\98á\9e½á\9e\99á\9e\93á\9e¹á\9e\84á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e\85á\9f\92á\9e\85á\9e»á\9e\94á\9f\92á\9e\94á\9e\93á\9f\92á\9e\93, (á\9e\85á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\99) = á\9e\97á\9e¶á\9e\96á\9e\81á\9e»á\9e\9fá\9e\82á\9f\92á\9e\93á\9e¶á\9e\9aá\9e\9cá\9e¶á\9e\84á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\96á\9e¸á\9e\98á\9e»á\9e\93, á\9e\8fá\9e·á\9e\85 = á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9e·á\9e\85á\9e\8fá\9e½á\9e\85",
+       "page_last": "á\9e\98á\9e»á\9e\93",
+       "histlegend": "á\9e\87á\9e\98á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\94á\9f\92á\9e\9aá\9f\80á\9e\94á\9e\92á\9f\80á\9e\94á\9f\96 á\9e\9fá\9e¼á\9e\98á\9e\82á\9e¼á\9e\9fá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e¼á\9e\93á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\96á\9e¸á\9e\98á\9e»á\9e\81á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e\84á\9f\8bá\9e\94á\9f\92á\9e\9aá\9f\80á\9e\94á\9e\92á\9f\80á\9e\94 á\9e\9aá\9e½á\9e\85á\9e\85á\9e»á\9e\85á\9e\85á\9f\92á\9e\93á\9e»á\9e\85 ENTER á\9e¬á\9e\94á\9f\8aá\9e¼á\9e\8fá\9e»á\9e\84á\9e\93á\9f\85á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9f\94<br />\ná\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bá\9f\96 <strong>({{int:cur}})</strong> = á\9e\97á\9e¶á\9e\96á\9e\81á\9e»á\9e\9fá\9e\82á\9f\92á\9e\93á\9e¶á\9e\87á\9e¶á\9e\98á\9e½á\9e\99á\9e\93á\9e¹á\9e\84á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e\85á\9f\92á\9e\85á\9e»á\9e\94á\9f\92á\9e\94á\9e\93á\9f\92á\9e\93, <strong>({{int:last}})</strong> = á\9e\97á\9e¶á\9e\96á\9e\81á\9e»á\9e\9fá\9e\82á\9f\92á\9e\93á\9e¶á\9e\87á\9e¶á\9e\98á\9e½á\9e\99á\9e\93á\9e¹á\9e\84á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\98á\9e»á\9e\93, <strong>{{int:minoreditletter}}</strong> =  á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9e·á\9e\85á\9e\8fá\9e½á\9e\85á\9f\94",
        "history-fieldset-title": "ស្វែងរកកំណែប្រែ",
        "history-show-deleted": "តែកំណែប្រែលុបចោលប៉ុណ្ណោះ",
        "histfirst": "ចាស់ជាងគេ",
        "history-feed-description": "ប្រវត្តិនៃកំណែទំព័រនេះលើវិគី",
        "history-feed-item-nocomment": "ដោយ$1នៅវេលា$2",
        "history-feed-empty": "ទំព័រដែលអ្នកបានស្នើមិនមានទេ។\nប្រហែលជាវាត្រូវបានគេលុបចោលពីវីគីឬ​ត្រូវបានគេដាក់ឈ្មោះថ្មី។\nសូមសាក [[Special:Search|ស្វែងរកនៅក្នុងវិគី]] ដើម្បីរកទំព័រថ្មីដែលមានការទាក់ទិន។",
-       "rev-deleted-comment": "(ចំណារពន្យល់ត្រូវបានដកចេញ)",
+       "history-edit-tags": "កែប្រែស្លាករបស់កំណែដែលបានជ្រើសរើស",
+       "rev-deleted-comment": "(ចំណារពន្យល់ត្រូវបានលុបចេញ)",
        "rev-deleted-user": "(អត្តនាមត្រូវបានលុបចេញ)",
-       "rev-deleted-event": "(á\9e\9fá\9f\81á\9e\85á\9e\80á\9f\92á\9e\8aá\9e¸á\9e\9bá\9e\98á\9f\92á\9e¢á\9e·á\9e\8fá\9e¢á\9f\86á\9e\96á\9e¸á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e á\9f\81á\9e\8fá\9e»á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\8aá\9e\80ចេញ)",
+       "rev-deleted-event": "(á\9e\9fá\9f\81á\9e\85á\9e\80á\9f\92á\9e\8aá\9e¸á\9e\9bá\9e\98á\9f\92á\9e¢á\9e·á\9e\8fá\9e¢á\9f\86á\9e\96á\9e¸á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e á\9f\81á\9e\8fá\9e»á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\9bá\9e»á\9e\94ចេញ)",
        "rev-deleted-user-contribs": "[បានលុបចេញអត្តនាមឬអាសដ្ឋានIP នេះហើយ - ការកែប្រែលាក់មិនអោយអ្នករួមចំណែកដទៃមើលឃើញ]",
        "rev-deleted-text-permission": "កំណែ​ប្រែ​នៃ​ទំព័រ​នេះ​ត្រូវ​បាន'''​លុបចោល'''​។\nប្រហែល​ជា​មាន​ព័ត៌មាន​លម្អិត​នៅ​ក្នុង​[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} កំណត់​ហេតុ​នៃ​ការ​លុប​ចោល]។",
        "rev-deleted-text-unhide": "កំណែ​ប្រែ​នៃ​ទំព័រ​នេះ​ត្រូវ​បាន'''​លុបចោល'''​។\nប្រហែល​ជា​មាន​ព័ត៌មាន​លម្អិត​នៅ​ក្នុង​[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} កំណត់​ហេតុ​នៃ​ការ​លុបចោល​]។\nអ្នក​នៅ​តែ​អាច​[$1 មើល​កំណែ​នេះ​]ប្រសិន​បើ​អ្នក​ចង់​។",
        "revdelete-nooldid-text": "អ្នកមិនបានផ្ដល់កំណែគោលដៅសំរាប់អនុវត្តសកម្មភាពនេះ ឬកំណែគោលដៅដែលបានផ្ដល់អោយមិនមាន ឬអ្នកកំពុងព្យាយាមលាក់កំណែបច្ចុប្បន្ន។",
        "revdelete-no-file": "មិនមានឯកសារ​ដែលអ្នកចង់រកទេ។",
        "revdelete-show-file-confirm": "តើ​អ្នក​ប្រាកដ​ហើយ​ថា​អ្នក​ចង់​មើល​កំណែ​ប្រែ​ដែល​បាន​លុប​នៃ​ឯកសារ​ \"<nowiki>$1</nowiki>\" ពី $2 នៅ $3 ?",
-       "revdelete-show-file-submit": "បាទ / ចាស៎",
+       "revdelete-show-file-submit": "បាទ/ចាស៎",
        "logdelete-selected": "{{PLURAL:$1|ព្រឹត្តិការណ៍​កំណត់​ហេតុ​ដែលបាន​ជ្រើសយក}}:",
        "revdelete-suppress-text": "ការ​ហាមឃាត់​គួរ​ត្រូវ​បាន​អនុវត្តិ​លើ​ករណី​ដូច​ខាង​ក្រោម​នេះ​ប៉ុណ្ណោះ​៖\n* ព័ត៌មានបង្ខូចកេរ្ដិ៍ឈ្មោះធ្ងន់ធ្ងរ\n* ព័ត៌មាន​ផ្ទាល់​ខ្លួន​មិន​សមរម្យ​\n*: ''អាសយដ្ឋាននៃ​គេហដ្ឋាន​​ ​លេខ​ទូរស័ព្ទ និងលេខ​អត្តសញ្ញាណប័ណ្ឌជាដើម​''",
        "revdelete-legend": "ដាក់កំហិតគំហើញ",
        "revdelete-unsuppress": "ដកចេញការដាក់កំហិតលើកំណែដែលបានស្តារឡើងវិញ",
        "revdelete-log": "មូលហេតុ៖",
        "revdelete-submit": "អនុវត្តទៅលើ{{PLURAL:$1|កំណែ|កំណែទាំងឡាយ}}ដែលបានជ្រើសយក",
-       "revdelete-success": "'''បន្ទាន់សម័យគំហើញកំណែបានសម្រេច។'''",
-       "revdelete-failure": "'''មិន​អាចបន្ទាន់សម័យគំហើញនៃ​កំណែប្រែ​បាន​៖'''\n$1",
-       "logdelete-success": "'''បានកំណត់គំហើញកំណត់ហេតុដោយជោគជ័យ។'''",
-       "logdelete-failure": "'''មិន​អាចកំណត់គំហើញនៃ​កំណត់​ហេតុ​​បាន​៖'''\n$1",
+       "revdelete-success": "បន្ទាន់សម័យគំហើញកំណែបានសម្រេច។",
+       "revdelete-failure": "បន្ទាន់សម័យគំហើញនៃ​កំណែប្រែ​មិនបានសម្រេចទេ៖\n$1",
+       "logdelete-success": "កំណត់គំហើញកំណត់ហេតុបានសម្រេច។",
+       "logdelete-failure": "កំណត់គំហើញនៃ​កំណត់​ហេតុ​​មិនបានសម្រេចទេ៖\n$1",
        "revdel-restore": "ផ្លាស់ប្ដូរគំហើញ",
        "pagehist": "ប្រវត្តិទំព័រ",
        "deletedhist": "ប្រវត្តិដែលត្រូវបានលុប",
        "mergehistory-empty": "គ្មានកំណែណាមួយអាចច្របាច់បញ្ចូលគ្នាទេ។",
        "mergehistory-done": "$3 {{PLURAL:$3|កំណែ​​|កំណែ}}របស់$1 បានច្របាច់បញ្ចូល​​គ្នា​​ទៅ[[:$2]]បានសំរេចហើយ។",
        "mergehistory-fail": "មិនអាចធ្វើការច្របាច់ប្រវត្តិបញ្ចូលគ្នា។ សូមពិនិត្យទំព័រនេះ និងប៉ារ៉ាម៉ែត្រពេលវេលាឡើងវិញ។",
+       "mergehistory-fail-bad-timestamp": "ត្រាពេលវេលាមិនត្រឹមត្រូវ។",
+       "mergehistory-fail-invalid-source": "ទំព័រប្រភពមិនត្រឹមត្រូវ។",
+       "mergehistory-fail-invalid-dest": "ទំព័រគោលដៅមិនត្រឹមត្រូវ។",
        "mergehistory-no-source": "ទំព័រប្រភព $1 មិនមានទេ។",
        "mergehistory-no-destination": "ទំព័រគោលដៅ $1 មិនមានទេ។",
        "mergehistory-invalid-source": "ទំព័រប្រភពត្រូវតែមានចំណងជើងបានការ។",
        "showingresults": "ខាងក្រោមកំពុងបង្ហាញរហូតដល់ {{PLURAL:$1|'''១''' លទ្ឋផល|'''$1''' លទ្ឋផល}} ចាប់ផ្ដើមពីលេខ #'''$2'''។",
        "search-showingresults": "{{PLURAL:$4|លទ្ធផល <strong>$1</strong> របស់ <strong>$3</strong>|លទ្ធផល <strong>$1 - $2</strong> របស់ <strong>$3</strong>}}",
        "search-nonefound": "មិនមានលទ្ធផលណាមួយ​ត្រូវគ្នានឹងសំណើសុំនេះទេ",
+       "search-nonefound-thiswiki": "រកមិនឃើញលទ្ធផលត្រូវនឹងពាក្យដែលអ្នកចង់រកនៅក្នុងវិបសាយនេះទេ។",
        "powersearch-legend": "ស្វែងរកថ្នាក់ខ្ពស់",
        "powersearch-ns": "ស្វែងរកក្នុងលំហឈ្មោះ៖",
        "powersearch-togglelabel": "គូសធីក៖",
        "timezoneregion-indian": "មហាសមុទ្រឥណ្ឌា",
        "timezoneregion-pacific": "មហាសមុទ្រប៉ាស៊ីហ្វិក",
        "allowemail": "អនុញ្ញាតអោយអ្នកប្រើប្រាស់ដទៃទៀតផ្ញើអ៊ីមែលមកកាន់ខ្ញុំ",
-       "email-allow-new-users-label": "á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e·á\9e¢á\9f\84á\9e\99á\9e¢á\9f\92á\9e\93á\9e\80á\9e\91á\9e¾á\9e\94á\9e\85á\9f\81á\9f\87á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\90á\9f\92á\9e\98á\9e¸á\9f\97á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\98á\9e\80á\9e\80á\9e¶á\9e\93á\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86",
+       "email-allow-new-users-label": "អនុញ្ញាតអោយអ្នកទើបចេះប្រើថ្មីៗផ្ញើអ៊ីមែលមកកាន់ខ្ញុំ",
        "email-blacklist-label": "ហាមឃាត់អ្នកប្រើប្រាស់ទាំងនេះកុំអោយផ្ញើអ៊ីមែលមកកាន់ខ្ញុំ៖",
        "prefs-searchoptions": "ស្វែងរក",
        "prefs-namespaces": "លំហឈ្មោះ",
        "default": "លំនាំដើម",
        "prefs-files": "ឯកសារ",
-       "prefs-custom-css": "CSS កែសម្រួល",
-       "prefs-custom-js": "JavaScript កែសម្រួល",
-       "prefs-common-css-js": "CSS/JavaScriptá\9e\9aá\9e½á\9e\98á\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\9fá\9f\86á\9e\94á\9e\80á\9e\91á\9e¶á\9f\86á\9e\84á\9e¢á\9e\9fá\9f\8b",
-       "prefs-reset-intro": "á\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e¢á\9e¶á\9e\85â\80\8bá\9e\94á\9f\92á\9e\9aá\9e¾â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e¡á\9e¾á\9e\84â\80\8bá\9e\9cá\9e·á\9e\89â\80\8bá\9e\93á\9e¼á\9e\9câ\80\8bá\9e\85á\9f\86á\9e\8eá\9e¼á\9e\9bâ\80\8bá\9e\85á\9e·á\9e\8fá\9f\92á\9e\8fâ\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bâ\80\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\8aá\9e¼á\9e\85â\80\8bá\9e\9bá\9f\86á\9e\93á\9e¶á\9f\86â\80\8bá\9e\8aá\9e¾á\9e\98â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bâ\80\8bá\9e\8fá\9f\86á\9e\94á\9e\93á\9f\8bâ\80\8bá\9e\9cá\9e·á\9e\89â\80\8bá\9f\94\ná\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96â\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\98á\9e·á\9e\93â\80\8bá\9e¢á\9e¶á\9e\85â\80\8bá\9e\92á\9f\92á\9e\9cá\9e¾â\80\8bá\9e¡á\9e¾á\9e\84â\80\8bá\9e\9cá\9e·á\9e\89â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\91á\9f\81â\80\8bá\9f\94",
+       "prefs-custom-css": "CSSកម្លាយ",
+       "prefs-custom-js": "JavaScriptកម្លាយ",
+       "prefs-common-css-js": "CSS/JavaScriptá\9e\9aá\9e½á\9e\98á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\9fá\9f\86á\9e\94á\9e\80á\9e\91á\9e¶á\9f\86á\9e\84á\9e¢á\9e\9fá\9f\8bá\9f\96",
+       "prefs-reset-intro": "á\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e¢á\9e¶á\9e\85â\80\8bá\9e\94á\9f\92á\9e\9aá\9e¾â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\85á\9f\86á\9e\8eá\9e\84á\9f\8bá\9e\85á\9f\86á\9e\8eá\9e¼á\9e\9bâ\80\8bá\9e\85á\9e·á\9e\8fá\9f\92á\9e\8fâ\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bâ\80\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\8aá\9e¼á\9e\85â\80\8bá\9e\9bá\9f\86á\9e\93á\9e¶á\9f\86â\80\8bá\9e\8aá\9e¾á\9e\98â\80\8bá\9e¡á\9e¾á\9e\84â\80\8bá\9e\9cá\9e·á\9e\89â\80\8bá\9f\94\ná\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96â\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\98á\9e·á\9e\93â\80\8bá\9e¢á\9e¶á\9e\85â\80\8bá\9e\88á\9e\94á\9f\8bá\9e\92á\9f\92á\9e\9cá\9e¾â\80\8bá\9e¡á\9e¾á\9e\84â\80\8bá\9e\9cá\9e·á\9e\89â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\91á\9f\81â\80\8bá\9f\94",
        "prefs-emailconfirm-label": "បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖",
        "youremail": "អ៊ីមែល៖",
        "username": "{{GENDER:$1|អត្តនាម}}៖",
        "yourvariant": "ជម្រើសសណ្ដានភាសាខ្លឹមសារ៖",
        "prefs-help-variant": "សណ្ដានភាសាដែលអ្នកចង់ប្រើសម្រាប់បង្ហាញខ្លឹមសារទំព័រក្នុងវិគីនេះ។",
        "yournick": "ហត្ថលេខាថ្មី៖",
-       "prefs-help-signature": "á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\9cá\9e·á\9e\85á\9e¶á\9e\9aá\9e\93á\9f\85á\9e\9bá\9e¾á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\93á\9e¶á\9e\93á\9e¶â\80\8bá\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\98á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e á\9e\8fá\9f\92á\9e\90á\9e\9bá\9f\81á\9e\81á\9e¶á\9e\8aá\9f\84á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾ \"<nowiki>~~~~</nowiki>\" á\9e\8aá\9f\82á\9e\9bá\9e\93á\9e¹á\9e\84á\9e\94á\9f\86លែង​ចេញជាហត្ថលេខា​របស់អ្នក​ជាមួយនឹងកាលបរិច្ឆេទ។",
+       "prefs-help-signature": "á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\98á\9e\8fá\9e·á\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bá\9e\93á\9f\85á\9e\9bá\9e¾á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\93á\9e¶á\9e\93á\9e¶â\80\8bá\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\98á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e á\9e\8fá\9f\92á\9e\90á\9e\9bá\9f\81á\9e\81á\9e¶á\9e\8aá\9f\84á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\89á\9f\92á\9e\89á\9e¶ \"<nowiki>~~~~</nowiki>\" á\9e\8aá\9f\82á\9e\9bá\9e\93á\9e¹á\9e\84á\9e\94á\9f\86á\9e\94á\9f\92លែង​ចេញជាហត្ថលេខា​របស់អ្នក​ជាមួយនឹងកាលបរិច្ឆេទ។",
        "badsig": "ហត្ថលេខាឆៅមិនត្រឹមត្រូវ។សូមពិនិត្យមើលស្លាក​ HTML ។",
        "badsiglength": "ហត្ថលេខារបស់អ្នកវែងជ្រុល។\n\nវាត្រូវតែមានតួអក្សរតិចជាង $1 {{PLURAL:$1|តួ|តួ}}។",
        "yourgender": "ភេទ៖",
        "prefs-dateformat": "ទម្រង់កាលបរិច្ឆេទ",
        "prefs-timeoffset": "គម្លាតម៉ោង",
        "prefs-advancedediting": "ជម្រើសទូទៅ​",
-       "prefs-editor": "á\9e¢á\9f\92á\9e\93á\9e\80កែប្រែ",
-       "prefs-preview": "មើលជាមុន",
+       "prefs-editor": "á\9e§á\9e\94á\9e\80á\9e\9aá\9e\8eá\9f\8dកែប្រែ",
+       "prefs-preview": "á\9e§á\9e\94á\9e\80á\9e\9aá\9e\8eá\9f\8dá\9e\98á\9e¾á\9e\9bá\9e\87á\9e¶á\9e\98á\9e»á\9e\93",
        "prefs-advancedrc": "ជម្រើសថ្នាក់ខ្ពស់",
+       "prefs-opt-out": "ជម្រើសមិនប្រើមុខងារជឿនលឿន",
        "prefs-advancedrendering": "ជម្រើសថ្នាក់ខ្ពស់",
        "prefs-advancedsearchoptions": "ជម្រើសថ្នាក់ខ្ពស់",
        "prefs-advancedwatchlist": "ជម្រើសថ្នាក់ខ្ពស់",
        "userrights-user-editname": "បញ្ចូលអត្តនាម៖",
        "editusergroup": "ផ្ទុកក្រុមអ្នកប្រើប្រាស់",
        "editinguser": "ប្ដូរសិទ្ធិរបស់{{GENDER:$1|អ្នកប្រើប្រាស់}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "កំពុងមើលសិទ្ធិរបស់ {{GENDER:$1|អ្នកប្រើប្រាស់}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "កែប្រែក្រុម{{GENDER:$1|អ្នកប្រើប្រាស់}}",
-       "saveusergroups": "រក្សាក្រុម{{GENDER:$1|អ្នកប្រើប្រាស់}}ទុក",
-       "userrights-groupsmember": "ក្រុមសមាជិកភាព៖",
+       "userrights-viewusergroup": "មើលក្រុម{{GENDER:$1|អ្នកប្រើប្រាស់}}",
+       "saveusergroups": "រក្សាទុកក្រុម{{GENDER:$1|អ្នកប្រើប្រាស់}}",
+       "userrights-groupsmember": "សមាជិករបស់៖",
        "userrights-groupsmember-auto": "សមាជិកស្វ័យប្រវត្តិរបស់៖",
-       "userrights-groups-help": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\93á\9e¶á\9e\93á\9e¶á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\93á\9f\85á\9f\96\n* á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\82á\9e¼á\9e\9fá\9e\92á\9e¸á\9e\80á\9e\98á\9e¶á\9e\93á\9e\93á\9f\90á\9e\99á\9e\90á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\9fá\9f\92á\9e\90á\9e·á\9e\8fá\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\93á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e á\9e¾á\9e\99\n* á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\82á\9e¼á\9e\9fá\9e\92á\9e¸á\9e\80á\9e\98á\9e¶á\9e\93á\9e\93á\9f\90á\9e\99á\9e\90á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\98á\9e·á\9e\93á\9e\9fá\9f\92á\9e\90á\9e·á\9e\8fá\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\93á\9f\84á\9f\87á\9e\91á\9f\81\n* á\9e\9fá\9e\89á\9f\92á\9e\89á\9e¶ * á\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\90á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\93á\9f\84á\9f\87á\9e\85á\9f\81á\9e\89á\9e\91á\9f\81á\9e\96á\9f\81á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93â\80\8bá\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98á\9e\9cá\9e¶á\9e á\9e¾á\9e\99á\9f\94",
+       "userrights-groups-help": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\93á\9e¶á\9e\93á\9e¶á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\93á\9f\85á\9f\96\n* á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\82á\9e¼á\9e\9fá\9e\92á\9e¸á\9e\80á\9e\98á\9e¶á\9e\93á\9e\93á\9f\90á\9e\99á\9e\90á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\9fá\9f\92á\9e\90á\9e·á\9e\8fá\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\93á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e á\9e¾á\9e\99á\9f\94\n* á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\82á\9e¼á\9e\9fá\9e\92á\9e¸á\9e\80á\9e\98á\9e¶á\9e\93á\9e\93á\9f\90á\9e\99á\9e\90á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\98á\9e·á\9e\93á\9e\9fá\9f\92á\9e\90á\9e·á\9e\8fá\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\93á\9f\84á\9f\87á\9e\91á\9f\81á\9f\94\n* á\9e\9fá\9e\89á\9f\92á\9e\89á\9e¶ * á\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\90á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\85á\9e¼á\9e\9bá\9e¬á\9e\8aá\9e\80á\9e\85á\9f\81á\9e\89á\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\93á\9f\84á\9f\87á\9e\85á\9f\81á\9e\89á\9e\91á\9f\81á\9e\96á\9f\81á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93â\80\8bá\9e\92á\9f\92á\9e\9cá\9e¾á\9e\9cá\9e¶á\9e\98á\9f\92á\9e\8aá\9e\84á\9e á\9e¾á\9e\99á\9f\94\n* á\9e\9fá\9e\89á\9f\92á\9e\89á\9e¶ # á\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\90á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\82á\9e\80á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\93á\9f\92á\9e\90á\9e\99á\9e\9aá\9e\99á\9f\88á\9e\96á\9f\81á\9e\9bá\9e\95á\9e»á\9e\8fá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9fá\9e\98á\9e¶á\9e\87á\9e·á\9e\80á\9e\97á\9e¶á\9e\96á\9e\80á\9f\92á\9e\9aá\9e»á\9e\98á\9e\93á\9f\81á\9f\87 á\9e\8fá\9f\82á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\96á\9e\93á\9f\92á\9e\99á\9e¶á\9e\94á\9e¶á\9e\93á\9e\91á\9f\81",
        "userrights-reason": "មូលហេតុ៖",
        "userrights-no-interwiki": "អ្នកគ្មានការអនុញ្ញាតកែប្រែសិទ្ធិរបស់អ្នកប្រើប្រាស់លើវិគីផ្សេងទេ។",
        "userrights-nodatabase": "មូលដ្ឋានទិន្នន័យ $1 មិនមាន ឬ ស្ថិតនៅខាងក្រៅ។",
        "right-siteadmin": "ចាក់សោនិងបើកសោមូលដ្ឋានទិន្នន័យ",
        "right-override-export-depth": "នាំចេញទំព័ររួមទាំងទំព័រដែលមានភ្ជាប់តំណភ្ជាប់​រហូតដល់លំដាប់ទី៥",
        "right-sendemail": "ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើដទៃ",
+       "grant-createaccount": "បង្កើតគណនី",
+       "grant-basic": "សិទ្ធិបឋម",
+       "grant-viewdeleted": "មើលឯកសារនិងទំព័រដែលបានលុបចោល",
+       "grant-viewmywatchlist": "មើលបញ្ជីតាមដានរបស់អ្នក",
        "newuserlogpage": "កំណត់ហេតុនៃការបង្កើតគណនី",
        "newuserlogpagetext": "នេះជាកំណត់ហេតុនៃការបង្កើតអ្នកប្រើប្រាស់។",
        "rightslog": "កំណត់ហេតុនៃការប្តូរសិទ្ធិអ្នកប្រើប្រាស់",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|គិតតាំងពីការបើកមើលចុងក្រោយ}}",
        "enhancedrc-history": "ប្រវត្តិ",
        "recentchanges": "បន្លាស់ប្ដូរថ្មីៗ",
-       "recentchanges-legend": "ជម្រើសនានា​ សម្រាប់ការបង្ហាញបន្លាស់ប្ដូរថ្មីៗ",
-       "recentchanges-summary": "á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\90á\9f\92á\9e\98á\9e¸á\9f\97á\9e\94á\9f\86á\9e\95á\9e»á\9e\8fá\9e\85á\9f\86á\9e\96á\9f\84á\9f\87á\9e\9cá\9e·á\9e\82á\9e¸នៅលើទំព័រនេះ។",
+       "recentchanges-legend": "ជម្រើសនានា​សម្រាប់ការបង្ហាញបន្លាស់ប្ដូរថ្មីៗ",
+       "recentchanges-summary": "á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\90á\9f\92á\9e\98á\9e¸á\9f\97á\9e\94á\9f\86á\9e\95á\9e»á\9e\8fá\9e\85á\9f\86á\9e\96á\9f\84á\9f\87á\9e\9cá\9e·á\9e\82á\9e¸á\9e\93á\9f\81á\9f\87នៅលើទំព័រនេះ។",
        "recentchanges-noresult": "គ្មានកំណែប្រែក្នុងរយៈពេលដែលបានផ្ដល់អោយដែលត្រូវនឹងលក្ខខណ្ឌទាំងនេះទេ។",
        "recentchanges-feed-description": "តាមដាន​បន្លាស់ប្ដូរថ្មីៗ​បំផុត​នៃ​វិគី​នេះក្នុង​មតិព័ត៌មាន​នេះ​។",
        "recentchanges-label-newpage": "ការកែប្រែនេះបានបង្កើតទំព័រថ្មីមួយ",
        "rcshowhidemine": "$1កំណែប្រែរបស់ខ្ញុំ",
        "rcshowhidemine-show": "បង្ហាញ",
        "rcshowhidemine-hide": "លាក់",
+       "rcshowhidecategorization": "$1 ការដាក់ដកចំណាត់ថ្នាក់ក្រុមទំព័រ",
        "rcshowhidecategorization-show": "បង្ហាញ​",
        "rcshowhidecategorization-hide": "លាក់",
        "rclinks": "បង្ហាញបន្លាស់ប្ដូរ$1ចុងក្រោយ ដែលធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ",
        "newpageletter": "ថ្មី",
        "boteditletter": "យន្ត",
        "number_of_watching_users_pageview": "[មាន{{PLURAL:$1|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}}$1នាក់កំពុងមើល]",
-       "rc_categories": "កំហិតត្រឹមចំណាត់ថ្នាក់ក្រុម(ខណ្ឌដោយសញ្ញា \"|\")៖",
-       "rc_categories_any": "មួយណាក៏បាន",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|បៃ|បៃ}} បន្ទាប់ពីបន្លាស់ប្ដូរ",
        "newsectionsummary": "/* $1 */ ផ្នែកថ្មី",
-       "rc-enhanced-expand": "á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9f\86អិត",
-       "rc-enhanced-hide": "á\9e\9bá\9e¶á\9e\80á\9f\8bá\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9f\86អិត",
-       "rc-old-title": "បង្កើតឡើងដំបូងដោយ \"$1\"",
+       "rc-enhanced-expand": "á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9e\98á\9f\92អិត",
+       "rc-enhanced-hide": "á\9e\9bá\9e¶á\9e\80á\9f\8bá\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9e\98á\9f\92អិត",
+       "rc-old-title": "បង្កើតឡើងដំបូងដោយ «$1»",
        "recentchangeslinked": "បន្លាស់ប្ដូរពាក់ព័ន្ធ",
        "recentchangeslinked-feed": "បន្លាស់ប្ដូរពាក់ព័ន្ធ",
        "recentchangeslinked-toolbox": "បន្លាស់ប្ដូរពាក់ព័ន្ធ",
-       "recentchangeslinked-title": "បន្លាស់ប្ដូរ​ពាក់ព័ន្ធនឹង \"$1\"",
+       "recentchangeslinked-title": "បន្លាស់ប្ដូរ​ពាក់ព័ន្ធនឹង «$1»",
        "recentchangeslinked-summary": "នេះជាបញ្ជីបន្លាស់ប្ដូរនានា ដែលត្រូវបានធ្វើឡើងនៅលើទំព័រទាំងឡាយ ដែលមានតំណភ្ជាប់ពីទំព័រកំណត់មួយ(ឬ មានតំណភ្ជាប់ទៅទំព័រ ដែលមានក្នុងចំណាត់ថ្នាក់ក្រុមណាមួយ) នាពេលថ្មីៗនេះ ។ ទំព័រ​នានាក្នុង[[Special:Watchlist|បញ្ជីតាមដាន​របស់អ្នក]]ត្រូវបានសរសេរជា '''អក្សរដិត''' ។",
        "recentchangeslinked-page": "ឈ្មោះទំព័រ៖",
        "recentchangeslinked-to": "បង្ហាញ​បន្លាស់ប្ដូររបស់​ទំព័រដែល​មានតំណភ្ជាប់នឹង​ទំព័រ​ដែល​បាន​ផ្ដល់​ឱ្យ​​វិញ",
        "upload-http-error": "មានកំហុសHTTPមួយបានកើតឡើង៖ $1",
        "upload-dialog-title": "ផ្ទុកឯកសារឡើង",
        "upload-dialog-button-cancel": "បោះបង់",
+       "upload-dialog-button-back": "ត្រឡប់ក្រោយ",
        "upload-dialog-button-done": "រួចរាល់",
        "upload-dialog-button-save": "រក្សាទុក",
        "upload-dialog-button-upload": "ផ្ទុកឡើង",
        "listfiles_count": "កំណែ",
        "listfiles-show-all": "រាប់បញ្ចូលទាំងកំណែចាស់ៗរបស់រូបភាព",
        "listfiles-latestversion": "កំណែបច្ចុប្បន្ន",
-       "listfiles-latestversion-yes": "បាទ / ចាស៎",
+       "listfiles-latestversion-yes": "បាទ/ចាស៎",
        "listfiles-latestversion-no": "ទេ",
        "file-anchor-link": "ឯកសារ",
        "filehist": "ប្រវត្តិ​ឯកសារ",
        "mostrevisions": "អត្ថបទដែលត្រូវបានកែប្រែច្រើនបំផុត",
        "prefixindex": "ទំព័រ​ទាំង​អស់​ជាមួយ​បុព្វបទ",
        "prefixindex-namespace": "ទំព័រទាំងអស់ដែលមានបុព្វបទ (លំហឈ្មោះ $1)",
+       "prefixindex-submit": "បង្ហាញ",
        "prefixindex-strip": "កាត់ចោលបុព្វបទក្នុងបញ្ជី",
        "shortpages": "ទំព័រខ្លីៗ",
        "longpages": "ទំព័រវែងៗ",
        "usereditcount": "$1 {{PLURAL:$1|កំណែប្រែ|កំណែប្រែ}}",
        "usercreated": "{{GENDER:$3|បានបង្កើត}}នៅ$1  $2",
        "newpages": "ទំព័រថ្មីៗ",
+       "newpages-submit": "បង្ហាញ",
        "newpages-username": "អត្តនាម៖",
        "ancientpages": "ទំព័រ​ចាស់ៗ",
        "move": "ប្ដូរទីតាំង",
        "querypage-disabled": "ទំព័រពិសេសនេះត្រូវបានបិទមិនអោយប្រើដោយសារមូលហេតុដំណើរការ។",
        "apihelp": "ជំនួយAPI",
        "apihelp-no-such-module": "រកមិនឃើញម៉ូឌុល \"$1\" ទេ។",
+       "apisandbox-unfullscreen": "បង្ហាញទំព័រ",
        "apisandbox-submit": "ដាក់សំណើ",
        "apisandbox-reset": "ជម្រះ",
        "apisandbox-examples": "ឧទាហរណ៍",
        "specialloguserlabel": "អ្នកប្រព្រឹត្តិ៖",
        "speciallogtitlelabel": "គោលដៅ (ចំណងជើងអត្ថបទឬអត្តនាមអ្នកប្រើប្រាស់)៖",
        "log": "កំណត់ហេតុ",
+       "logeventslist-submit": "បង្ហាញ",
        "all-logs-page": "កំណត់ហេតុសាធារណៈទាំងអស់",
        "alllogstext": "ការបង្ហាញកំណត់ហេតុទាំងអស់របស់{{SITENAME}}។\n\nអ្នកអាចបង្រួមការបង្ហាញដោយជ្រើសរើសប្រភេទកំណត់ហេតុ អត្តនាម ឬ ទំព័រពាក់ព័ន្ធ។",
        "logempty": "គ្មានអ្វីក្នុងកំណត់ហេតុដែលត្រូវនឹងអ្វីដែលអ្នកចង់រកទេ។",
        "allpages-hide-redirects": "លាក់ការបញ្ជូនបន្ត",
        "cachedspecial-refresh-now": "មើ់លកំណែថ្មីបំផុត។",
        "categories": "ចំណាត់ថ្នាក់ក្រុម",
+       "categories-submit": "បង្ហាញ",
        "categoriespagetext": "{{PLURAL:$1|ចំណាត់ថ្នាក់ក្រុម|ចំណាត់ថ្នាក់ក្រុម}}ខាងក្រោមនេះមានអត្ថបទឬមេឌា។\n[[Special:UnusedCategories|ចំណាត់ថ្នាក់ក្រុមមិនប្រើ]]ត្រូវបានបង្ហាញទីនេះ។\nសូមមើលផងដែរ [[Special:WantedCategories|ចំណាត់ថ្នាក់ក្រុមដែលគ្រប់គ្នាចង់បាន]]។",
        "categoriesfrom": "បង្ហាញចំណាត់ថ្នាក់ក្រុមចាប់ផ្តើមដោយ៖",
        "deletedcontributions": "ការរួមចំណែកដែលត្រូវបានលុបចោល",
        "wlheader-showupdated": "ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''។",
        "wlnote": "ខាងក្រោមនេះ {{PLURAL:$1|ជាបន្លាស់ប្ដូរចុងក្រោយ|ជាបន្លាស់ប្ដូរចុងក្រោយចំនួន <strong>$1</strong>}} នៅក្នុងរយៈពេល{{PLURAL:$2|១ម៉ោង|<strong>$2</strong> ម៉ោង}} គិតចាប់ពីម៉ោង $4 ថ្ងៃ $3។",
        "wlshowlast": "បង្ហាញ $1ម៉ោងចុងក្រោយ $2ថ្ងៃចុងក្រោយ",
+       "watchlist-hide": "លាក់",
+       "watchlist-submit": "បង្ហាញ",
        "watchlist-options": "ជម្រើសនានាក្នុងបញ្ជីតាមដាន",
        "watching": "កំពុង​តាមដាន...",
        "unwatching": "ឈប់​តាមដាន...",
        "delete-confirm": "លុប\"$1\"ចោល",
        "delete-legend": "លុបចោល",
        "historywarning": "'''ប្រយ័ត្ន​៖''' ទំព័រដែលអ្នកបំរុងនឹងលុប មានប្រវត្តិ​ចំនួនប្រហែល $1 {{PLURAL:$1|កំណែ|កំណែ}}៖",
+       "historyaction-submit": "បង្ហាញ",
        "confirmdeletetext": "អ្នកប្រុងនឹងលុបចោលទាំងស្រុង នូវទំព័រមួយដោយរួមបញ្ចូលទាំងប្រវត្តិកែប្រែរបស់វាផង។\nសូមអ្នកអះអាងថា អ្នកពិតជាមានចេតនាធ្វើបែបហ្នឹង និងថាអ្នកបានយល់ច្បាស់ពីផលវិបាកទាំងឡាយដែលអាចកើតមាន និង​សូមអះអាងថា អ្នកធ្វើស្របតាម [[{{MediaWiki:Policy-url}}|គោលការណ៍]]។",
        "actioncomplete": "សកម្មភាពបានសម្រេច",
        "actionfailed": "សកម្មភាព​មិនបានសម្រេច",
        "editcomment": "ចំណារពន្យល់ពីការកែប្រែគឺ៖ <em>$1</em>។",
        "revertpage": "បានត្រឡប់កំណែប្រែដោយ[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ទៅកំណែប្រែចុងក្រោយដោយ [[User:$1|$1]]",
        "rollback-success": "កំណែ​ដែល​ត្រូវ​បាន​ត្រឡប់​ដោយ​ $1។\nបាន​ផ្លាស់​ប្ដូរ​ទៅ​កំណែ​ចុង​ក្រោយ​វិញ​ដោយ $2។",
+       "changecontentmodel-reason-label": "មូលហេតុ៖",
        "protectlogpage": "កំណត់ហេតុនៃការការពារ",
        "protectlogtext": "ខាងក្រោមនេះជាបញ្ជីនៃទំព័រដែលត្រូវបានចាក់សោនិងដោះសោ។\n\nសូមមើល [[Special:ProtectedPages|បញ្ជីទំព័រត្រូវបានការពារ]] សម្រាប់បញ្ជីការការពារទំព័រដែលកំពុងនៅមានសុពលភាពនៅពេលនេះ។",
        "protectedarticle": "បានការពារ\"[[$1]]\"",
        "undelete-error-short": "បញ្ហាក្នុងការស្ដារឯកសារ ៖  $1",
        "undelete-error-long": "កំហុសផ្សេងៗបានកើតឡើងក្នុងពេលកំពុងឈប់លុបឯកសារនេះ៖\n$1",
        "undelete-show-file-confirm": "តើអ្នកប្រាកដហើយថាអ្នកពិតជាចង់មើលកំណែដែលត្រូវបានលុបចោលរបស់ឯកសារ \"<nowiki>$1</nowiki>\" ពីថ្ងៃ $2 ម៉ោង $3?",
-       "undelete-show-file-submit": "បាទ/ចាស",
+       "undelete-show-file-submit": "បាទ/ចាស",
        "namespace": "លំហឈ្មោះ:",
        "invert": "ក្រៅពីនោះ",
        "tooltip-invert": "គូសធីកប្រអប់នេះដើម្បីលាក់កំណែប្រែរបស់ទំព័រដែលស្ថិតនៅក្នុងលំហឈ្មោះដែលបានជ្រើសយក (និងលំហឈ្មោះដែលទាក់ទិន ប្រសិនបើគូសធីក)",
        "unlockdb": "ដោះសោមូលដ្ឋានទិន្នន័យ",
        "lockdbtext": "ការ​ចាក់សោ​មូលដ្ឋាន​ទិន្នន័យ​នឹង​ផ្អាក​មិន​ឱ្យ​អ្នកប្រើប្រាស់​ទាំងអស់​ធ្វើការ​កែប្រែ​ទំព័រ​នានា ផ្លាស់ប្ដូរ​ចំណូលចិត្ត​របស់​ពួកគេ កែប្រែ​បញ្ជីតាមដាន​របស់​ពួកគេ និង​ធ្វើ​អ្វីៗ​ទាំងឡាយ​ណា​ដែល​ត្រូវការ​ការ​កែប្រែ​នៅក្នុង​មូលដ្ឋាន​ទិន្នន័យ​នេះ​។\n\nសូម​អះអាង​ថា​នេះ​ពិតជា​អ្វី​ដែល​អ្នក​ចង់​ធ្វើ ហើយ​ថា​អ្នក​នឹង​ដោះ​សោ​មូលដ្ឋាន​ទិន្នន័យ​វិញ​នៅ​ពេល​ដែល​ការថែទាំ​របស់​អ្នក​បាន​បញ្ចប់​។",
        "unlockdbtext": "ការ​ដោះ​សោ​មូលដ្ឋាន​ទិន្នន័យ​នឹង​ផ្ដល់​លទ្ធភាព​ឱ្យ​អ្នកប្រើប្រាស់​ទាំងអស់​ធ្វើការ​កែប្រែ​ទំព័រ​នានា ផ្លាស់ប្ដូរ​ចំណូលចិត្ត​របស់​ពួកគេ កែប្រែ​បញ្ជីតាមដាន​របស់​ពួកគេ និង​ធ្វើ​អ្វីៗទាំងឡាយ​ណា​ដែល​ត្រូវការ​ការ​កែប្រែ​នៅក្នុង​មូលដ្ឋាន​ទិន្នន័យនេះ​។\n\nសូម​អះអាង​ថា​នេះ​ពិតជា​អ្វី​ដែល​អ្នក​ចង់​ធ្វើ​។",
-       "lockconfirm": "បាទ/ចាស, ខ្ញុំពិតជាចង់ចាក់សោមូលដ្ឋានទិន្នន័យមែន។",
-       "unlockconfirm": "បាទ/ចាស, ខ្ញុំពិតជាចង់ដោះសោមូលដ្ឋានទិន្នន័យមែន។",
+       "lockconfirm": "បាទ/ចាស, ខ្ញុំពិតជាចង់ចាក់សោមូលដ្ឋានទិន្នន័យមែន។",
+       "unlockconfirm": "បាទ/ចាស, ខ្ញុំពិតជាចង់ដោះសោមូលដ្ឋានទិន្នន័យមែន។",
        "lockbtn": "ចាក់សោមូលដ្ឋានទិន្នន័យ",
        "unlockbtn": "ដោះសោមូលដ្ឋានទិន្នន័យ",
        "locknoconfirm": "អ្នកមិនបានពិនិត្យមើលប្រអប់បញ្ជាក់ទទួលស្គាល់ទេ។",
        "import-interwiki-templates": "រាប់​បញ្ចូល​ទំព័រគំរូ​ទាំងអស់​",
        "import-interwiki-submit": "នាំចូល",
        "import-upload-filename": "ឈ្មោះ​ឯកសារ​​៖",
-       "import-comment": "យោបល់៖",
+       "import-comment": "á\9e\98á\9e\8fá\9e·á\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bá\9f\96",
        "importtext": "សូមនាំចេញឯកសារនេះពីវិគីប្រភពដោយប្រើប្រាស់[[Special:Export|ឧបករណ៍នាំចេញ]]។\nរក្សាវាទុកទៅក្នុងកុំព្យូទ័ររបស់អ្នករួចផ្ទុកវាឡើងនៅទីនេះ។",
        "importstart": "កំពុងនាំចូលទំព័រ...",
        "import-revision-count": "$1 {{PLURAL:$1|កំណែ}}",
        "importnopages": "គ្មានទំព័រត្រូវនាំចូលទេ។",
-       "importfailed": "ការនាំចូល ត្រូវបរាជ័យ ៖ <nowiki>$1</nowiki>",
-       "importunknownsource": "មិនស្គាល់ ប្រភេទ នៃប្រភពនាំចូល",
-       "importcantopen": "មិនអាចបើក ឯកសារនាំចូល",
+       "imported-log-entries": "បាននាំចូល{{PLURAL:$1|កំណត់ហេតុ|កំណត់ហេតុ}}ចំនួន$1។",
+       "importfailed": "ការនាំចូលមិនបានសម្រេច ៖ <nowiki>$1</nowiki>",
+       "importunknownsource": "មិនស្គាល់ប្រភេទនៃប្រភពនាំចូល",
+       "importcantopen": "បើកឯកសារនាំចូលមិនបាន",
        "importbadinterwiki": "តំណភ្ជាប់អន្តរវិគីមិនត្រឹមត្រូវ",
-       "importsuccess": "នាំចូល ត្រូវបានបញ្ចប់!",
+       "importsuccess": "នាំចូលចប់!",
        "importnofile": "គ្មានឯកសារនាំចូល មួយណា ត្រូវបាន ផ្ទុកឡើង​។",
        "importuploaderrorsize": "ការផ្ទុកឡើងឯកសារនាំចូលបានបរាជ័យ។ ឯកសារនេះមានទំហំធំជាងទំហំដែលគេអនុញ្ញាតឱ្យផ្ទុកឡើង។",
        "importuploaderrorpartial": "ការផ្ទុកឡើងឯកសារនាំចូលបានបរាជ័យ។ ឯកសារនេះត្រូវបានផ្ទុកឡើងបានទើបតែមួយផ្នែកប៉ុណ្ណោះ។",
        "tooltip-pt-preferences": "ចំណង់ចំណូលចិត្ត{{GENDER:|របស់អ្នក}}",
        "tooltip-pt-watchlist": "បញ្ជី​នៃ​ទំព័រ​ដែលអ្នកកំពុង​ត្រួតពិនិត្យ​រក​បន្លាស់ប្ដូរ",
        "tooltip-pt-mycontris": "បញ្ជី​នៃ​ការរួមចំណែក​{{GENDER:|របស់​អ្នក}}",
+       "tooltip-pt-anoncontribs": "បញ្ជីកំណែប្រែធ្វើឡើងពីអាសយដ្ឋាន IP នេះ",
        "tooltip-pt-login": "អ្នកត្រូវបានលើកទឹកចិត្តឱ្យកត់ឈ្មោះចូល។ ប៉ុន្តែនេះមិនមែនជាការបង្ខំទេ។",
+       "tooltip-pt-login-private": "អ្នកត្រូវតែកត់ឈ្មោះចូលដើម្បីប្រើវិគីនេះ",
        "tooltip-pt-logout": "កត់ឈ្មោះចេញ",
        "tooltip-pt-createaccount": "អ្នកត្រូវបានលើកទឹកចិត្តបង្កើតគណនីនិងកត់ឈ្មោះចូល។ ប៉ុន្តែនេះមិនមែនជាការបង្ខំទេ។",
        "tooltip-ca-talk": "ការពិភាក្សា​អំពីទំព័រខ្លឹមសារ​នេះ",
        "tooltip-ca-nstab-category": "មើល​ទំព័រ​ចំណាត់ថ្នាក់ក្រុម",
        "tooltip-minoredit": "ចំណាំ​កំណែប្រែនេះ​ថាជា 'កំណែប្រែ​តិចតួច'",
        "tooltip-save": "រក្សាបន្លាស់ប្ដូររបស់អ្នកទុក",
+       "tooltip-publish": "បោះផ្សាយបន្លាស់ប្ដូររបស់អ្នក",
        "tooltip-preview": "មើល​បន្លាស់ប្ដូរ​របស់អ្នកជាមុន។ សូមប្រើប្រាស់​វា​មុននឹង​រក្សាទុក!",
        "tooltip-diff": "បង្ហាញ​បន្លាស់ប្ដូរ​ដែលអ្នកបានធ្វើ​​លើអត្ថបទ",
        "tooltip-compareselectedversions": "មើលភាពខុសគ្នា​រវាងកំណែ​ទាំង២របស់ទំព័រ​នេះ។",
        "tooltip-rollback": "\"ត្រឡប់​\"កំណែ​ប្រែ​ធ្វើឡើងដោយអ្នក​រួម​ចំណែក​ចុង​ក្រោយ​គេ ទៅកំណែប្រែមុននោះវិញ​ ដោយគ្រាន់​តែ​ចុច​មួយ​ច្នុចប៉ុណ្ណោះ​",
        "tooltip-undo": "\"មិន​ធ្វើ​វិញ\"​ ត្រឡប់​កំណែ​នេះឡើង​វិញ​ និង​បើក​បែប​បទ​កែប្រែ​ក្នុង​ទម្រង់​មើល​ជាមុន​។\nអ្នកអាចបន្ថែម​មូល​ហេតុ​នៅ​ក្នុង​ចំណារពន្យល់​បាន។",
        "tooltip-preferences-save": "រក្សាទុកចំណង់ចំណូលចិត្ត",
-       "tooltip-summary": "á\9e\9fá\9e\9aá\9e\9fá\9f\81á\9e\9aá\9e\85á\9f\86á\9e\8eá\9e¶á\9e\9aá\9e\96á\9e\93á\9f\92á\9e\99á\9e\9bá\9f\8bá\9e\90á\9f\92á\9e\98ីមួយ",
+       "tooltip-summary": "á\9e\9fá\9e\9aá\9e\9fá\9f\81á\9e\9aá\9e\85á\9f\86á\9e\8eá\9e¶á\9e\9aá\9e\96á\9e\93á\9f\92á\9e\99á\9e\9bá\9f\8bá\9e\81á\9f\92á\9e\9bីមួយ",
        "common.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */",
        "anonymous": "{{PLURAL:$1|user|អ្នកប្រើប្រាស់}}អនាមិកនៃ {{SITENAME}}",
        "siteuser": "អ្នកប្រើប្រាស់{{SITENAME}} $1",
        "anonuser": "អ្នកប្រើប្រាស់{{SITENAME}}អនាមិក $1",
-       "lastmodifiedatby": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\85á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\99á\9e\8aá\9f\84á\9e\99 $3 á\9e\93á\9f\85á\9e\9cá\9f\81á\9e\9bá\9e¶ $2,$1។",
+       "lastmodifiedatby": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\85á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\99á\9e\8aá\9f\84á\9e\99 $3 á\9e\93á\9f\85á\9e\9cá\9f\81á\9e\9bá\9e¶ $2 $1។",
        "othercontribs": "ផ្អែកលើការងាររបស់$1។",
        "others": "ផ្សេងៗទៀត",
        "siteusers": "{{PLURAL:$2|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}} {{SITENAME}} $1",
        "pageinfo-redirectsto": "បញ្ជូនបន្តទៅកាន់",
        "pageinfo-redirectsto-info": "ព័ត៌មាន​",
        "pageinfo-contentpage": "រាប់ជាទំព័រដែលមានខ្លឹមសារនៅខាងក្នុង",
-       "pageinfo-contentpage-yes": "បាទ/ចាស",
+       "pageinfo-contentpage-yes": "បាទ/ចាស",
        "pageinfo-protect-cascading": "ការការពារត្រូវបានដាក់ជាថ្នាក់ពីទីនេះទៅ",
-       "pageinfo-protect-cascading-yes": "បាទ/ចាស",
+       "pageinfo-protect-cascading-yes": "បាទ/ចាស",
        "pageinfo-protect-cascading-from": "ការការពារត្រូវបានដាក់ជាថ្នាក់ពី",
        "pageinfo-category-info": "ព័ត៌មានចំណាត់ថ្នាក់ក្រុម",
        "pageinfo-category-total": "ចំនួនសមាជិកសរុប",
        "patrol-log-page": "កំណត់ហេតុនៃការតាមដាន",
        "patrol-log-header": "នេះជាកំណត់ហេតុនៃកំណែ​ប្រែ​ដែល​បាន​តាមដាន",
        "log-show-hide-patrol": "កំណត់ហេតុនៃការតាមដាន $1",
+       "confirm-markpatrolled-button": "យល់ព្រម",
        "deletedrevision": "កំណែចាស់ដែលត្រូវបានលុបចេញ $1",
        "filedeleteerror-short": "កំហុសនៃការលុបឯកសារ៖ $1",
        "filedeleteerror-long": "កំហុសពេលលុបឯកសារចេញ៖\n\n$1",
        "invalidateemail": "បោះបង់ចោលការបញ្ជាក់ទទួលស្គាល់អ៊ីមែល",
        "scarytranscludetoolong": "[URL វែងជ្រុល]",
        "deletedwhileediting": "'''ប្រយ័ត្ន''' ៖ ទំព័រនេះបានត្រូវលុបចោល បន្ទាប់ពីអ្នកបានចាប់ផ្តើមកែប្រែ!",
-       "confirmrecreate": "អ្នកប្រើប្រាស់ [[User:$1|$1]] ([[User talk:$1|talk]]) បានលុបទំព័រនេះចោលបន្ទាប់ពីអ្នកចាប់ផ្ដើមកែប្រែវា ដោយមានហេតុផលថា៖\n\n៖ ''$2''\n\nសូមអះអាងថាអ្នកពិតជាចង់បង្កើតទំព័រនេះឡើងវិញពិតប្រាកដមែន។",
+       "confirmrecreate": "អ្នកប្រើប្រាស់ [[User:$1|$1]] ([[User talk:$1|ការពិភាក្សា]]) {{GENDER:$1|បានលុប}} ទំព័រនេះចោលបន្ទាប់ពីអ្នកចាប់ផ្ដើមកែប្រែវា ដោយមានហេតុផលថា៖\n\n៖ <em>$2</em>\n\nសូមអះអាងថាអ្នកពិតជាចង់បង្កើតទំព័រនេះឡើងវិញពិតប្រាកដមែន។",
        "confirmrecreate-noreason": "អ្នកប្រើប្រាស់ [[User:$1|$1]] ([[User talk:$1|talk]]) បានលុបទំព័រនេះចោលបន្ទាប់ពីអ្នកចាប់ផ្ដើមកែប្រែវា។ សូមអះអាងថាអ្នកពិតជាចង់បង្កើតទំព័រនេះឡើងវិញមែន។\n\nសូមអះអាងថាអ្នកពិតជាចង់បង្កើតទំព័រនេះឡើងវិញពិតប្រាកដមែន។",
        "recreate": "បង្កើតឡើងវិញ",
        "confirm_purge_button": "យល់ព្រម",
        "confirm-watch-top": "បន្ថែមទំព័រនេះ​ទៅក្នុងបញ្ជីតាមដាន​របស់អ្នកឬ?",
        "confirm-unwatch-button": "យល់ព្រម",
        "confirm-unwatch-top": "ដកទំព័រនេះចេញពីបញ្ជីតាមដានរបស់ខ្ញុំឬ?",
+       "confirm-rollback-button": "យល់ព្រម",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← ទំព័រមុន",
        "imgmultipagenext": "ទំព័របន្ទាប់ →",
        "tags": "ស្លាក​បំលាស់​ប្ដូរ​ដែល​មាន​សុពលភាព​",
        "tag-filter": "[[Special:Tags|ស្លាក​]] តម្រង​:",
        "tag-filter-submit": "តម្រង",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ស្លាក|ស្លាក}}]]: $2)",
        "tags-title": "ស្លាក​",
        "tags-intro": "ទំព័រ​រាយ​នាម​ស្លាក​ទាំង​ឡាយ​ដែល​កម្មវិធី​ software អាចកត់​សម្គាល់កំណែ​ជាមួយ​ និង​អត្ថ​ន័យ​របស់​វា។​",
        "tags-tag": "ឈ្មោះ​ស្លាក",
-       "tags-display-header": "Appearance លើ​បញ្ជី​បំលាស់​ប្ដូរ​",
+       "tags-display-header": "ពាក្យបង្ហាញលើ​បញ្ជី​បន្លាស់​ប្ដូរ​",
        "tags-description-header": "បរិយាយពេញលេញ​នៃអត្ថន័យ​",
        "tags-source-header": "ប្រភព",
        "tags-active-header": "សកម្ម?",
-       "tags-hitcount-header": "á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bដែលមានស្លាក​",
+       "tags-hitcount-header": "á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aដែលមានស្លាក​",
        "tags-actions-header": "សកម្មភាព",
-       "tags-active-yes": "បាទ/ចាស",
+       "tags-active-yes": "បាទ/ចាស",
        "tags-active-no": "ទេ",
+       "tags-source-extension": "កំណត់ដោយសូហ្វវែរ",
        "tags-source-none": "គ្មានគេប្រើទៀតទេ",
        "tags-edit": "កែប្រែ",
        "tags-delete": "លុបចោល",
        "tags-activate": "បើកប្រើ",
        "tags-deactivate": "បិទមិនប្រើ",
        "tags-hitcount": "$1 {{PLURAL:$1|បន្លាស់ប្ដូរ|បន្លាស់ប្ដូរ}}",
+       "tags-create-heading": "បង្កើតស្លាកថ្មី",
+       "tags-create-explanation": "តាមលំនាំដើម ស្លាកបង្កើតថ្មីនឹងត្រូវដាក់អោយប្រើដោយអ្នកប្រើប្រាស់ឬរូបយន្ត។",
+       "tags-create-tag-name": "ឈ្មោះ​ស្លាក៖",
+       "tags-create-reason": "មូលហេតុ៖",
+       "tags-create-submit": "បង្កើត",
+       "tags-delete-reason": "មូលហេតុ៖",
+       "tags-activate-reason": "មូលហេតុ៖",
+       "tags-deactivate-reason": "មូលហេតុ៖",
+       "tags-edit-reason": "មូលហេតុ៖",
        "comparepages": "ប្រៀបធៀបទំព័រ",
        "compare-page1": "ទំព័រ ១",
        "compare-page2": "ទំព័រ ២",
        "compare-invalid-title": "ចំណងជើងដែលអ្នកបានផ្ដល់អោយមិនត្រឹមត្រូវទេ",
        "compare-title-not-exists": "ចំណងជើងដែលអ្នកផ្ដល់អោយមិនមានទេ។",
        "diff-form": "'''សំនុំ​បែប​បទ'''មួយ​",
+       "diff-form-submit": "បង្ហាញភាពខុសគ្នា",
        "dberr-problems": "សូមអភ័យទោស! វិបសាយនេះកំពុងជួបបញ្ហាបច្ចេកទេស។",
        "dberr-again": "សូមរង់ចាំប៉ុន្មាននាទីសិនហើយផ្ទុកឡើងវិញម្ដងទៀត។",
        "dberr-info": "(មិនអាចទាក់ទងទៅប្រភពទិន្នន័យបានទេ៖ $1)",
        "limitreport-walltime": "រយៈពេលប្រើប្រាស់ពិតប្រាកដ",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|វិនាទី|វិនាទី}}",
        "expandtemplates": "ពង្រីកទំព័រគំរូ",
-       "expand_templates_input": "á\9e\9fá\9e\9aá\9e\9fá\9f\81á\9e\9aá\9e\83á\9f\92á\9e\9bá\9e",
+       "expand_templates_input": "á\9e\9fá\9e\9aá\9e\9fá\9f\81á\9e\9aá\9e¢á\9e\8fá\9f\92á\9e\90á\9e\94á\9e\91á\9e\9cá\9e·á\9e\82á\9e¸",
        "expand_templates_output": "លទ្ធផល",
        "expand_templates_ok": "យល់ព្រម",
        "expand_templates_remove_comments": "ដកចេញ វិចារនានា",
        "pagelanguage": "ប្ដូរភាសាទំព័រ",
        "pagelang-language": "ភាសា",
        "pagelang-use-default": "ប្រើភាសាតាមលំនាំដើម",
+       "pagelang-select-lang": "ជ្រើសរើស​ភាសា​",
+       "pagelang-unchanged-language": "ភាសាទំព័រ $1 ត្រូវបានកំណត់ជា $2 រួចហើយ។",
+       "pagelang-unchanged-language-default": "ភាសាទំព័រ $1 ត្រូវបានកំណត់ជាភាសាអត្ថបទលំនាំដើមរបស់វិគីរួចហើយ។",
        "right-pagelang": "ប្ដូរភាសាទំព័រ",
+       "action-pagelang": "ប្ដូរភាសាទំព័រនេះ",
        "log-name-pagelang": "កំណត់ហេតុបន្លាស់ប្ដូរភាសា",
        "log-description-pagelang": "នេះជាកំណត់ហេតុបន្លាស់ប្ដូរភាសាទំព័រ។",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|បានផ្លាស់ប្ដូរ}}ភាសារបស់ $3 ពី $4 ទៅ $5",
        "special-characters-group-latin": "អក្សរឡាតាំង",
        "special-characters-group-latinextended": "អក្សរឡាតាំងផ្សេងទៀត",
        "special-characters-group-ipa": "អក្ខរក្រមសំលេងអន្តរជាតិ",
        "special-characters-group-symbols": "សញ្ញា",
        "special-characters-group-greek": "អក្សរក្រិច",
+       "special-characters-group-greekextended": "អក្សរក្រិចបន្ថែម",
        "special-characters-group-cyrillic": "អក្សរស៊ីរីល",
        "special-characters-group-arabic": "អក្សរអារ៉ាប់",
        "special-characters-group-arabicextended": "អក្សរអារ៉ាប់បន្ថែម",
        "mw-widgets-dateinput-no-date": "គ្មានកាលបរិច្ឆេទត្រូវបានជ្រើសរើស",
        "mw-widgets-titleinput-description-new-page": "ទំព័រមិនទាន់មាននៅឡើយទេ",
        "mw-widgets-titleinput-description-redirect": "បញ្ជូនបន្តទៅ $1",
+       "mw-widgets-usersmultiselect-placeholder": "បន្ថែមទៀត",
        "date-range-from": "ចាប់ពី៖",
-       "date-range-to": "ដល់៖"
+       "date-range-to": "ដល់៖",
+       "gotointerwiki": "កំពុងចាកចេញពី{{SITENAME}}"
 }
index c79f960..5dc544e 100644 (file)
        "newpageletter": "ಹೊ",
        "boteditletter": "ಬಾ",
        "number_of_watching_users_pageview": "[$1 ವೀಕ್ಷಿಸುತ್ತಿರುವ {{PLURAL:$1|ಸದಸ್ಯ|ಸದಸ್ಯರು}}]",
-       "rc_categories": "ವರ್ಗಗಳಿಗೆ ಮಾತ್ರ ಸೀಮಿತವಾಗಿಸು (\"|\" ಇಂದ ಬೇರ್ಪಡಿಸು)",
-       "rc_categories_any": "ಯಾವುದೇ",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ಬದಲಾವಣೆಯ ನಂತರ",
        "newsectionsummary": "/* $1 */ ಹೊಸ ವಿಭಾಗ",
        "rc-enhanced-expand": "ವಿವರಗಳನ್ನು ತೋರಿಸು",
index e6fa11a..ecf9ce8 100644 (file)
        "newpageletter": "새글",
        "boteditletter": "봇",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|사용자}} $1명이 주시하고 있음]",
-       "rc_categories": "다음 분류로 제한 (\"|\"로 구분):",
-       "rc_categories_any": "선택된 것 중 아무거나",
        "rc-change-size-new": "바꾼 후 $1 {{PLURAL:$1|바이트}}",
        "newsectionsummary": "/* $1 */ 새 문단",
        "rc-enhanced-expand": "자세한 내용 보기",
        "rollback-success": "{{GENDER:$3|$1}}의 편집을 되돌렸습니다.\n{{GENDER:$4|$2}}의 마지막 판으로 바뀌었습니다.",
        "rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]",
        "sessionfailure-title": "세션 실패",
-       "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
+       "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n양식을 다시 제출해 주십시오.",
        "changecontentmodel": "문서의 콘텐츠 모델을 변경",
        "changecontentmodel-legend": "콘텐츠 모델 변경",
        "changecontentmodel-title-label": "문서 제목",
        "watchlistedit-clear-titles": "제목:",
        "watchlistedit-clear-submit": "주시목록 문서 지우기 (이는 영구적입니다!)",
        "watchlistedit-clear-done": "주시문서 목록을 지웠습니다.",
+       "watchlistedit-clear-jobqueue": "주시 목록을 비우고 있습니다. 시간이 어느 정도 소요될 수 있습니다!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|문서 1개|문서 $1개}}를 제거했습니다:",
        "watchlistedit-too-many": "여기에 표시할 문서가 너무 많습니다.",
        "watchlisttools-clear": "주시문서 목록 비우기",
index d3e55ee..89e9c6a 100644 (file)
        "newpageletter": "Дж",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|кёзюнде тутуучу къошулуучу}}]",
-       "rc_categories": "Къуру бу категорияладан («|» бла айыр):",
-       "rc_categories_any": "Сайланнгандан къайсысы да",
        "rc-change-size": "$1",
        "rc-change-size-new": "Тюрлениуден сора ёлчеми: $1 {{PLURAL:$1|байт}}",
        "newsectionsummary": "/* $1 */ Джангы бёлюм",
index 0456b68..a2df772 100644 (file)
        "boteditletter": "B",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|eine|$1|kein}} Oppasser]",
-       "rc_categories": "Bejränz op de Saachjroppe (schrihv „|“ dozwesche):",
-       "rc_categories_any": "Öhndseijne vun dä aanjejovve Saachjroppe",
        "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes|Bytes}} noh dem Ändere",
        "newsectionsummary": "Neuje Afschnet /* $1 */",
index 2a05464..6ef7b8e 100644 (file)
        "newpageletter": "Nû",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|bikarhênerek|$1 bikarhêner}} vê rûpelê {{PLURAL:$1|dişopîne|dişopînin}}.]",
-       "rc_categories_any": "Qet",
        "rc-change-size-new": "Piştî guhertinê $1 {{PLURAL:$1|bayt}}",
        "newsectionsummary": "/* $1 */ beşeke nû",
        "rc-enhanced-expand": "Hûragahiyan nîşan bide",
index bd008e6..dc85920 100644 (file)
        "category_header": "\"$1\" категориядан сагьифалар",
        "subcategories": "Субкатегориялар",
        "category-media-header": "\"$1\" категориядагъы сапламлар",
+       "category-empty": "\"Бу категория буссагьат бош.\"",
        "hidden-categories": "{{PLURAL:$1|Яшырылгъан категория|Яшырылгъан категориялар}}‎",
+       "category-subcat-count": "{{PLURAL:$2|Бу категорияда янгыз гелеген тюп категориясы бар.|Бу категорияда янгыз гелеген $2 тюп категорядан {{PLURAL:$1|тюп категория}} гёрсетилген.}}",
+       "category-article-count": "{{PLURAL:$2|Бу категорияда янгыз гелеген бир сагьифа бар.|Бу категорияда бар $2 сагьифаны {{PLURAL:$1|сагьифасы}} гёрсетилген.}}",
        "listingcontinuesabbrev": "давам",
        "noindex-category": "Индексленмейген сагьифалар",
        "broken-file-category": "Ишлеймейген саплам байланывлары булан сагьифалар",
        "jumptosearch": "излев",
        "aboutsite": "{{SITENAME}} гьакъында",
        "aboutpage": "Project:Сыпатлав",
+       "copyright": "Ичделиги $1 лисензиягъа гёре гиришли (башгъасы мекенленмеген буса).",
        "copyrightpage": "{{ns:project}}:Ясавчу гьакълар",
        "currentevents": "Гьалиги гьаллар",
        "currentevents-url": "Project:Гьалиги гьаллар",
        "showdiff": "Тюзлевлени гёрсетмек",
        "loginreqlink": "гирмек",
        "noarticletext": "Бу сагьифа гьали де матынсыз. Сен башгъа сагьифаларда [[Special:Search/{{PAGENAME}}|булай атын эсгеривлерини излемеге]]  боласан, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийишли гюнделик язывланы тапмагъа] яда '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} булай аты булан сагьифа яратмагъа боласан]'''</span>.",
+       "noarticletext-nopermission": "Бу сагьифа гьали де текстсиз. Сен башгъа сагьифаларда [[Special:Search/{{PAGENAME}}|булай атын эсгеривлерини излемеге]], яда <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийишли гюнделиклени тапмагъа боласан]. </span> Тек бу сагьифаны яратмагъа ихтиярынг ёкъ.",
        "userpage-userdoesnotexist-view": "\"$1\" гьисап къайытланмагъан.",
        "previewnote": "<strong>Бу ингкъарав экенни эсде сакъла.</strong>\nАлышынывларынг гьали де сакъланмагъан!",
        "continue-editing": "Тюзлевню давамламакъ",
        "hiddencategories": "Бу сагьифа {{PLURAL:$1|1 яшырылгъан категориягъа}} янаша:",
        "permissionserrors": "Гириш ихтиярланы хатасы",
        "permissionserrorstext-withaction": "Бугъар $2 гелеген {{PLURAL:$1|себепге|себеплеге}} гёре ихтиярынг ёкъ:",
+       "recreate-moveddeleted-warn": "<strong>Тергев бер: Алдын тайдырылгъан сагьифаны ярашдырма айланасан.</strong>\n\nБашлап тергеп къара, гертиден де тарыкъмы экен ол сагьифаны ярашдырмагъа.\nТайдырыв ва атын алышдырыв гюнделиги тюпде берилген:",
        "content-model-wikitext": "викиматын",
        "undo-failure": "Аралыкъ алышынывланы къыйышывсызлгъы учун тюзлев гери алынмай.",
        "viewpagelogs": "Бу сагьифа учун гюнделиклени гёрсетмек",
        "editundo": "гери алмакъ",
        "diff-empty": "(башгъалыкълар ёкъ)",
        "diff-multi-sameuser": "(шо къоллавчуну {{PLURAL:$1|$1 аралыкъ тюрю}} гёрсетилмеген)",
+       "diff-multi-otherusers": "({{PLURAL:$2|къоллавчуну}}{{PLURAL:$1|аралыкъ тюзлевю|$1 аралыкъ тюзлевлери}} гёрсетилмеген)",
        "searchresults": "Излевню натижалар",
        "searchresults-title": "\"$1\" учун натижаланы излемек",
        "prevn": "алдагъы {{PLURAL:$1|$1}}",
        "nextn-title": "Гелеген $1 {{PLURAL:$1|гьасил}}",
        "shown-title": "Айры бир сагьифада $1 {{PLURAL:$1|языв|язывланы}} гёрсетмек",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) къарамакъ",
+       "searchmenu-exists": "<strong>Бу викиде \"[[:$1]]\" деп аты булан сагьифа бар.</strong> {{PLURAL:$2|0=|Дагъы да табылгъан натижалагъа да къара.}}",
        "searchmenu-new": "<strong>\"[[:$1]]\" сагьифа бу викиде яратмакъ!</strong> {{PLURAL:$2|0=|Излевюнге кёре табылгъан сагьифалагъа да къара.|Дагъы да излев гьасиллеге къара.}}",
        "searchprofile-articles": "Аслу сагьифалар",
        "searchprofile-images": "Мюлтимедиа",
        "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-redirect": "($1 сагьифадан бакъдырылгъан)‎",
        "search-section": "($1 бёлме)",
        "search-file-match": "(сапламны ичделигине рас геле)",
        "recentchangeslinked-feed": "Байлавлу тюзлевлер",
        "recentchangeslinked-toolbox": "Байлавлу тюзлевлер",
        "recentchangeslinked-title": "\"$1\" сагьифагъа байлавлу тюзлевлер",
+       "recentchangeslinked-summary": "Бу сагьифагъа байлавлу тюзлевлери булан сагьифаланы яда о сагьифа байлавлуланы гёрмек учун атын яз. (Категорияны ортакъчаларын гёрмек учун Category:категорияны атын яз). Сени [[Special:Watchlist|гьызарлав тизменгдеги]] алышынывлар <strong>къалын</strong> гьарплылар.",
        "recentchangeslinked-page": "Сагьифаны аты:",
        "recentchangeslinked-to": "Къайта, бу сагьифагъа байлавлу сагьифаланы алышынывларын гёрсетмек",
        "upload": "Сапламны юклемек",
        "statistics": "Истатистик",
        "double-redirect-fixer": "Ёллав дуруславу",
        "nbytes": "$1 {{PLURAL:$1|байт|байтлар}}‎",
+       "nmembers": "$1 {{PLURAL:$1|ортакъчы}}",
        "prefixindex": "Префикс булан бары да сагьифалар",
        "listusers": "Ортакъчы тизмеси",
        "newpages": "Янгы сагьифалар",
        "speciallogtitlelabel": "Мурат (аты яда {{ns:user}}:ортакъчы):",
        "log": "Гюнделиклер",
        "all-logs-page": "Бары да гиришли гюнделиклер",
+       "alllogstext": "{{SITENAME}} сайфаны жыйымлы гюнделик тизмеси.\nНатижаланы гюнделик тайпасына, ортакъчы атына (уллу-гиччи гьарпланы гьисапгъа алып) яда тийилген сагьифасына (уллу-гиччи гьарпланы гьисапгъа алып) гёре айырма боласан.",
        "logempty": "Къыйышывлу язывлар гюнделикде ёкъ.",
        "allpages": "Бары сагьифалар",
        "allarticles": "Бары сагьифалар",
        "namespace": "Атлар аралыгъы:",
        "invert": "Сайлангъанын айландырмакъ",
        "namespace_association": "Байланышлы атлар аралыгъы",
+       "tooltip-namespace_association": "Сайлангъан атысакъламагъа байлавлу атсакъламаны, пикирлешивлени къошмакъ учун бу белгини де сал.",
        "blanknamespace": "(Аслу)",
        "contributions": "{{GENDER:$1|Къоллавчуну}} къошуму",
        "contributions-title": "Ортакъчыны ярдымы $1",
        "tooltip-ca-nstab-category": "Категорияны сагьифасына къарамакъ",
        "tooltip-minoredit": "Увакъ алышынывдай белгилемек",
        "tooltip-save": "Алышдырывларынг сакъламакъ",
+       "tooltip-preview": "Сагьифаны ингкъараву. Сакъълагъанчакъы пайдалан.",
        "tooltip-diff": "Сен этген матынны тюзлевлеринг гёрсетмек",
        "tooltip-compareselectedversions": "Бу сагьифаны сайлангъан эки тюрлерин башгъалыгъына къарамакъ.",
        "tooltip-watch": "Сени тергев сиягьынга бу сагьифаны къошмакъ",
        "pageinfo-header-restrictions": "Сагьифа къорув",
        "pageinfo-header-properties": "Сагьифа кюйлемлер",
        "pageinfo-display-title": "Гёрсетилеген аты",
+       "pageinfo-default-sort": "Бар кюйде айырыв ачгъычы",
        "pageinfo-length": "Сагьифаны узунлугъу (байтларда)",
        "pageinfo-article-id": "Сагьифа ID",
        "pageinfo-language": "Сагьифаны тили",
        "show-big-image-other": "Башгъа {{PLURAL:$2|айырым|айырымлар}}: $1.",
        "show-big-image-size": "$1 × $2 пиксел",
        "metadata": "Мета маълюматлар",
+       "exif-orientation": "Онгарылым",
        "exif-xresolution": "Гёнделен айырым",
        "exif-yresolution": "Тик айырым",
        "exif-datetime": "Сапламны алышыныв тархы ва заманы",
        "exif-make": "Камераны ясавчусу",
        "exif-model": "Камераны модели",
+       "exif-software": "Програм таъмини",
        "exif-exifversion": "Exif тюрю",
        "exif-colorspace": "Тюслер аралыгъы",
        "exif-datetimeoriginal": "Аслу тарх ва заман",
+       "exif-datetimedigitized": "Санавлашдырывну тархы ва заманы",
        "exif-orientation-1": "Нормал",
        "namespacesall": "бары да",
        "monthsall": "бары да",
        "watchlisttools-edit": "Тизмени къарап тюзлемек",
        "watchlisttools-raw": "Саяв текстни тюзлемек",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|сёйлешив]])",
+       "redirect": "Сапламны, къоллавчуну, сагьифаны, тюрню яда гюнделикни менлигине гёре ёллав",
        "redirect-submit": "Гёчмек",
        "redirect-lookup": "Излев:",
        "redirect-value": "Къыймат:",
        "tags-hitcount": "$1 {{PLURAL:$1|алышыныв|алышынывлар}}",
        "logentry-delete-delete": "$1 {{GENDER:$2|тайдыргъан}} сагьифаны $3",
        "logentry-delete-restore": "$1 бу $3 ($4) сагьифаны {{GENDER:$2ярашдыргъан|}}",
+       "logentry-delete-revision": "$1 бу сагьифаны $3: $4 {{PLURAL:$5|тюрюн}} гёрюнегенлигин {{GENDER:$2|алышдырды}}",
        "revdelete-content-hid": "ичделиги яшырылгъан",
        "logentry-move-move": "$1 къоллавчу $3 сагьифаны $4 сагьифагъа атын айландыргъан",
+       "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": "$2 къоллавчу $1 бетин этген",
+       "logentry-newusers-autocreate": "$1 ортакъчыны гьисабы оьзлюгюнден {{GENDER:$2|яратылды}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|юклеген}} $3",
        "logentry-upload-overwrite": "$1 буну $3 янгы тюрюн {{GENDER:$2|юклеген}}",
        "searchsuggest-search": "{{SITENAME}} ичинде излемек",
index 1dbb6c6..19f7d87 100644 (file)
        "minoreditletter": "м",
        "newpageletter": "Ж",
        "boteditletter": "б",
-       "rc_categories_any": "Каалаган",
        "rc-enhanced-expand": "Кошумча маалыматтарды көрсөтүү (JavaScript талап кылынат)",
        "rc-enhanced-hide": "Кошумча маалыматтарды жашыруу",
        "recentchangeslinked": "Байланыштуу өзгөрүүлөр",
index a70c190..e07ef69 100644 (file)
        "newpageletter": "N",
        "boteditletter": "a",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usor observans|usores observantes}}]",
-       "rc_categories_any": "Ulla",
        "rc-change-size-new": "$1 {{PLURAL:$1|octetus|octeti}} post recensionem",
        "newsectionsummary": "/* $1 */ nova pars",
        "rc-enhanced-expand": "Minima monstrare",
index 25c4d93..dfc7321 100644 (file)
        "pool-timeout": "Tiempo de asperar esta asperando por el kandado",
        "pool-queuefull": "Kola de lavoro esta yeno",
        "pool-errorunknown": "Yerro deskonosido",
-       "aboutsite": "Encima de {{SITENAME}}",
+       "aboutsite": "Sovre {{SITENAME}}",
        "aboutpage": "Project:Encima de",
        "copyright": "El kontenido se puede topar debasho de la $1 salvo ke indika al kontrario.",
        "copyrightpage": "{{ns:project}}:Derechos del otor",
        "minoreditletter": "ch",
        "newpageletter": "M",
        "boteditletter": "b",
-       "rc_categories_any": "Kualkyer",
        "rc-change-size-new": "$1 {{PLURAL:$1|bayt|baytes}} dospués del trocamiento",
        "rc-enhanced-expand": "Amostrar los detalios",
        "rc-enhanced-hide": "Esconder los detalios",
index 3b5714e..6f98e93 100644 (file)
        "timezoneregion-pacific": "Pazifeschen Ozean",
        "allowemail": "E-Maile vun anere Benotzer kréien.",
        "email-allow-new-users-label": "E-Maile vu ganz neie Benotzer erlaben",
+       "email-blacklist-label": "Dëse Benotzer verbidde mir E-Mailen ze schécken:",
        "prefs-searchoptions": "Sichen",
        "prefs-namespaces": "Nummraim",
        "default": "Standard",
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 Benotzer {{PLURAL:$1|iwwerwaacht|iwwerwaachen}}]",
-       "rc_categories": "Limitéieren op d'Kategorie (getrennt mat \"|\"):",
-       "rc_categories_any": "Aus iergendenger vun den erausgesichten",
        "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} no der Ännerung",
        "newsectionsummary": "Neien Abschnitt /* $1 */",
        "pageswithprop-legend": "Säite mat enger Säiteneegeschaft",
        "pageswithprop-text": "Op dëser Säit sti Säiten déi eng speziell Säiteneegeschaft benotzen.",
        "pageswithprop-prop": "Numm vun der Eegenschaft:",
+       "pageswithprop-reverse": "An der ëmgedréiter Reiefolleg zortéieren",
+       "pageswithprop-sortbyvalue": "Nom Wäert vun der Eegenschaft zortéieren",
        "pageswithprop-submit": "Lass",
        "pageswithprop-prophidden-long": "Wäert vun der laanger Texteegeschaft verstoppt ($1)",
        "doubleredirects": "Duebel Viruleedungen",
        "delete-warning-toobig": "Dës Säit huet eng laang Versiounsgeschicht, méi wéi $1 {{PLURAL:$1|Versioun|Versiounen}}.\nD'Läschen dovu kann zu Stéierungen am Fonctionnement vun {{SITENAME}} féieren;\ndës Aktioun soll mat Virsiicht gemaach ginn.",
        "deleteprotected": "Dir däerft dëst Säit net läsche well se gespaart ass.",
        "deleting-backlinks-warning": "<strong>Opgepasst:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Aner Säite]] linken op déi Säit déi Dir am Gaang sidd ze läschen oder déi Säit Déi Dir am Gaang sidd ze läschen ass an aner Säiten agebonn.",
+       "deleting-subpages-warning": "<strong>Opgepasst:</strong> D'Säit, déi Dir läsche wëllt, huet [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|eng Ënnersäit|$1 Ënnersäiten|51=méi wéi 50 Ënnersäiten}}]].",
        "rollback": "Ännerungen zrécksetzen",
        "rollbacklink": "Zrécksetzen",
        "rollbacklinkcount": "{{PLURAL:$1|Eng Ännerung|$1 Ännerungen}} zrécksetzen",
        "rollback-success": "D'Ännerunge vum {{GENDER:$3|$1}} goufen zréckgesat op déi lescht Versioun vum {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Zréckgesat Ännerunge vum $1:\nzréckgeännert op déi lescht Versioun vum $2. [$3 Ännerunge weisen]",
        "sessionfailure-title": "Setzungsfeeler",
-       "sessionfailure": "Et schéngt e Problem mat Ärer Loginseance ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Seance piratéiert ka ginn.\nKlickt w.e.g. op \"Zréck\" a luet déi Säit vun där Dir komm sidd nei, a versicht et dann nach eng Kéier.",
+       "sessionfailure": "Et schéngt e Problem mat Ärer Sessioun ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Sessioun piratéiert ka ginn.\nSchéckt de Formulaire w.e.g. nach eng Kéier.",
        "changecontentmodel": "De Modell vum Inhalt vun enger Säit änneren",
        "changecontentmodel-legend": "Modell vun enger Säit mat Inhalt änneren",
        "changecontentmodel-title-label": "Titel vun der Säit",
        "pageinfo-category-subcats": "Zuel vun den Ënnerkategorien",
        "pageinfo-category-files": "Zuel vun de Fichieren",
        "pageinfo-user-id": "Benotzernummer",
+       "pageinfo-file-hash": "Hash-Wäert",
        "markaspatrolleddiff": "Als nogekuckt markéieren",
        "markaspatrolledtext": "Dës Säit als nogekuckt markéieren",
        "markaspatrolledtext-file": "Dës Versioun vum Fichier als nogekuckt markéieren",
        "exif-originalimageheight": "Héicht vum Bild virum Ofschneiden",
        "exif-originalimagewidth": "Breet vum Bild virum Ofschneiden",
        "exif-compression-1": "Onkompriméiert",
+       "exif-compression-6": "JPEG (al)",
        "exif-copyrighted-true": "Duerch Copyright geschützt",
        "exif-copyrighted-false": "Copyright status net agestallt",
        "exif-photometricinterpretation-1": "Schwaarz a wäiss (Schwaarz ass 0)",
        "invalidateemail": "Annulléier d'E-Mailconfirmation",
        "notificationemail_subject_changed": "D'E-Mail-Adress déi op {{SITENAME}} enregistréiert war gouf geännert",
        "notificationemail_subject_removed": "D'E-Mail-Adress déi op {{SITENAME}} enregistréiert war gouf ewechgeholl",
-       "notificationemail_body_changed": "Een, wahrscheinlech Dir, vun der IP-Adress $1, huet d'E-Mailadress vum Benotzerkont \"$2\" opm\"$3\" op {{SITENAME}} geännert.",
+       "notificationemail_body_changed": "Een, wahrscheinlech Dir, vun der IP-Adress $1, huet d'E-Mailadress vum Benotzerkont \"$2\" op \"$3\" op {{SITENAME}} geännert.",
+       "notificationemail_body_removed": "Een, wahrscheinlech Dir, vun der IP-Adress $1, huet d'E-Mailadress vum Benotzerkont \"$2\" {{SITENAME}} geännert.",
        "scarytranscludedisabled": "[Interwiki-Abannung ass ausgeschalt]",
        "scarytranscludefailed": "[D'Siche no der Schabloun fir $1 huet net funktionéiert]",
        "scarytranscludefailed-httpstatus": "[D'Opruffe vun der Schabloun $1: HTTP $2 huet net funktionéiert]",
        "api-error-emptypage": "Et ass net erlaabt nei, eidel Säiten unzeleeën.",
        "api-error-publishfailed": "Interne Feeler: de Server konnt den temporäre Fichier net publizéieren.",
        "api-error-stashfailed": "Interne Feeler: de Server konnt den temporäre Fichier net späicheren.",
-       "api-error-unknown-warning": "Onbekannte Warnung: \"$1\".",
+       "api-error-unknown-warning": "Onbekannt Warnung: \"$1\".",
        "api-error-unknownerror": "Onbekannte Feeler: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|Sekonn|Sekonnen}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minutt|Minutten}}",
index 832a9ec..0ea7d77 100644 (file)
        "minoreditletter": "гъ",
        "newpageletter": "Цl",
        "boteditletter": "б",
-       "rc_categories_any": "ГЬар са",
        "rc-change-size-new": "Масакlа авунилай ахпа кьадар: $1 байт",
        "rc-enhanced-expand": "Куьлуь-шуьлуьяр къалурун (JavaScript герекзава)",
        "rc-enhanced-hide": "Куьлуь-шуьлуьяр чуьнуьха",
index f590c4a..4f57acb 100644 (file)
        "postedit-confirmation-created": "La paje es creada.",
        "postedit-confirmation-restored": "La paje es restorada.",
        "postedit-confirmation-saved": "Tua edita es fisada.",
+       "postedit-confirmation-published": "Tua edita ia es publicida.",
        "edit-already-exists": "Un paje nova no ia pote es creada.\nLo esiste ja.",
        "defaultmessagetext": "Testo inisial de mesaje",
        "content-failed-to-parse": "La contenida $2 per model $1 no ia pote es analiseda: $3",
        "diff-multi-sameuser": "({{PLURAL:$1|Un revisa|$1 revisas}} media par la mesma usor no es mostrada)",
        "diff-multi-otherusers": "({{PLURAL:$1|Un revisa|$1 revisas}} media par {{PLURAL:$2|un otra usor|$2 usores}} no es mostrada)",
        "diff-multi-manyusers": "({{PLURAL:$1|Un revisa|$1 revisas}} media par plu ca $2 {{PLURAL:$2|usor|$2 usores}} no es mostrada)",
+       "diff-paragraph-moved-tonew": "La paragraf ia move. Clica per salta a la loca nova.",
+       "diff-paragraph-moved-toold": "La paragraf ia move. Clica per salta a la loca vea.",
        "difference-missing-revision": "{{PLURAL:$2|Un revisa|$2 revisas}} de esta difere ($1) no ia es trovada.\n\nEsta es usual causada par segue un lia nonfresca de istoria a un paje cual on ia sutrae.\nDetalias es trovable en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistra de sutraes].",
        "searchresults": "Resultas de xerca",
        "searchresults-title": "Resultas de xerca \"$1\"",
        "timezoneregion-indian": "Mar Indian",
        "timezoneregion-pacific": "Mar Pasifica",
        "allowemail": "Permete ce otra usores pote eposta me",
+       "email-allow-new-users-label": "Permete epostas de usores intera nova.",
        "email-blacklist-label": "Proibi esta usores de eposta a me:",
        "prefs-searchoptions": "Xerca",
        "prefs-namespaces": "Spasios de nom",
        "recentchanges-summary": "Segue asi la cambias la plu resente a la vici.",
        "recentchanges-noresult": "No cambias en la periodo spesifada coresponde a esta criterios.",
        "recentchanges-timeout": "Esta xerca ia es abandonada. Posible, tu desira atenta otra parametres de xerca.",
+       "recentchanges-network": "Par un era tecnical, no resultas pote es cargada. Proba refresci la paje, per favore.",
+       "recentchanges-notargetpage": "Tape un nom de paje a supra per vide cambias relatada a acel paje.",
        "recentchanges-feed-description": "Segue la cambias la plu resente a la vici en esta flue.",
        "recentchanges-label-newpage": "Esta edita ia crea un paje nova",
        "recentchanges-label-minor": "Esta es un edita minor",
        "rcfilters-group-results-by-page": "Grupi resultas par paje",
        "rcfilters-activefilters": "Filtros ativa",
        "rcfilters-advancedfilters": "Filtros avansada",
-       "rcfilters-limit-title": "Mostra cuanto cambias",
+       "rcfilters-limit-title": "Mostra cuanto resultas",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cambia|cambias}}, $2‎",
+       "rcfilters-date-popup-title": "Periodo de tempo per la xerca",
        "rcfilters-days-title": "Dias resente",
        "rcfilters-hours-title": "Oras resente",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|dia|dias}}",
        "rcfilters-savedqueries-apply-and-setdefault-label": "Crea filtro inisial",
        "rcfilters-savedqueries-cancel-label": "Cansela",
        "rcfilters-savedqueries-add-new-title": "Fisa ajustas presente de filtro",
+       "rcfilters-savedqueries-already-saved": "Esta filtros es ja fisada. Cambia tua ajustas per crea un filtro fisada nova.",
        "rcfilters-restore-default-filters": "Restora filtros inisial",
        "rcfilters-clear-all-filters": "Vacui tota filtros",
        "rcfilters-show-new-changes": "Regarda cambias la plu resente",
-       "rcfilters-search-placeholder": "Filtri cambias resente (eleje o comensa tape)",
+       "rcfilters-search-placeholder": "Filtri cambias (usa la menu o xerca un nom de filtro)",
        "rcfilters-invalid-filter": "Filtro nonvalida",
        "rcfilters-empty-filter": "No filtros es ativa. Tota contribuis es mostrada.",
        "rcfilters-filterlist-title": "Filtros",
        "rcfilters-watchlist-showupdated": "Cambias a pajes cual tu no ia visita pos cuando los ia aveni es en\n<strong>testo spesa</strong>, con indicadores solida.",
        "rcfilters-preference-label": "Asconde la varia bonida de Cambias Resente",
        "rcfilters-preference-help": "Desfa la redesinia de interfas de 2017 e tota utiles ajuntada alora e\na pos.",
+       "rcfilters-filter-showlinkedfrom-label": "Mostra cambias en pajes liada de",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pajes liada de</strong> la paje elejeda",
+       "rcfilters-filter-showlinkedto-label": "Mostra cambias en pajes liante a",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Pajes liante a</strong> la paje elejeda",
+       "rcfilters-target-page-placeholder": "Tape un nom de paje (o categoria)",
        "rcnotefrom": "A su es la {{PLURAL:$5|cambia|cambias}} de <strong>$3, $4</strong> (asta <strong>$1</strong>).",
        "rclistfromreset": "Reinisia la eleje de data",
        "rclistfrom": "Mostra cambias nova, comensante de $2, $3",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usor|usores}} monitorinte]",
-       "rc_categories": "Limita de categorias (separa con \"|\"):",
-       "rc_categories_any": "Cualce de la elejedas",
        "rc-change-size-new": "$1 {{PLURAL:$1|bait|baites}} pos cambia",
        "newsectionsummary": "/* $1 */ parte nova",
        "rc-enhanced-expand": "Mostra detalias",
        "recentchangeslinked-feed": "Cambias relatada",
        "recentchangeslinked-toolbox": "Cambias relatada",
        "recentchangeslinked-title": "Cambias relatada a \"$1\"",
-       "recentchangeslinked-summary": "Esta es un lista de cambias resente a pajes liada de un paje spesifada (o a membros de un categoria spesifada).\nPajes en [[Special:Watchlist|tua lista monitorida]] es <strong>spesa</strong>.",
+       "recentchangeslinked-summary": "Tape un nom de paje per vide cambias en pajes liada a o de acel paje. (Per vide membros de un categoria, tape <strong>bold</strong>.) Cambias a pajes en [[Special:Watchlist|tua lista monitorida]] es <strong>spesa</strong>.",
        "recentchangeslinked-page": "Nom de paje:",
        "recentchangeslinked-to": "Mostra cambias a pajes cual lia a la paje indicada, en loca",
        "recentchanges-page-added-to-category": "[[:$1]] ajuntada a categoria",
        "lockmanager-fail-closelock": "La fix de semafor per \"$1\" no ia pote es cluida.",
        "lockmanager-fail-deletelock": "La fix de semafor per \"$1\" no ia pote es sutraeda.",
        "lockmanager-fail-acquirelock": "La semafor per \"$1\" no ia pote es otenida.",
-       "lockmanager-fail-openlock": "La fix de semafor per \"$1\" no ia pote es abrida.",
+       "lockmanager-fail-openlock": "La fix de semafor per \"$1\" no ia pote es abrida. Serti ce tua arcivo de carga es bon ajustada e ce tua servador es permeteda a scrive en acel arcivo. Vide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory per plu informa.",
        "lockmanager-fail-releaselock": "La semafor per \"$1\" no ia pote es relasada.",
        "lockmanager-fail-db-bucket": "Tro poca bancos de semafor ia pote es contatada en balde $1.",
        "lockmanager-fail-db-release": "Semafores per banco de datos $1 no ia pote es relasada.",
        "uploadstash-refresh": "Refresci la lista de fixes",
        "uploadstash-thumbnail": "regarda imajeta",
        "uploadstash-exception": "Carga no ia pote es ajuntada a la cargas pendente ($1): \"$2\".",
+       "uploadstash-bad-path": "La adirije no esiste.",
+       "uploadstash-bad-path-invalid": "La adirije no es valida.",
+       "uploadstash-bad-path-unknown-type": "Tipo \"$1\" nonconoseda.",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Imajeta nonreconoseda.",
+       "uploadstash-bad-path-no-handler": "No tratador ia es trovada per tipo $1 de fix $2.",
+       "uploadstash-bad-path-bad-format": "Clave \"$1\" no es en forma coreta.",
+       "uploadstash-file-not-found": "Clave \"$1\" no ia es trovada en la pendentes.",
+       "uploadstash-file-not-found-no-thumb": "La imajeta no ia pote es otenida.",
+       "uploadstash-file-not-found-no-local-path": "No adirije local per la ojeto regrandida.",
+       "uploadstash-file-not-found-no-object": "La fix local per la imajeta no ia pote es creada.",
+       "uploadstash-file-not-found-no-remote-thumb": "Retrae de imajeta ia fali: $1 URL = $2",
+       "uploadstash-file-not-found-missing-content-type": "La xapo \"Content-Type\" manca.",
+       "uploadstash-file-not-found-not-exists": "La adirije no es trovable, o la fix no es plata.",
+       "uploadstash-file-too-large": "Fixes plu grande ca $1 baites no pote es servida.",
+       "uploadstash-not-logged-in": "No usor es autenticida; fixes debe parteni a usores.",
+       "uploadstash-wrong-owner": "Esta fix ($1) no parteni a la usor presente.",
+       "uploadstash-no-such-key": "No tal clave ($1); sutrae no es posible.",
+       "uploadstash-no-extension": "La sufisa manca.",
+       "uploadstash-zero-length": "La fix ave zero baites.",
        "invalid-chunk-offset": "Bloco con numero nonvalida",
        "img-auth-accessdenied": "Nonasedable",
        "img-auth-nopathinfo": "PATH_INFO manca.\nTua servador no es ajustada per envia esta informa.Cisa lo usa CGI e no pote suporta img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "doubleredirects": "Redirijes duple",
        "doubleredirectstext": "Esta paje lista pajes cual redirije a otra pajes redirijente.\nCada linia conteni linias a la redirije prima e du, como ance la gol de la redirije du, cual es usual la paje \"vera\" a cual la redirije prima debe punta.\nEntradas <del>barida</del> es ja solveda.",
        "double-redirect-fixed-move": "[[$1]] es moveda.\nLo ia es automata cambiada e aora lo redirije a [[$2]].",
-       "double-redirect-fixed-maintenance": "Automata reparante redirije duple de [[$1]] a [[$2]] en taxe de manteni.",
+       "double-redirect-fixed-maintenance": "Automata reparante redirije duple de [[$1]] a [[$2]] en taxe de manteni",
        "double-redirect-fixer": "Reparor de redirijes",
        "brokenredirects": "Redirijes rompeda",
        "brokenredirectstext": "La redirijes seguente lia a pajes nonesistente:",
        "rollback-success": "Editas par {{GENDER:$3|$1}} ia es reversada e cambiada a la revisa la plu resente par {{GENDER:$4|$2}}",
        "rollback-success-notify": "Editas par $1 ia es reversada e cambiada a la revisa la plu resente par $2. [$3 Mostra cambias]",
        "sessionfailure-title": "Fali de sesion",
-       "sessionfailure": "Lo pare ce tua sesion de autentici ave un problem;\nesta ata ia es canselada per proteje contra saisis de sesion.\nRevade a la paje presedente, recarga acel paje, e atenta alora denova.",
+       "sessionfailure": "Lo pare ce tua sesion de autentici ave un problem; esta ata ia es canselada per proteje contra saisis de sesion. Reenvia la formulario, per favore.",
        "changecontentmodel": "Cambia model de contenida de un paje",
        "changecontentmodel-legend": "Cambia model de contenida",
        "changecontentmodel-title-label": "Titulo de paje",
        "thumbnail_dest_directory": "Arcivo destinal no pote es creada",
        "thumbnail_image-type": "Tipo nonsuportada de imaje",
        "thumbnail_gd-library": "Ajusta noncompleta de biblioteca GD: Funsiona $1 manca",
+       "thumbnail_image-size-zero": "La grandia de la fix de imaje pare es zero.",
        "thumbnail_image-missing": "Fix pare manca: $1",
        "thumbnail_image-failure-limit": "Tro multe atentas resente ($1 o plu) ia fali rendere esta imajeta. Atenta denova plu tarda, per favore.",
        "import": "Emporta pajes",
        "import-mapping-namespace": "Emporta a un spasio de nom:",
        "import-mapping-subpage": "Emporta como supajes de la paje seguente:",
        "import-upload-filename": "Nom de fix:",
+       "import-upload-username-prefix": "Prefisa intervical:",
+       "import-assign-known-users": "Asinia editas a usores local do la usor nomida esiste local",
        "import-comment": "Comenta:",
        "importtext": "Per favore, esporta la fix de la vici fontal par usa la [[Special:Export|util de esporta]].\nFisa lo a tu computador e carga lo asi.",
        "importstart": "Emportante pajes...",
        "imported-log-entries": "$1 {{PLURAL:$1|entrada|entradas}} de rejistra ia es emportada.",
        "importfailed": "Emporta ia fali: <nowiki>$1</nowiki>",
        "importunknownsource": "Tipo nonconoseda de fonte de emporta",
+       "importnoprefix": "No prefisa intervical ia es furnida",
        "importcantopen": "Fix de emporta no ia pote es abrida",
        "importbadinterwiki": "Mal lia intervical",
        "importsuccess": "Emporta ia fini!",
        "pageinfo-category-subcats": "Cuantia de sucategorias",
        "pageinfo-category-files": "Cuantia de fixes",
        "pageinfo-user-id": "Numero de usor",
+       "pageinfo-file-hash": "Valua axida",
        "markaspatrolleddiff": "Marca como patruliada",
        "markaspatrolledtext": "Marca esta paje como patruliada",
        "markaspatrolledtext-file": "Marca esta varia de fix como patruliada",
        "autosumm-blank": "Paje vacuida",
        "autosumm-replace": "Contenida sustituida par \"$1\"",
        "autoredircomment": "Paje redirijeda a [[$1]]",
+       "autosumm-removed-redirect": "Sutrae de redirije a [[$1]]",
+       "autosumm-changed-redirect-target": "Gol de redirije cambiada de [[$1]] a [[$2]]",
        "autosumm-new": "Paje creada con \"$1\"",
        "autosumm-newblank": "Paje vacua creada",
        "lag-warn-normal": "Cambias plu resente ca $1 {{PLURAL:$1|secondo|secondos}} ante aora es cisa no mostrada en esta lista.",
        "watchlistedit-clear-titles": "Titulos:",
        "watchlistedit-clear-submit": "Vacui la lista (Esta es permanente!)",
        "watchlistedit-clear-done": "Tua lista de pajes monitorida es vacuida.",
+       "watchlistedit-clear-jobqueue": "Tua lista monitorida deveni vacuida. Esta pote ocupa alga tempo!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 titulo|$1 titulos}} ia es sutraeda:",
        "watchlistedit-too-many": "La lista ave tro multe pajes per mostra asi.",
        "watchlisttools-clear": "Vacui la lista monitorida.",
        "version-poweredby-others": "otras",
        "version-poweredby-translators": "traduores a translatewiki.net",
        "version-credits-summary": "Nos desira reconose la persones seguente per sua contribuis a [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki es un program libre; tu pote redistribui lo e/o altera lo su la restrinjes de la Lisensa Publica Jeneral GNU como publicida par la Funda de Programes Libre (Free Software Foundation); o revisa 2 de la Lisensa, o (si tu prefere) cualce revisa plu tarda.\n\nMediaWiki es distribuida con la espera ce lo va es usosa, ma CON NO GARANTIA; lo an no ave la garantia implicada de CONVENI PER VENDE (merchantability) or CONVENI PER UN INTENDE SPESIFADA (fitness for a particular purpose). Vide la Lisensa Publica Jeneral GNU per plu detalias.\n\nEsperable tu ia reseta [{{SERVER}}{{SCRIPTPATH}}/COPYING un copia de la Lisensa Publica Jeneral GNU] con esta program; si no, scrive a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html leje lo enlinia].",
+       "version-license-info": "MediaWiki es un program libre; tu pote redistribui lo e/o altera lo su la restrinjes de la Lisensa Publica Jeneral GNU como publicida par la Funda de Programes Libre (Free Software Foundation); o revisa 2 de la Lisensa, o (si tu prefere) cualce revisa plu tarda. MediaWiki es distribuida con la espera ce lo va es usosa, ma <em>CON NO GARANTIA</em>; lo an no ave la garantia implicada de <strong>CONVENI PER VENDE</strong> (merchantability) or <strong>CONVENI PER UN INTENDE SPESIFADA</strong> (fitness for a particular purpose). Vide la Lisensa Publica Jeneral GNU per plu detalias. Esperable tu ia reseta [{{SERVER}}{{SCRIPTPATH}}/COPYING un copia de la Lisensa Publica Jeneral GNU] con esta program; si no, scrive a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html leje lo enlinia].",
        "version-software": "Programes instalada",
        "version-software-product": "Produida",
        "version-software-version": "Revisa",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Eticeta|Eticetas}}]]: $2)",
        "tag-mw-contentmodelchange": "cambia de model de contenida",
        "tag-mw-contentmodelchange-description": "Editas cual [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cambia la model de contenida] de un paje",
+       "tag-mw-new-redirect": "Redirije nova",
+       "tag-mw-new-redirect-description": "Editas cual crea un redirije nova o cambia un paje a un redirije",
+       "tag-mw-removed-redirect": "Redirije sutraeda",
+       "tag-mw-removed-redirect-description": "Editas cual cambia un redirije esistente a un nonredirije",
+       "tag-mw-changed-redirect-target": "Gol de redirije cambiada",
+       "tag-mw-changed-redirect-target-description": "Editas cual cambia la gol de un redirije",
+       "tag-mw-blank": "Vacui",
+       "tag-mw-blank-description": "Editas cual vacui un paje",
+       "tag-mw-replace": "Suprascriveda",
+       "tag-mw-replace-description": "Editas cual sutrae plu ca 90% de la contenida de un paje",
+       "tag-mw-rollback": "Reversa",
+       "tag-mw-rollback-description": "Editas cual reversa editas presedente par la lia \"reversa\"",
+       "tag-mw-undo": "Desfa",
+       "tag-mw-undo-description": "Editas cual desfa editas presedente par la lia \"desfa\"",
        "tags-title": "Eticetas",
        "tags-intro": "Esta paje lista la eticetas con cual la program pote marca un edita, e sua sinifias.",
        "tags-tag": "Nom de eticeta",
        "limitreport-expansiondepth": "Profondia la plu grande de despaci",
        "limitreport-expensivefunctioncount": "Cuantia de funsionas custosa de analisador sintatical",
        "expandtemplates": "Despaci stensiles",
-       "expand_templates_intro": "Esta paje spesial prende testo e despaci tota stensiles en lo, en modo recorsante.\nLo despaci ance funsionas suportada de analisador sintatical como\n<code><nowiki>{{</nowiki>#language:…}}</code> e variables como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nEn fato, lo despaci cuasi tota cosas entre brasetas risa duple.",
+       "expand_templates_intro": "Esta paje spesial prende vicitesto e despaci tota stensiles en lo, en modo recorsante. Lo despaci ance funsionas suportada de analisador sintatical como <code><nowiki>{{</nowiki>#language:…}}</code> e variables como <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. En fato, lo despaci cuasi tota cosas entre brasetas risa duple.",
        "expand_templates_title": "Titulo de contesto, per {{FULLPAGENAME}}, etc.:",
-       "expand_templates_input": "Testo enflual:",
+       "expand_templates_input": "Vicitesto enflual:",
        "expand_templates_output": "Resulta",
        "expand_templates_xml_output": "Esflue XML",
        "expand_templates_html_output": "Esflue HTML cru",
        "expand_templates_preview": "Previde",
        "expand_templates_preview_fail_html": "<em>Car HTML cru es comutada en {{SITENAME}} e datos de sesion ia es perdeda, la previde es ascondeda per preveni atacas par JavaScript.</em>\n\n<strong>Si esta es un atenta valida de previde, atenta denova, per favore.</strong>\nSi lo ancora no funsiona, proba [[Special:UserLogout|desautentici]] e reautentici, e serti ce tua surfador permete cucis de esta pajeria.",
        "expand_templates_preview_fail_html_anon": "\n<em>Car HTML cru es comutada en {{SITENAME}} e tu no es autenticida, la previde es ascondeda per preveni atacas par JavaScript.</em>\n\n<strong>Si esta es un atenta valida de previde, [[Special:UserLogin|autentici]] e atenta denova, per favore.</strong>",
-       "expand_templates_input_missing": "Tu debe furni a la min alga testo enflual.",
+       "expand_templates_input_missing": "Tu debe furni a la min alga vicitesto enflual.",
        "pagelanguage": "Cambia lingua de paje",
        "pagelang-name": "Paje",
        "pagelang-language": "Lingua",
        "restrictionsfield-badip": "Adirije o estende IP nonvalida: $1",
        "restrictionsfield-label": "Estendes IP permeteda:",
        "restrictionsfield-help": "Un adirije IP o estende CIDR per linia: Per comuta tota, usa:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Era: $1",
+       "edit-error-long": "Eras:\n\n$1",
        "revid": "revisa $1",
        "pageid": "numero de paje $1",
        "rawhtml-notallowed": "Eticetas &lt;html&gt; no pote es usada estra pajes normal.",
index 4c3fc7e..5797798 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op 'ne volglies]",
-       "rc_categories": "Bepirk tot categorieë (sjeij mit 'n \"|\")",
-       "rc_categories_any": "Idder vanne gekaozene",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nao verangering",
        "newsectionsummary": "/* $1 */ nuje subkop",
        "rc-enhanced-expand": "Toean details",
index 74558b9..58978b9 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[osservâ da {{PLURAL:$1|un utente|$1 utenti}}]",
-       "rc_categories": "Limite a-e categorie (separæ da \"|\"):",
-       "rc_categories_any": "Quâ-se-sæ fra quelle indicæ",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} doppo a modiffica",
        "newsectionsummary": "/* $1 */ neuva seçion",
        "rc-enhanced-expand": "Fanni vedde i detaggi",
index 137a1bc..a375bcc 100644 (file)
        "newpageletter": "نو",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر}} پی‌گیرنده]",
-       "rc_categories": "محدود به این رده‌ها (رده‌ها را با «|» جدا کنید):",
-       "rc_categories_any": "هر کدام از منتخب‌ها",
        "rc-change-size-new": " $1دؤما تۀقیر دائن{{PLURAL:$1|بایت|بایتل}}",
        "newsectionsummary": "/* $1 */ بەخش نوو",
        "rc-enhanced-expand": "نمایش جزئیات",
index f3b0346..6f924de 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[tignìda d'öcc de {{PLURAL:$1|1 ütènt|$1 ütèncc}}]",
-       "rc_categories_any": "Töcc",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la mudìfica",
        "newsectionsummary": "/* $1 */ sezión növa",
        "rc-enhanced-expand": "Fà ved i detai",
index 4fcbd64..d2e5474 100644 (file)
@@ -54,8 +54,8 @@
        "tog-norollbackdiff": "فأرخیا نە د یئ گئل ڤادئما رأتئن د بئین بوریت",
        "tog-useeditwarning": "د گاتی کئ آلئشتیا ئمایە نأبینە د بألگە ڤیرایئشت ڤئ جا مئ نئم مئنە ڤارئسیاری بأک",
        "tog-prefershttps": "هأمیشە د گاتی کئ مئ هام د ساموٙنە پئیڤأند أمن نە ڤئ کار بئیر",
-       "underline-always": "هأمیشە",
-       "underline-never": "هیژڤأخت",
+       "underline-always": "همیشٱ",
+       "underline-never": "هیژۋخت",
        "underline-default": "پوٙسە یا دوڤارتە نییأر پیش فأرض",
        "editfont-style": "راساگه فونت شیڤات نە ڤیرایئشت کو",
        "editfont-monospace": "فونت تأک بألگە یی",
        "jan": "جانۋیٱ",
        "feb": "فۋریٱ",
        "mar": "مارس",
-       "apr": "آڤریل",
+       "apr": "آۋریل",
        "may": "مئی",
-       "jun": "جوٙأن",
+       "jun": "جۊٱن",
        "jul": "جوٙلای",
        "aug": "آگوست",
-       "sep": "سئپتامر",
-       "oct": "ئÙ\88کتÙ\88Ú¤ر",
+       "sep": "سپتامر",
+       "oct": "اÙ\88کتÙ\88بر",
        "nov": "نوڤامر",
        "dec": "داٛسامر",
        "january-date": "جانڤیە $1",
        "pool-servererror": "پوٙل ئشمار خئذمأتگە د دأسرئس نی($1).",
        "poolcounter-usage-error": "خأطا ڤئ کار گئرئتئن:$1",
        "aboutsite": "داٛبارٱ {{SITENAME}}",
-       "aboutpage": "پوروجٱ:دبارٱ",
+       "aboutpage": "Project:دبارٱ",
        "copyright": "مینوٙنە یا هان د دأسرئس $1 مأر یە کئ ڤئ یئ گئل شیڤە هأنی نیسأنە بوٙە.",
        "copyrightpage": "{{ns:project}}:کوپی رایت",
        "currentevents": "روخ ڤأنیا ئیسئنی",
-       "currentevents-url": "پوروجە یا:روخ ڤأنیا ئیسئنی",
+       "currentevents-url": "Project:روخ ۋٱنیا ایساٛنی",
        "disclaimers": "تیٱپۊشکاریا",
        "disclaimerpage": "پوروجٱ: تیٱپوشی کردن همٱگیر",
        "edithelp": "هومياری سی ڤیرایئشت",
        "newarticle": "تازە",
        "newarticletext": "شوما هایین ڤا دئما هوم پئیڤأندی کئ ڤوجوٙد نارە.\nسی رأڤأندیاری بألگە.شوروٙ بأکیت مینئ جأڤە هاری بأنیسیت (سی دوٙنئسئن بیشتئر سئیل [$1 ] بأکیت).\nأر شوما سی ئشتئڤا کئردئن هائیت ئیچئ، ری دوگمە ڤادئما رأتئن دوڤارتە نیأر بأپوٙرنیت.",
        "anontalkpagetext": "----",
-       "noarticletext": "د Ø¦Û\8cسئÙ\86Û\8cا Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84گؤ Ù\86Û\8cسئسÛ\95 Û\8cÛ\8c Ú¤Ù\88جÙ\88Ù\99د Ù\86اشتÛ\95.\nØ´Ù\88Ù\85ا Ù\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cت Ø¯[[Special:Search/{{PAGENAME}}|بگردÛ\8cد]] Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ø¯ Ø¨Ø£Ù\84Ú¯Û\95 Ù\87Ø£Ù\86Û\8c Û\8cا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ø¯ Ù\87Ø£Ù\86Û\8c Ù\86Û\95 Ù¾Ø¦Û\8c Ø¬Ù\88رÛ\8c Ø¨Ù\88Ù\99Û\95]</span>Ø\8c <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}} Û\8cا Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ú¤Û\8cراÛ\8cئشت Ø¨Ø£کیت]</span>.",
-       "noarticletext-nopermission": "د Ø¦Û\8cسئÙ\86Û\8cا Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84گؤ Ù\86Û\8cسئسÛ\95 Û\8cÛ\8c Ú¤Ù\88جÙ\88Ù\99د Ù\86اشتÛ\95.\nØ´Ù\88Ù\85ا Ù\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cت Ø¯[[Special:Search/{{PAGENAME}}|بگردÛ\8cد]] Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ø¯ Ø¨Ø£Ù\84Ú¯Û\95 Ù\87Ø£Ù\86Û\8c Û\8cا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ø¯ Ù\87Ø£Ù\86Û\8c Ù\86Û\95 Ù¾Ø¦Û\8c Ø¬Ù\88رÛ\8c Ø¨Ù\88Ù\99Û\95]</span>Ø\8c <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}}</span>.ڤأÙ\84Û\8c Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Û\8cÛ\95 Ù\86Û\95 Ú©Ø¦ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø±Ø§Ø³ Ø¨Ø£کیت ناریت.",
+       "noarticletext": "د Ø§Û\8cساÙ\9bÙ\86Û\8cا Ø§Û\8c Ø¨Ù\84Ú¯Ù± Ù\86Û\8cسسٱ Û\8bÙ\88جÛ\8aد Ù\86اشتٱ.\nØ´Ù\88Ù\85ا Ù\85Û\8c ØªÛ\8aÙ\86Û\8cت Ø¯[[Special:Search/{{PAGENAME}}|بگردÛ\8cد]] Ø¯ Ø§Û\8c Ø¨Ù\84Ú¯Ù± Ø§Û\8c Ø¯ Ø¨Ù\84Ú¯Ù± Ù\87Ù±Ù\86Û\8c Û\8cا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ø¯ Ù\86Û\8f Ù¾Û\8c Ø¬Û\8aرÛ\8c Ø¨Û\8aÙ±]</span>Ø\8c <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}} Û\8cا Ø§Û\8c Ø¨Ù\84Ú¯Ù± Ù\86اÙ\9b Û\8bÛ\8cراÛ\8cشت Ø¨Ù±کیت]</span>.",
+       "noarticletext-nopermission": "د Ø§Û\8cساÙ\9bÙ\86Û\8cا Ø§Û\8c Ø¨Ù\84Ú¯Ù± Ù\86Û\8cسسٱ Û\8cÛ\8c Û\8bÙ\88جÛ\8aد Ù\86اشتٱ.\nØ´Ù\88Ù\85ا Ù\85Û\8c ØªÛ\8aÙ\86Û\8cت Ø¯[[Special:Search/{{PAGENAME}}|بگردÛ\8cد]] Ø¯ Ø§Û\8c Ø¨Ù\84Ú¯Ù± Û\8cا Ø¯ Ø¨Ù\84Ú¯Ù± Ù\87Ù±Ù\86Û\8c Û\8cا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ø¯ Ù\86Û\8f Ù¾Û\8c Ø¬Û\8aرÛ\8c Ø¨Û\8aÙ±]</span>Ø\8c <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}}</span>.Û\8bÙ\84Û\8c Ø´Ù\88Ù\85ا Ø³Ø§Ù\9bÙ\84ا Û\8cÙ± Ù\86Ù± Ú©Ø§Ù\9b Ø§Û\8c  Ø¨Ù\84Ú¯Ù± Ù\86اÙ\9b Ø±Ø§Ø³ Ø¨Ù±کیت ناریت.",
        "missing-revision": "ڤانئیأری #$1 د بألگە یی کئ نومئش ڤئنە \"{{FULLPAGENAME}}\" ڤوجوٙد نارە.\n\nگاسی سی یئ گئل ڤیرگار ڤئ هئنگوم نأبییە کئ د یئ گئل بألگە پاکسا بییە هوم پئیڤأند بییە رأڤأندیاری بییە.\nگاسی جوزئیات د[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] دیاری بأکأن.",
        "userpage-userdoesnotexist": "حئساڤ کاریاری \"$1\" ثأڤت نأم نأبییە.\nأر میھایت ئی بألگە نئ بأسازیت یا ڤیرایئشت کاری بأکیت یئ گئل ڤارئسی أنجوم بئیتوٙ.",
        "userpage-userdoesnotexist-view": "حئساڤ کاریاری \"$1\" ثأڤت نأبییە.",
        "difference-title": "فرخ مینجا وانیریا \"$1\"",
        "difference-title-multipage": "فرخ مینجا بلگه یا \"$1\" و \"$2\"",
        "difference-multipage": "(فرخ مینجا بلگه یا)",
-       "lineno": "خط $1:",
+       "lineno": "خٱت $1:",
        "compareselectedversions": "دوبار دیئنیایی که انتخاو بینه مقایسه بکیتو",
        "showhideselectedversions": "شلک دیئن وانیریا انتخاو بیه نه آلشت بکید",
        "editundo": "ناانجومگر کردن",
        "next-page": "بلگه نهایی",
        "prevn-title": "پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}",
        "nextn-title": "نيايی $1 {{PLURAL:$1|نتيجه|نتيجيا}}",
-       "shown-title": "Ù\86ئشÙ\88Ù\99 Ø¯Ø£Ø¦Ù\86 $1 {{PLURAL:$1|Ù\86أتÛ\8cجÛ\95\86أتÛ\8cجÛ\95}} Ø³Û\8c Ù\87أر Ø¨Ø£Ù\84Ú¯Û\95",
+       "shown-title": "Ù\86Ø´Û\8a Ø¯Ù±Ø¦Ù\86 $1 {{PLURAL:$1|Ù\86تÛ\8cجٱ|Ù\86تÛ\8cجٱÛ\8cا}} Ø³Û\8c Ù\87ار Ø¨Ù\84Ú¯Ù±",
        "viewprevnext": "ديئن ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''ایچه بلگه ای هئ وه نوم\"[[:$1]]\" که ها د ای ویکی'''",
        "searchmenu-new": "'''ای بلگه نه راس كو \"[[:$1]]\" د ای  ويكي!'''",
        "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-redirect": "(ورگشتن $1)",
+       "search-redirect": "(ۋورگشتن سی $1)",
        "search-section": "(بهرجا $1)",
        "search-category": "(دسه $1)",
        "search-file-match": "(یکی کردن مینونه جانیا)",
        "rcshowhidecategorization": "جأرغە کاری بألگە $1",
        "rcshowhidecategorization-show": "نئشوٙ دأئن",
        "rcshowhidecategorization-hide": "قام کئردئن",
-       "rclinks": "آخرین آلشتیا $1 نشو بیه د اخرین روزیا $2",
+       "rclinks": "آخرین آلشتیا $1 د آخرین رۊزیا دیاری بٱک $2",
        "diff": "فأرخ",
        "hist": "ڤیرگار",
        "hide": "قام کئردئن",
        "boteditletter": "ب",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 دینه {{PLURAL:$1|کاریار|کاریاریا}}]",
-       "rc_categories": "جأرغە یا نە مأدوٙد کو(ڤا \"|\" جئگا بان)",
-       "rc_categories_any": "ھأرکوم کئ گولئ ڤورچیە بیینە",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت|بایتیا}} ناٛها آلشتکاری",
        "newsectionsummary": "/* $1 */ بهرجا تازه",
        "tooltip-pt-logout": "د سامونه دراومائن",
        "tooltip-pt-createaccount": "شما تشویق بییته که یه گل حساو راست بکیت و بیایت وامین؛ د هر جور ای کار اژباری نئ",
        "tooltip-ca-talk": "قسه دباره مینونه بلگه",
-       "tooltip-ca-edit": "شما تونيد ای  بلگه نه ويرايشت بكيد. لطف بكيد دگمه پيش ديئن پيش د اماییه کردن نه وه کار بیئریت",
+       "tooltip-ca-edit": "ۋیرایشت ای بلگٱ",
        "tooltip-ca-addsection": "د یه گل بهرجا هنی شرو بک",
        "tooltip-ca-viewsource": "ای بلگه پر و پیم بيه.\nشما تونيت سرچمه ش بئوينيت",
        "tooltip-ca-history": "دوواره ديئن ای بلگه",
        "tooltip-t-recentchangeslinked": "آلشتیا تازه باو مئن بلگيايي كه د ای بلگه هوم پیوند بيئنه",
        "tooltip-feed-rss": "هوال حون آر اس اس سی ای بلگه",
        "tooltip-feed-atom": "حوال هون اتمی سی ای بلگه",
-       "tooltip-t-contributions": "یه نوم گه د هومیاریا ای کارور",
+       "tooltip-t-contributions": "یاٛ گاٛل سیائٱ هومیاری سی {{GENDER:$1|ای کاریار}}",
        "tooltip-t-emailuser": "سی ای كارور ايميل كل كو",
        "tooltip-t-info": "دونسمنیا بیشتر دباره ای بلگه",
        "tooltip-t-upload": "سوارکردن جانیایا",
        "tooltip-ca-nstab-main": "ديئن مینونه بلگه",
        "tooltip-ca-nstab-user": "ديئن بلگه کاریار",
        "tooltip-ca-nstab-media": "دیئن بلگه وارسگر",
-       "tooltip-ca-nstab-special": "اي بلگه ويجه يه، شما نتونيت خود اي بلگه نه ويرايشت بكيد",
+       "tooltip-ca-nstab-special": "یٱ یاٛ گاٛل بلگٱ ۋیجٱ یٱ؛ نبۊٱ ۋیرایشتش بٱکیت",
        "tooltip-ca-nstab-project": "ديئن بلگه پروجه",
        "tooltip-ca-nstab-image": "ديئن بلگه جانیا",
        "tooltip-ca-nstab-mediawiki": "دیئن پیغوم سامونه",
        "spam_reverting": "واگردونی وه آخری نسقه ای که هوم پیوندی وه $1 ناره.",
        "spam_blanking": "همه وانئریایی که مینونه دار هوم پیوند $1 هئن، دارن حالی بوئن",
        "spam_deleting": "همه وانئریایی که مینونه دار هوم پیوند $1 هئن، دارن پاکساگری بوئن",
-       "simpleantispam-label": "وارسی ضد اسپم.\nای \"جاگه\" نه پر نکیت!",
+       "simpleantispam-label": "ۋارسی ری ۋ ری کاری اٛسپم.\nای \"جاگٱ\" نٱ پور نٱکیت!",
        "pageinfo-title": "دونسمنیا سی \"$1\"",
        "pageinfo-not-current": "د بدبختی،نبوئه که ای دونسمنیا نه سی وانئریا دماتری نهااماییه بکیت.",
        "pageinfo-header-basic": "دونسمنیا پایه",
        "file-info-size": "$1 × $2 پیکسل, انازه فایل: $3, MIME نوع: $4",
        "file-info-size-pages": "$1 × $2 pixels, انازه جانیا: $3, MIME type: $4, $5 {{PLURAL:$5|بلگه|بلگه یا}}",
        "file-nohires": "عسك ون بالاتري دش ني",
-       "svg-long-desc": "اس Ù\88Û\8c Ø¬Û\8c Ø¬Ø§Ù\86Û\8cا.Ù\86Ù\88Ù\85Ù\86 $1 $2 Ù¾Ù\8aÙ\83سÙ\84 $1",
+       "svg-long-desc": "جاÙ\86Û\8cا Ø§Ù\9bس Û\8bÛ\8c Ø¬Û\8c, Ù\86Ù\88Ù\85Û\8c $1 Ã\97 $2 Ù¾Û\8cکسÙ\84, Ù±Ù\86ازٱ Ø¬Ø§Ù\86Û\8cا: $3",
        "svg-long-desc-animated": "جانیا جمشدار اس وی جی .نومنا $1 × $2 پيكسل،انازه جانیا:$3",
        "svg-long-error": "جانیا اس وی جی نامعتور:$1",
        "show-big-image": "جانیا اصلی",
index 8055a37..873c63c 100644 (file)
        "botpasswords-insert-failed": "Nepavyko pridėti boto vardo \"$1\". Gal jis jau pridėtas?",
        "botpasswords-update-failed": "Nepavyko atnaujinti boto vardo \"$1\". Gal jis buvo ištrintas?",
        "botpasswords-created-title": "Boto slaptažodis sukurtas",
-       "botpasswords-created-body": "Naudotojo $2 boto „$1“ slaptažodis buvo sukurtas.",
+       "botpasswords-created-body": "{{GENDER:$2|Naudotojo|Naudotojos}} $2 boto „$1“ slaptažodis buvo sukurtas.",
        "botpasswords-updated-title": "Boto slaptažodis atnaujintas",
-       "botpasswords-updated-body": "Naudotojo $2 boto „$1“ slaptažodis buvo atnaujintas.",
+       "botpasswords-updated-body": "{{GENDER:$2|Naudotojo|Naudotojos}} $2 boto „$1“ slaptažodis buvo atnaujintas.",
        "botpasswords-deleted-title": "Boto slaptažodis ištrintas",
-       "botpasswords-deleted-body": "Naudotojo $2 boto „$1“ slaptažodis buvo ištrintas.",
+       "botpasswords-deleted-body": "{{GENDER:$2|Naudotojo|Naudotojos}} $2 boto „$1“ slaptažodis buvo ištrintas.",
        "botpasswords-newpassword": "Naujas slaptažodis prisijungimui su <strong>$1</strong> yra <strong>$2</strong>. <em>Prašome įsiminti jį naudojimui ateityje.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider nėra prieinamas.",
        "botpasswords-restriction-failed": "Boto slaptažodžio apribojimai draudžia šį prisijungimą.",
        "accmailtext": "Atsitiktinai sukurtas naudotojo [[User talk:$1|$1]] slaptažodis nusiųstas į $2.\n\nŠios naujos paskyros slaptažodis gali būti pakeistas <em>[[Special:ChangePassword|keisti slaptažodį]]</em> puslapyje beprisijungiant.",
        "newarticle": "(Naujas)",
        "newarticletext": "Jūs patekote į dar neegzistuojantį puslapį.\nNorėdami sukurti puslapį, pradėkite rašyti žemiau esančiame įvedimo lauke\n(plačiau [$1 pagalbos puslapyje]).\nJei patekote čia per klaidą, paprasčiausiai spustelkite  naršyklės mygtuką '''atgal'''.",
-       "anontalkpagetext": "----''Tai yra anoniminio naudotojo, nesusikūrusio arba nenaudojančio paskyros, aptarimų puslapis.\nDėl to naudojamas IP adresas jo identifikavimui.\nŠis IP adresas gali būti dalinamas keliems naudotojams.\nJeigu Jūs esate anoniminis naudotojas ir atrodo, kad komentarai nėra skirti Jums, [[Special:CreateAccount|sukurkite paskyrą]] arba [[Special:UserLogin|prisijunkite]], ir nebūsite tapatinamas su kitais anoniminiais naudotojais.''",
+       "anontalkpagetext": "----\n<em>Tai yra anoniminio naudotojo, nesusikūrusio arba nenaudojančio paskyros, aptarimų puslapis.</em>\nDėl to naudojamas IP adresas jo identifikavimui.\nŠis IP adresas gali priklausyti keliems naudotojams.\nJeigu Jūs esate anoniminis naudotojas ir atrodo, kad komentarai nėra skirti Jums, [[Special:CreateAccount|sukurkite paskyrą]] arba [[Special:UserLogin|prisijunkite]], ir nebūsite tapatinamas su kitais anoniminiais naudotojais.",
        "noarticletext": "Šiuo metu šiame puslapyje nėra jokio teksto.\nJūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] kituose puslapiuose,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ieškoti susijusių įrašų] arba [{{fullurl:{{FULLPAGENAME}}|action=edit}} sukurti šį puslapį]</span>.",
        "noarticletext-nopermission": "Šiuo metu šiame puslapyje nėra jokio teksto.\nJūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] kituose puslapiuose,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ieškoti susijusių įrašų]</span>, tačiau jūs neturite teisės sukurti šio puslapio.",
        "missing-revision": "Puslapio peržiūra #$1 pavadinto „{{FULLPAGENAME}}“ neegzistuoja.\n\nTai paprastai atsitinka kai pasenusi nuoroda veda į puslapį, kuris buvo ištrintas.\nInformaciją galima rasti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "userinvalidcssjstitle": "'''Dėmesio:''' Nėra jokios išvaizdos „$1“. Nepamirškite, kad savo .css ir .js puslapiai naudoja pavadinimą mažosiomis raidėmis, pvz., {{ns:user}}:Foo/vector.css, o ne {{ns:user}}:Foo/Vector.css.",
        "updated": "(Atnaujinta)",
        "note": "'''Pastaba:'''",
-       "previewnote": "''Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!'''",
+       "previewnote": "<strong>Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!</strong>",
        "continue-editing": "Eiti į redagavimo sritį",
        "previewconflict": "Ši peržiūra parodo tekstą iš viršutiniojo teksto redagavimo lauko taip, kaip jis bus rodomas, jei pasirinksite išsaugoti.",
        "session_fail_preview": "'''Atsiprašome! Mes negalime vykdyti jūsų keitimo dėl sesijos duomenų praradimo.\nPrašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijungti atgal.'''",
        "newpageletter": "N",
        "boteditletter": "a",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|stebintis naudotojas|stebintys naudotojai|stebinčių naudotojų}}]",
-       "rc_categories": "Riboti kategorijoms (atskirkite su „|“)",
-       "rc_categories_any": "Bet kuris iš pasirinktųjų",
        "rc-change-size-new": "$1 {{PLURAL:$1|baitas|baitai|baitų}} po pakeitimo",
        "newsectionsummary": "/* $1 */ naujas skyrius",
        "rc-enhanced-expand": "Rodyti detales",
        "backend-fail-read": "Negalima nuskaityti failo $1.",
        "backend-fail-create": "Negalima sukurti failo $1.",
        "backend-fail-maxsize": "Failo $1 sukurti nepavyko nes jis didesnis nei {{PLURAL:$2|vienas baitas|$2 baitai|$2 baitų}}.",
-       "backend-fail-readonly": "Galutinė saugykla \"$1\" dabar yra skirta tik skaitymui. Buvo nurodyta priežastis: \"$2\"",
+       "backend-fail-readonly": "Galutinė saugykla \"$1\" dabar yra skirta tik skaitymui. Nurodyta priežastis: <em>$2</em>",
        "backend-fail-synced": "Failas \"$1\", esantis vidinėje galutinėje saugykloje, yra pažymėtas kaip nepilnas.",
        "backend-fail-connect": "Negalima prisijungti prie galutinės saugyklos \"$1\".",
        "backend-fail-internal": "Nežinoma klaida įvyko galutinėje saugykloje \"$1\".",
        "editcomment": "Pateiktas toks keitimo paaiškinimas: <em>$1</em>.",
        "revertpage": "Atmestas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]]) pakeitimas; sugrąžinta [[User:$1|$1]] versija",
        "revertpage-nouser": "Atversti pakeitimai paslėpto vartotojo, grąžino prieš tai buvusią versiją {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Atmesti $1 pakeitimai;\ngrąžinta prieš tai buvusi $2 versija.",
+       "rollback-success": "Atmesti {{GENDER:$3|$1}} pakeitimai;\ngrąžinta prieš tai buvusi {{GENDER:$4|$2}} versija.",
        "rollback-success-notify": "Atmesti $1 pakeitimai;\ngrąžinta prieš tai buvusi $2 versija. [$3 Rodyti skirtumus]",
        "sessionfailure-title": "Sesijos klaida",
        "sessionfailure": "Atrodo yra problemų su jūsų prisijungimo sesija; šis veiksmas buvo atšauktas kaip atsargumo priemonė prieš sesijos vogimą.\nPrašome paspausti „atgal“ ir perkraukite puslapį iš kurio atėjote, ir pamėginkite vėl.",
        "delete_and_move_text": "Paskirties puslapis „[[:$1]]“ jau yra. Ar norite jį ištrinti, kad galėtumėte pervardinti?",
        "delete_and_move_confirm": "Taip, trinti puslapį",
        "delete_and_move_reason": "Ištrinta dėl perkėlimo iš \"[[$1]]\"",
-       "selfmove": "Šaltinio ir paskirties pavadinimai yra tokie patys; negalima pervardinti puslapio į save.",
+       "selfmove": " Pavadinimai yra tokie patys; negalima pervardyti puslapio į save.",
        "immobile-source-namespace": "Negalima perkelti puslapių vardų srityje „$1“",
        "immobile-target-namespace": "Perkelti puslapius į „$1“ vardų sritį negalima",
        "immobile-target-namespace-iw": "Tarprojektinė nuoroda yra neleistina paskirtis perkelti puslapį.",
        "import-nonewrevisions": "Nebuvo importuotos jokios versijos (visos jau buvo įkeltos arba praleistos dėl klaidų).",
        "xml-error-string": "$1 $2 eilutėje, $3 stulpelyje ($4 baitas): $5",
        "import-upload": "Įkelti XML duomenis",
-       "import-token-mismatch": "Sesijos duomenys prarasti.\n\nGali būti, kad esate atsijungęs. <strong>Prašome patikrinti, ar vis dar esate prisijungęs, ir pabandyti iš naujo</strong>.\nJei ir toliau nepavyksta, pamėginkite [[Special:UserLogout|atsijungti]] ir vėl prisijungti, taip pat patikrinkite, ar jūsų naršyklė priima šios svetainės slapukus.",
+       "import-token-mismatch": "Sesijos duomenys prarasti.\n\nGali būti, kad esate atsijungęs. '''Prašome patikrinti, ar vis dar esate prisijungęs, ir pabandyti iš naujo'''.\nJei ir toliau nepavyksta, pamėginkite [[Special:UserLogout|atsijungti]] ir vėl prisijungti, taip pat patikrinkite, ar jūsų naršyklė priima šios svetainės slapukus.",
        "import-invalid-interwiki": "Nepavyko importuoti iš nurodyto wiki projekto.",
        "import-error-edit": "Puslapis \"$1\" nebuvo įkeltas, nes jūs neturite teisės jį redaguoti.",
        "import-error-create": "Puslapis „$1“ nebuvo importuotas, nes jūs neturite teisės jį sukurti.",
        "rawhtml-notallowed": "&lt;html&gt; negali būti naudojamos ne normaliuose puslapiuose.",
        "gotointerwiki": "Išeinama iš {{SITENAME}}",
        "gotointerwiki-invalid": "Nurodytas pavadinimas negalimas.",
+       "undelete-cantedit": "Negalite atkurti šio puslapio, nes jums neleidžiama redaguoti šio puslapio.",
        "pagedata-title": "Puslapio duomenys",
        "pagedata-bad-title": "Negalimas pavadinimas: $1."
 }
index 3130025..c68c667 100644 (file)
        "newpageletter": "T",
        "boteditletter": "k",
        "number_of_watching_users_pageview": "[$1 hmangtu {{PLURAL:$1||te}} vil mék]",
-       "rc_categories": "Pawla bithliahna (\"|\" hmangin kárdan rawh)",
-       "rc_categories_any": "Väi",
        "rc-change-size-new": "Tihdanglam hnuah {{PLURAL:$1|bait|bait}} $1",
        "newsectionsummary": "/* $1 */ hläwm thar",
        "rc-enhanced-expand": "Tilang kim rawh (JavaScript a ngai)",
index ff62ec0..96c7c65 100644 (file)
        "newpageletter": "J",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|dalībnieki|dalībnieks|dalībnieki}}]",
-       "rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\"):",
-       "rc_categories_any": "Jebkas no izvēlētā",
        "rc-change-size-new": "$1 {{PLURAL:$1|baiti|baits|baiti}} pēc izmaiņām",
        "newsectionsummary": "/* $1 */ jauna sadaļa",
        "rc-enhanced-expand": "Skatīt detaļas",
index 95d230f..e121124 100644 (file)
        "newpageletter": "新",
        "boteditletter": "僕",
        "number_of_watching_users_pageview": "[放有$1哨]",
-       "rc_categories_any": "任",
        "rc-change-size-new": "既纂,本文有$1字節",
        "newsectionsummary": "/* $1 */ 新節",
        "rc-enhanced-expand": "示細",
index 280eefa..c1f7582 100644 (file)
        "minoreditletter": "çʼ",
        "newpageletter": "A",
        "boteditletter": "b",
-       "rc_categories_any": "Çkar",
        "rc-enhanced-expand": "Detayepe ko3ʼiri (JavaScript-i unon)",
        "rc-enhanced-hide": "Detayepe doşinaxi",
        "recentchangeslinked": "Alakʼali na renan oktirobape",
index fc89c73..f76bfc0 100644 (file)
        "boteditletter": "ब",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 ध्यान राखैवाला {{PLURAL:$1|प्रयोक्ता|प्रयोक्तासभ}}]",
-       "rc_categories": "श्रेणीसभ धरि सीमीत राखी (\"|\" सँ अलग करी)",
-       "rc_categories_any": "कोनो भी चुनिन्दा",
        "rc-change-size": "$1",
        "rc-change-size-new": "परिवर्तनक बाद $1 {{PLURAL:$1|बाइट}}",
        "newsectionsummary": "/* $1 */ नव अनुभाग",
index e07c525..72dcde6 100644 (file)
        "minoreditletter": "c",
        "newpageletter": "A",
        "boteditletter": "b",
-       "rc_categories": "Batesi gutul kategori (dipisah karo \"|\")",
-       "rc_categories_any": "Apa baen",
        "newsectionsummary": "/* $1 */ bagiyan anyar",
        "rc-enhanced-expand": "Tidokna detile (merlokna JavaScript)",
        "rc-enhanced-hide": "Umpetna rincian",
index 21121e9..33f6892 100644 (file)
        "newpageletter": "О",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 ваны {{PLURAL:$1|тии|тиихть}}]",
-       "rc_categories": "Аньцек категориеста (явфтомс \"|\" вельде)",
-       "rc_categories_any": "Эрь кодама",
        "newsectionsummary": "/* $1 */ од пялькс",
        "rc-enhanced-expand": "Няфтемс анцяйнятне (эряви JavaScript)",
        "rc-enhanced-hide": "Кяшемс анцяйнятне",
index 2a527db..c775763 100644 (file)
        "newpageletter": "V",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|mpikambana|mpikambana}} manara-maso]",
-       "rc_categories": "Ferana amin'ireto sokajy ireto (saraho amin'ny \"|\")",
-       "rc_categories_any": "Anisan'ireo nofidiana",
        "rc-change-size-new": "$1{{PLURAL:}} oktety taorian'ny fanovana",
        "newsectionsummary": "/* $1 */ fizarana vaovao",
        "rc-enhanced-expand": "Hijery ny antsipirihany",
index 80bb903..88b8dbd 100644 (file)
        "newpageletter": "Н",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник што набљудува|корисници што набљудуваат}}]",
-       "rc_categories": "Само од категории (одделувајќи со „|“):",
-       "rc_categories_any": "Било која од избраните",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајти}} по промената",
        "newsectionsummary": "/* $1 */ ново заглавие",
        "rollback-success": "Откажани уредувањата на {{GENDER:$3|$1}};; вратено на последната верзија на {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Откажани уредувањата на $1;\nвратено на последната преработка на $2. [$3 Пок. промени]",
        "sessionfailure-title": "Седницата не успеа",
-       "sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
+       "sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПоднесете го образецот повторно.",
        "changecontentmodel": "Промена на содржинскиот модел на страница",
        "changecontentmodel-legend": "Промена на содржински модел",
        "changecontentmodel-title-label": "Наслов на страницата",
        "thumbnail_dest_directory": "Целниот именик не може да се создаде",
        "thumbnail_image-type": "Неподдржан тип на слика",
        "thumbnail_gd-library": "Нецелосни поставки на графичката библиотека: недостасува функцијата $1",
+       "thumbnail_image-size-zero": "Големината на сликата е нула.",
        "thumbnail_image-missing": "Изгледа дека податотеката недостасува: $1",
        "thumbnail_image-failure-limit": "Направив премногу обиди ($1 или повеќе) за да ја прикажам минијатурава. Обидете се подоцна.",
        "import": "Увезување на страници",
        "watchlistedit-clear-titles": "Наслови:",
        "watchlistedit-clear-submit": "Исчисти ги набљудуваните (Ова е трајно!)",
        "watchlistedit-clear-done": "Вашиот список на набљудувања е исчистен.",
+       "watchlistedit-clear-jobqueue": "Вашите набљудувања се чистат. Ова може да потрае!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Избришан е еден наслов|Избришани се $1 наслови}}:",
        "watchlistedit-too-many": "Има премногу страници за да можат тука да се прикажат.",
        "watchlisttools-clear": "Исчисти ги набљудуваните",
index e10dd2b..7f068cd 100644 (file)
        "accmailtext": "[[User talk:$1|$1]] എന്ന ഉപയോക്താവിനുള്ള ക്രമരഹിതമായി നിർമ്മിച്ച രഹസ്യവാക്ക് $2 എന്ന വിലാസത്തിലേക്ക് അയച്ചിട്ടുണ്ട്. പ്രവേശിച്ചതിനു ശേഷം ഇത് ''[[Special:ChangePassword|രഹസ്യവാക്ക് മാറ്റുക]]'' എന്ന താളിൽ മാറ്റാവുന്നതാണ്.",
        "newarticle": "(പുതിയത്)",
        "newarticletext": "ഇതുവരെ നിലവിലില്ലാത്ത ഒരു താൾ സൃഷ്ടിക്കാനുള്ള ശ്രമത്തിലാണ് താങ്കൾ. അതിനായി താഴെ ആവശ്യമുള്ള വിവരങ്ങൾ എഴുതിച്ചേർത്ത് സേവ് ചെയ്യുക (കൂടുതൽ വിവരങ്ങൾക്ക് [$1 സഹായം താൾ] കാണുക). താങ്കളിവിടെ അബദ്ധത്തിൽ വന്നതാണെങ്കിൽ ബ്രൗസറിന്റെ ബാക്ക് ബട്ടൺ ഞെക്കിയാൽ തിരിച്ചുപോകാം.",
-       "anontalkpagetext": "----\n{| class=\"messagebox standard-talk\" style=\"border: 1px solid #B3B300; background-color:#FFFFBF; text-align: left;\"\n|\n''ഇതുവരെ അംഗത്വം എടുക്കാതിരിക്കുകയോ, നിലവിലുള്ള അംഗത്വം ഉപയോഗിക്കാതിരിക്കുകയോ ചെയ്യുന്ന '''ഒരു അജ്ഞാത ഉപയോക്താവിന്റെ സം‌വാദം താളാണിത്'''.\nഅതിനാൽ അദ്ദേഹത്തെ തിരിച്ചറിയുവാൻ അക്കരൂപത്തിലുള്ള ഐ.പി. വിലാസം ഉപയോഗിക്കേണ്ടതുണ്ട്. ഇത്തരം ഒരു ഐ.പി. വിലാസം പല ഉപയോക്താക്കൾ പങ്കുവെക്കുന്നുണ്ടാവാം.\nതാങ്കൾ ഈ സന്ദേശം ലഭിച്ച ഒരു അജ്ഞാത ഉപയോക്താവാണെങ്കിൽ, ഭാവിയിൽ ഇതര ഉപയോക്താക്കളുമായി ഉണ്ടായേക്കാവുന്ന ആശയക്കുഴപ്പം ഒഴിവാക്കാൻ ദയവായി [[Special:CreateAccount|ഒരു അംഗത്വമെടുക്കുക]] അല്ലെങ്കിൽ  [[Special:UserLogin|പ്രവേശിക്കുക]].\n|}",
+       "anontalkpagetext": "----\n<em>ഇതുവരെ അംഗത്വം എടുക്കാതിരിക്കുകയോ, നിലവിലുള്ള അംഗത്വം ഉപയോഗിക്കാതിരിക്കുകയോ ചെയ്യുന്ന ഒരു അജ്ഞാത ഉപയോക്താവിന്റെ സം‌വാദം താളാണിത്.</em>\nഅതിനാൽ അദ്ദേഹത്തെ തിരിച്ചറിയുവാൻ അക്കരൂപത്തിലുള്ള ഐ.പി. വിലാസം ഉപയോഗിക്കേണ്ടതുണ്ട്. ഇത്തരം ഒരു ഐ.പി. വിലാസം പല ഉപയോക്താക്കൾ പങ്കുവെക്കുന്നുണ്ടാവാം.\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": "ഇപ്പോൾ ഈ താളിൽ എഴുത്തുകളൊന്നും ഇല്ല.\nതാങ്കൾക്ക് മറ്റു താളുകളിൽ [[Special:Search/{{PAGENAME}}|ഈ താളിന്റെ തലക്കെട്ടിനായി തിരയാവുന്നതാണ്‌]], അല്ലെങ്കിൽ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ബന്ധപ്പെട്ട രേഖകൾ പരിശോധിക്കാവുന്നതാണ്‌]</span>. പക്ഷേ ഈ താൾ സൃഷ്ടിക്കാൻ താങ്കൾക്ക് അനുവാദമില്ല.",
        "missing-revision": "\"{{FULLPAGENAME}}\" എന്ന താളിന്റെ #$1 എന്ന നാൾപ്പതിപ്പ് നിലവിലില്ല.\n\nമായ്ക്കപ്പെട്ട താളിന്റെ കാലഹരണപ്പെട്ട നാൾവഴി കണ്ണി ഉപയോഗിച്ചാലാണ് സാധാരണ ഇങ്ങനെ സംഭവിക്കുക.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] കാണാവുന്നതാണ്.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" എന്ന ഉപയോക്താവ് അംഗത്വമെടുത്തിട്ടില്ല. ഈ താൾ സൃഷ്ടിക്കണമോ എന്നതു പരിശോധിക്കുക.",
        "userpage-userdoesnotexist-view": "\"$1\" എന്ന അം‌ഗത്വം നിലവിലില്ല.",
        "blocked-notice-logextract": "ഈ ഉപയോക്താവ് ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്.\nതടയൽ രേഖയിലെ പുതിയ ഉൾപ്പെടുത്തൽ അവലംബമായി താഴെ നൽകിയിരിക്കുന്നു:",
-       "clearyourcache": "'''ശ്രദ്ധിക്കുക:''' സേവ് ചെയ്തശേഷം മാറ്റങ്ങൾ കാണാനായി താങ്കൾക്ക് ബ്രൗസറിന്റെ കാഷെ ഒഴിവാക്കേണ്ടി വന്നേക്കാം.\n* '''ഫയർഫോക്സ് / സഫാരി:'''  ''Reload'' ബട്ടൺ അമർത്തുമ്പോൾ ''Shift'' കീ അമർത്തി പിടിക്കുകയോ, ''Ctrl-F5'' അല്ലെങ്കിൽ  ''Ctrl-R''  (മാക്കിന്റോഷിൽ ''⌘-R'' ) എന്ന് ഒരുമിച്ച് അമർത്തുകയോ ചെയ്യുക\n* '''ഗൂഗിൾ ക്രോം:'''  ''Ctrl-Shift-R'' (മാക്കിന്റോഷിൽ ''⌘-Shift-R'' ) അമർത്തുക\n* '''ഇന്റർനെറ്റ് എക്സ്പ്ലോറർ:''' ''Refresh'' ബട്ടൺ അമർത്തുമ്പോൾ ''Ctrl'' കീ അമർത്തിപിടിക്കുക. അല്ലെങ്കിൽ ''Ctrl-F5'' അമർത്തുക\n* '''ഓപ്പറ:'''  ''Tools→Preferences'' ഉപയോഗിച്ച് കാഷെ പൂർണ്ണമായും ക്ലിയർ ചെയ്യുക",
+       "clearyourcache": "<strong>ശ്രദ്ധിക്കുക:</strong> സേവ് ചെയ്തശേഷം മാറ്റങ്ങൾ കാണാനായി താങ്കൾക്ക് ബ്രൗസറിന്റെ കാഷെ ഒഴിവാക്കേണ്ടി വന്നേക്കാം.\n* <strong>ഫയർഫോക്സ് / സഫാരി:</strong>  <em>Reload</em> ബട്ടൺ അമർത്തുമ്പോൾ <em>Shift</em> കീ അമർത്തി പിടിക്കുകയോ, <em>Ctrl-F5</em> അല്ലെങ്കിൽ  <em>Ctrl-R</em>  (മാക്കിന്റോഷിൽ <em>⌘-R</em> ) എന്ന് ഒരുമിച്ച് അമർത്തുകയോ ചെയ്യുക\n* <strong>ഗൂഗിൾ ക്രോം:</strong>  <em>Ctrl-Shift-R</em> (മാക്കിന്റോഷിൽ <em>⌘-Shift-R</em> ) അമർത്തുക\n* <strong>ഇന്റർനെറ്റ് എക്സ്പ്ലോറർ:</strong> <em>Refresh</em> ബട്ടൺ അമർത്തുമ്പോൾ <em>Ctrl</em> കീ അമർത്തിപിടിക്കുക. അല്ലെങ്കിൽ <em>Ctrl-F5</em> അമർത്തുക\n* <strong>ഓപ്പറ:</strong>  <em>Menu → Settings</em> എടുക്കുക  (മാക്കിൽ <em>Opera → Preferences</em>) എന്നിട്ട് <em>Privacy & security → Clear browsing data → Cached images and files</em> ചെയ്യുക.",
        "usercssyoucanpreview": "'''വഴികാട്ടി:''' താങ്കളുടെ പുതിയ CSS സേവ് ചെയ്യുന്നതിനു മുമ്പ് \"{{int:showpreview}}\" എന്ന ബട്ടൻ ഉപയോഗിച്ച് പരിശോധിക്കുക.",
        "userjsyoucanpreview": "'''വഴികാട്ടി:''' താങ്കളുടെ പുതിയ ജാവാസ്ക്രിപ്റ്റ് സേവ് ചെയ്യുന്നതിനു മുമ്പ് \"{{int:showpreview}}\" എന്ന ബട്ടൻ ഉപയോഗിച്ച് പരിശോധിക്കുക.",
        "usercsspreview": "'''താങ്കൾ താങ്കളുടെ സ്വന്തം സി.എസ്.എസ്. പ്രിവ്യൂ ചെയ്യുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക.'''\n'''ഇതു സേവ് ചെയ്തിട്ടില്ല!'''",
        "postedit-confirmation-created": "താൾ സൃഷ്ടിച്ചിരിക്കുന്നു.",
        "postedit-confirmation-restored": "താൾ പുൻഃസ്ഥാപിച്ചിരിക്കുന്നു.",
        "postedit-confirmation-saved": "താങ്കളുടെ തിരുത്ത് സേവ് ചെയ്തിരിക്കുന്നു.",
+       "postedit-confirmation-published": "താങ്കളുടെ തിരുത്ത് പ്രസിദ്ധീകരിച്ചിരിക്കുന്നു.",
        "edit-already-exists": "പുതിയ താൾ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.\nതാൾ ഇപ്പോൾ തന്നെ നിലവിലുണ്ട്.",
        "defaultmessagetext": "സ്വതേയുള്ള സന്ദേശ എഴുത്ത്",
        "content-failed-to-parse": "$2 ഉള്ളടക്കം $1 മാതൃകയിൽ പാഴ്സ് ചെയ്യൽ പരാജയപ്പെട്ടു: $3",
        "invalid-content-data": "അസാധുവായ ഉള്ളടക്ക ഡേറ്റ",
        "content-not-allowed-here": "\"$1\" ഉള്ളടക്കം [[$2]] താളിൽ അനുവദിക്കുന്നില്ല",
        "editwarning-warning": "ഈ താളിൽ നിന്നും പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കും.\nതാങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ \"{{int:prefs-editing}}\"  എന്ന ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കാവുന്നതാണ്.",
+       "editpage-invalidcontentmodel-title": "ഉള്ളടക്ക രീതി പിന്തുണയ്ക്കുന്നില്ല",
        "editpage-notsupportedcontentformat-title": "ഉള്ളടക്ക ഫോർമാറ്റ് പിന്തുണയ്ക്കുന്നില്ല",
        "editpage-notsupportedcontentformat-text": "ഉള്ളടക്കത്തിന്റെ ഫോർമാറ്റ് ആയ $1 ഉള്ളടക്ക രീതിയായ $2 പിന്തുണയ്ക്കുന്നില്ല.",
        "content-model-wikitext": "വിക്കിഎഴുത്ത്",
        "page_last": "അവസാന",
        "histlegend": "വ്യത്യാസങ്ങൾ ഒത്തുനോക്കാൻ: ഒത്തുനോക്കേണ്ട പതിപ്പുകൾക്കൊപ്പമുള്ള റേഡിയോ ബട്ടൺ തിരഞ്ഞെടുത്ത് ''\"തിരഞ്ഞെടുത്ത പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം കാണുക\"'' എന്ന ബട്ടൺ ഞെക്കുകയോ ''എന്റർ'' കീ അമർത്തുകയോ ചെയ്യുക.<br />\n\nസൂചന: (ഇപ്പോൾ) = നിലവിലുള്ള പതിപ്പുമായുള്ള വ്യത്യാസം, (മുമ്പ്) = തൊട്ടുമുൻപത്തെ പതിപ്പുമായുള്ള വ്യത്യാസം, (ചെ.) = ചെറിയ തിരുത്ത്.",
        "history-fieldset-title": "നാൾവഴി പരിശോധന",
-       "history-show-deleted": "മായ്ക്കപ്പെട്ടവ മാത്രം",
+       "history-show-deleted": "നാൾപàµ\8dപതിപàµ\8dà´ªàµ\8d à´®à´¾à´¯àµ\8dà´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´µ à´®à´¾à´¤àµ\8dà´°à´\82",
        "histfirst": "ഏറ്റവും പഴയവ",
        "histlast": "ഏറ്റവും പുതിയവ",
        "historysize": "({{PLURAL:$1|1 ബൈറ്റ്|$1 ബൈറ്റുകൾ}})",
        "revdelete-unsuppress": "പുനഃസ്ഥാപിച്ച പതിപ്പുകളിലുള്ള നിയന്ത്രണങ്ങൾ ഒഴിവാക്കുക",
        "revdelete-log": "കാരണം:",
        "revdelete-submit": "തിരഞ്ഞെടുത്ത {{PLURAL:$1|നാൾപ്പതിപ്പിനു|നാൾപ്പതിപ്പുകൾക്ക്}} ബാധകമാക്കുക",
-       "revdelete-success": "'''നാൾപ്പതിപ്പുകളുടെ ദർശനീയത വിജയകരമായി പുതുക്കിയിരിക്കുന്നു.'''",
+       "revdelete-success": "നാൾപ്പതിപ്പുകളുടെ ദർശനീയത പുതുക്കിയിരിക്കുന്നു.",
        "revdelete-failure": "'''നാൾപ്പതിപ്പിന്റെ ദർശനീയത പുതുക്കാൻ കഴിഞ്ഞില്ല:'''\n$1",
-       "logdelete-success": "'''രേഖയുടെ ദൃശ്യത വിജയകരമായി നിശ്ചിതപ്പെടുത്തി.'''",
+       "logdelete-success": "രേഖയുടെ ദൃശ്യത നിശ്ചിതപ്പെടുത്തി.",
        "logdelete-failure": "'''രേഖയുടെ ദൃശ്യത നിശ്ചിതപ്പെടുത്താൻ കഴിഞ്ഞില്ല:'''\n$1",
        "revdel-restore": "കാണുന്ന രൂപത്തിൽ മാറ്റം വരുത്തുക",
        "pagehist": "താളിന്റെ നാൾവഴി",
        "mergehistory-empty": "സം‌യോജിപ്പിക്കാവുന്ന പതിപ്പുകളൊന്നും ഇല്ല.",
        "mergehistory-done": "$1-ന്റെ {{PLURAL:$3|പതിപ്പ്|പതിപ്പുകൾ}} [[:$2]]-ലേക്കു വിജയകരമായി സം‌യോജിപ്പിച്ചിരിക്കുന്നു.",
        "mergehistory-fail": "താളുകളുടെ നാൾവഴി സം‌യോജനം നടത്താൻ സാദ്ധ്യമല്ല. താളുകളും സമയവിവരങ്ങളും ഒന്നു കൂടി പരിശോധിക്കുക.",
+       "mergehistory-fail-bad-timestamp": "സമയമുദ്ര അസാധുവാണ്.",
+       "mergehistory-fail-invalid-source": "സ്രോതസ്സ് താൾ അസാധുവാണ്.",
+       "mergehistory-fail-invalid-dest": "ലക്ഷ്യതാൾ അസാധുവാണ്.",
        "mergehistory-fail-permission": "താങ്കൾക്ക് നാൾവഴികൾ ലയിപ്പിക്കാനുള്ള അനുമതി ഇല്ല.",
        "mergehistory-fail-self-merge": "സ്രോതസ്സ് - ലക്ഷ്യ താളുകൾക്ക് ഒരേ പേര്‌ ഉണ്ടാകാൻ പാടില്ല.",
        "mergehistory-fail-toobig": "{{PLURAL:$1|ഒരു നാൾപ്പതിപ്പിൽ|$1 നാൾപ്പതിപ്പുകൾ}} മാറ്റണമെന്നതിനാൽ നാൾവഴി ലയിപ്പിക്കാൽ നടത്താനാവില്ല.",
        "userrights": "ഉപയോക്തൃ അവകാശ പരിപാലനം",
        "userrights-lookup-user": "ഉപയോക്താവിനെ തിരഞ്ഞെടുക്കുക",
        "userrights-user-editname": "ഒരു ഉപയോക്തൃനാമം ടൈപ്പു ചെയ്യുക:",
-       "editusergroup": "{{GENDER:$1|ഉപയോക്തൃസംഘങ്ങൾ}} തിരുത്തുക",
-       "editinguser": "{{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2 എന്ന ഉപയോക്താവിന്റെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുന്നു",
-       "userrights-editusergroup": "ഉപയോക്തൃസമൂഹത്തിലെ അംഗത്വം തിരുത്തുക",
+       "editusergroup": "ഉപയോക്തൃസംഘങ്ങൾ എടുക്കുക",
+       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 എന്ന {{GENDER:$1|ഉപയോക്താവിന്റെ}} ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുന്നു",
+       "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 എന്ന {{GENDER:$1|ഉപയോക്താവിന്റെ}} ഉപയോക്തൃ അവകാശങ്ങൾ കാണുന്നു",
+       "userrights-editusergroup": "{{GENDER:$1|ഉപയോക്തൃസംഘങ്ങൾ}} തിരുത്തുക",
+       "userrights-viewusergroup": "{{GENDER:$1|ഉപയോക്തൃസംഘങ്ങൾ}} കാണുക",
        "saveusergroups": "{{GENDER:$1|ഉപയോക്തൃസംഘങ്ങൾ}} സേവ് ചെയ്യുക",
        "userrights-groupsmember": "അംഗത്വമുള്ളത്:",
        "userrights-groupsmember-auto": "അന്തർലീനമായ അംഗത്വം:",
-       "userrights-groups-help": "ഈ ഉപയോക്താവ് ഉൾപ്പെട്ടിട്ടുള്ള സംഘങ്ങൾ താങ്കൾക്ക് മാറ്റാവുന്നതാണ്:\n*ഉപയോക്താവ് ആ സംഘത്തിലുണ്ടെന്ന് ശരിയിട്ട ചതുരം അർത്ഥമാക്കുന്നു.\n*ഉപയോക്താവ് ആ സംഘത്തിലില്ലെന്ന് ശരിയിടാത്ത ചതുരം അർത്ഥമാക്കുന്നു.\n*സംഘങ്ങളോടൊപ്പമുള്ള *,  ഒരിക്കൽ മാറ്റം വരുത്തിയാൽ പിന്നീട് അതിൽ മാറ്റം വരുത്താൻ താങ്കൾക്ക് കഴിയില്ലെന്ന് അർത്ഥമാക്കുന്നു.",
+       "userrights-groups-help": "ഈ ഉപയോക്താവ് ഉൾപ്പെട്ടിട്ടുള്ള സംഘങ്ങൾ താങ്കൾക്ക് മാറ്റാവുന്നതാണ്:\n* ഉപയോക്താവ് ആ സംഘത്തിലുണ്ടെന്ന് ശരിയിട്ട ചതുരം അർത്ഥമാക്കുന്നു.\n* ഉപയോക്താവ് ആ സംഘത്തിലില്ലെന്ന് ശരിയിടാത്ത ചതുരം അർത്ഥമാക്കുന്നു.\n* സംഘങ്ങളോടൊപ്പമുള്ള *,  ഒരിക്കൽ മാറ്റം വരുത്തിയാൽ പിന്നീട് അതിൽ മാറ്റം വരുത്താൻ താങ്കൾക്ക് കഴിയില്ലെന്ന് അർത്ഥമാക്കുന്നു.\n* സംഘങ്ങളോടൊപ്പമുള്ള #, സംഘാംഗത്വത്തിന്റെ കാലാവാധി പിന്നോട്ടാക്കാമെന്ന് സൂചിപ്പിക്കുന്നു; താങ്കൾക്കത് മുന്നോട്ടാക്കാൻ സാധിക്കുകയില്ല.",
        "userrights-reason": "കാരണം:",
        "userrights-no-interwiki": "മറ്റ് വിക്കികളിലെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുവാൻ താങ്കൾക്ക് അനുമതിയില്ല.",
        "userrights-nodatabase": "$1 എന്ന ഡാറ്റാബേസ് നിലവിലില്ല അല്ലെങ്കിൽ പ്രാദേശികമല്ല.",
        "userrights-expiry-existing": "നിലവിലെ കാലഹരണ കാലാവധി: $3, $2",
        "userrights-expiry-othertime": "മറ്റ് കാലയളവ്:",
        "userrights-expiry-options": "ഒരു ദിവസം:1 day,ഒരു ആഴ്ച:1 week,ഒരു മാസം:1 month,3 മാസം:3 months,6 മാസം:6 months,ഒരു വർഷം:1 year",
+       "userrights-invalid-expiry": "ഗണം \"$1\" കാലഹരണപ്പെടാനുള്ള സമയം അസാധുവാണ്.",
+       "userrights-expiry-in-past": "ഗണം \"$1\" കാലഹരണപ്പെടാനുള്ള സമയം ഭൂതകാലത്തിലാണ്.",
        "userrights-conflict": "ഉപയോക്തൃ അവകാശങ്ങളുടെ മാറ്റം സമരസപ്പെടായ്കയുണ്ടായി! ദയവായി താങ്കളുടെ മാറ്റങ്ങൾ വീണ്ടും സംശോധനം ചെയ്ത് സ്ഥിരീകരിച്ച് നടപ്പിലാക്കുക.",
        "group": "സംഘം:",
        "group-user": "ഉപയോക്താക്കൾ",
        "rightslogtext": "ഈ പ്രവർത്തനരേഖ ഉപയോക്തൃ അവകാശങ്ങൾക്കുണ്ടായ മാറ്റങ്ങളുടേതാണ്.",
        "action-read": "ഈ താൾ വായിക്കുക",
        "action-edit": "ഈ താൾ തിരുത്തുക",
-       "action-createpage": "താളàµ\81à´\95ൾ à´¨à´¿àµ¼à´®àµ\8dà´®ിക്കുക",
-       "action-createtalk": "à´¸à´\82വാദ à´¤à´¾à´³àµ\81à´\95ൾ à´¨à´¿àµ¼à´®àµ\8dà´®ിക്കുക",
+       "action-createpage": "à´\88 à´¤à´¾àµ¾ à´¸àµ\83à´·àµ\8dà´\9fിക്കുക",
+       "action-createtalk": "à´\88 à´¸à´\82വാദതàµ\8dതാൾ à´¸àµ\83à´·àµ\8dà´\9fിക്കുക",
        "action-createaccount": "ഈ ഉപയോക്തൃനാമം സൃഷ്ടിക്കുക",
        "action-autocreateaccount": "ബാഹ്യ ഉപയോക്തൃ അംഗത്വം സ്വതേ സൃഷ്ടിക്കുക",
        "action-history": "ഈ താളിന്റെ നാൾവഴി കാണുക",
        "action-upload_by_url": "ഈ പ്രമാണം ഒരു യൂ.ആർ.എല്ലിൽ നിന്നും അപ്‌ലോഡ് ചെയ്യുക",
        "action-writeapi": "തിരുത്താനുള്ള എ.പി.ഐ. ഉപയോഗിക്കുക",
        "action-delete": "ഈ താൾ മായ്ക്കുക",
-       "action-deleterevision": "ഈ നാൾപ്പതിപ്പ് മായ്ക്കുക",
-       "action-deletedhistory": "ഈ താളിന്റെ മായ്ക്കപ്പെട്ട ചരിത്രം കാണുക",
+       "action-deleterevision": "നാൾപതിപ്പുകൾ മായ്ക്കുക",
+       "action-deletelogentry": "രേഖയിലെ ഉൾപ്പെടുത്തലുകൾ മായ്ക്കുക",
+       "action-deletedhistory": "ഒരു താളിന്റെ മായ്ക്കപ്പെട്ട ചരിത്രം കാണുക",
+       "action-deletedtext": "മായ്ക്കപ്പെട്ട നാൾപ്പതിപ്പിലെ എഴുത്ത് കാണുക",
        "action-browsearchive": "മായ്ക്കപ്പെട്ട താളുകൾ അന്വേഷിക്കുക",
-       "action-undelete": "à´\88 à´¤à´¾ൾ പുനഃസ്ഥാപിക്കുക",
-       "action-suppressrevision": "മറà´\9aàµ\8dà´\9aà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´\88 à´¨à´¾àµ¾à´°àµ\82à´ªà´\82 പുനഃപരിശോധിക്കുക അല്ലെങ്കിൽ പുനഃസ്ഥാപിക്കുക",
+       "action-undelete": "താളàµ\81à´\95ൾ പുനഃസ്ഥാപിക്കുക",
+       "action-suppressrevision": "മറà´\9aàµ\8dà´\9aà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¨à´¾àµ¾à´ªàµ\8dപതിപàµ\8dà´ªàµ\81à´\95ൾ പുനഃപരിശോധിക്കുക അല്ലെങ്കിൽ പുനഃസ്ഥാപിക്കുക",
        "action-suppressionlog": "ഈ സ്വകാര്യ രേഖ കാണുക",
        "action-block": "ഈ ഉപയോക്താവിനെ തിരുത്തുന്നതിൽ നിന്നും തടയുക",
        "action-protect": "ഈ താളിന്റെ സം‌രക്ഷണ മാനത്തിൽ വ്യത്യാസം വരുത്തുക",
        "action-userrights-interwiki": "മറ്റു വിക്കികളിൽ നിന്നുള്ള ഉപയോക്താക്കളുടെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുക",
        "action-siteadmin": "ഡേറ്റാബേസ് തുറക്കുക അല്ലെങ്കിൽ പൂട്ടുക",
        "action-sendemail": "ഇമെയിലുകൾ അയയ്ക്കുക",
+       "action-editmyoptions": "താങ്കളുടെ ക്രമീകരണങ്ങൾ തിരുത്തുക",
        "action-editmywatchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക തിരുത്തുക",
        "action-viewmywatchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക കാണുക",
        "action-viewmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ കാണുക",
        "action-editmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ തിരുത്തുക",
        "action-editcontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
-       "action-managechangetags": "à´¡àµ\87à´±àµ\8dറാബàµ\87സിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´³àµ\8dà´³ à´\9fà´¾à´\97àµ\81à´\95ൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´®à´¾à´¯àµ\8dക്കുക",
+       "action-managechangetags": "à´\9fà´¾à´\97àµ\81à´\95ൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¸à´\9càµ\8dà´\9cമാà´\95àµ\8dà´\95àµ\81à´\95/à´\92ഴിവാക്കുക",
        "action-applychangetags": "താങ്കളുടെ മാറ്റങ്ങൾക്കൊപ്പം ടാഗുകൾ ബാധകമാക്കുക",
        "action-changetags": "ഒറ്റയൊറ്റ നാൾപ്പതിപ്പുകൾക്കും രേഖയിലെ ഉൾപ്പെടുത്തലുകൾക്കും ഐച്ഛിക ടാഗുകൾ ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
+       "action-purge": "താൾ ശുദ്ധീകരിച്ചെടുക്കുക",
        "nchanges": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}",
        "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}",
        "enhancedrc-history": "നാൾവഴി",
        "rcfilters-group-results-by-page": "ഫലങ്ങൾ താളനുസരിച്ച് ഗണങ്ങളാക്കുക",
        "rcfilters-activefilters": "സജീവ അരിപ്പകൾ",
        "rcfilters-advancedfilters": "വിപുല അരിപ്പകൾ",
-       "rcfilters-limit-title": "à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95àµ\87à´£àµ\8dà´\9f à´®à´¾à´±àµ\8dà´±ങ്ങൾ",
+       "rcfilters-limit-title": "à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95àµ\87à´£àµ\8dà´\9f à´«à´²ങ്ങൾ",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}, $2",
        "rcfilters-date-popup-title": "തിരയേണ്ട കാലം",
        "rcfilters-days-title": "സമീപദിവസങ്ങൾ",
        "rcfilters-restore-default-filters": "സ്വതേയുള്ള അരിപ്പകൾ പുനഃസ്ഥാപിക്കുക",
        "rcfilters-clear-all-filters": "എല്ലാ അരിപ്പകളും ഒഴിവാക്കുക",
        "rcfilters-show-new-changes": "ഏറ്റവും പുതിയ മാറ്റങ്ങൾ കാണുക",
-       "rcfilters-search-placeholder": "സമàµ\80à´ªà´\95ാലമാറàµ\8dà´±à´\99àµ\8dà´\99ൾ à´\85à´°à´¿à´\9aàµ\8dà´\9aàµ\86à´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95 (à´¬àµ\8dà´°àµ\97à´¸àµ\8d à´\9aàµ\86à´¯àµ\8dà´¯àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´\9fàµ\88à´ªàµ\8dà´ªàµ\8d à´\9aàµ\86à´¯àµ\8dà´¤àµ\8d à´¤àµ\81à´\9fà´\99àµ\8dà´\99ുക)",
+       "rcfilters-search-placeholder": "സമàµ\80à´ªà´\95ാലമാറàµ\8dà´±à´\99àµ\8dà´\99ൾ à´\85à´°à´¿à´\9aàµ\8dà´\9aàµ\86à´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95 (à´®àµ\86à´¨àµ\81 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´\85à´°à´¿à´ªàµ\8dപയàµ\81à´\9fàµ\86 à´ªàµ\87à´°àµ\81പയàµ\8bà´\97à´¿à´\9aàµ\8dà´\9aàµ\8d à´¤à´¿à´°à´¯ുക)",
        "rcfilters-invalid-filter": "അസാധുവായ അരിപ്പ",
        "rcfilters-empty-filter": "സജീവ അരിപ്പകൾ ഇല്ല. എല്ലാ സംഭാവനകളും പ്രദർശിപ്പിക്കുന്നു.",
        "rcfilters-filterlist-title": "അരിപ്പകൾ",
        "rcfilters-filter-user-experience-level-unregistered-label": "രജിസ്റ്റർ ചെയ്യാത്തവർ",
        "rcfilters-filter-user-experience-level-unregistered-description": "ലോഗിൻ ചെയ്യാത്ത ലേഖകർ.",
        "rcfilters-filter-user-experience-level-newcomer-label": "പുതിയ അംഗങ്ങളുടെ തിരുത്തലുകൾ",
-       "rcfilters-filter-user-experience-level-newcomer-description": "പതàµ\8dതിൽ à´¤à´¾à´´àµ\86 à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95à´³àµ\81à´\82 à´¨à´¾à´²àµ\8d à´¦à´¿à´µà´¸à´¤àµ\8dà´¤àµ\86 à´ªàµ\8dരവർത്തിയുമുള്ള രജിസ്റ്റർ ചെയ്ത ലേഖകർ.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "പതàµ\8dതിൽ à´¤à´¾à´´àµ\86 à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95à´³àµ\81à´\82 à´¨à´¾à´²àµ\8d à´¦à´¿à´µà´¸à´¤àµ\8dà´¤àµ\86 à´ªàµ\8dà´°à´µàµ\83ത്തിയുമുള്ള രജിസ്റ്റർ ചെയ്ത ലേഖകർ.",
        "rcfilters-filter-user-experience-level-learner-label": "പഠിതാക്കൾ",
        "rcfilters-filter-user-experience-level-learner-description": "\"പുതുമുഖങ്ങൾ\" എന്നതിനും \"പരിചയസമ്പന്നർ\" എന്നതിനും ഇടയിൽ വരുന്ന രജിസ്റ്റർ ചെയ്ത ലേഖകർ.",
        "rcfilters-filter-user-experience-level-experienced-label": "പരിചയസമ്പന്നരായ ഉപയോക്താക്കൾ",
-       "rcfilters-filter-user-experience-level-experienced-description": "500 à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95à´³àµ\81à´\82 30 à´¦à´¿à´µà´¸à´¤àµ\8dà´¤àµ\86 à´ªàµ\8dരവർത്തിയുമുള്ള രജിസ്റ്റർ ചെയ്ത ലേഖകർ.",
+       "rcfilters-filter-user-experience-level-experienced-description": "500 à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95à´³àµ\81à´\82 30 à´¦à´¿à´µà´¸à´¤àµ\8dà´¤àµ\86 à´ªàµ\8dà´°à´µàµ\83ത്തിയുമുള്ള രജിസ്റ്റർ ചെയ്ത ലേഖകർ.",
        "rcfilters-filtergroup-automated": "യാന്ത്രിക സംഭാവനകൾ",
        "rcfilters-filter-bots-label": "യന്ത്രം",
        "rcfilters-filter-bots-description": "സ്വയംപ്രവർത്തിത ഉപകരണങ്ങൾ ഉപയോഗിച്ചുള്ള തിരുത്തുകൾ.",
        "boteditletter": "(യ.)",
        "unpatrolledletter": "(!)",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|ഒരു ഉപയോക്താവ്|$1 ഉപയോക്താക്കൾ}} ഈ താൾ ശ്രദ്ധിക്കുന്നുണ്ട്]",
-       "rc_categories": "വർഗ്ഗങ്ങളുടെ പരിധി (\"|\" ഉപയോഗിച്ച് പിരിക്കുക):",
-       "rc_categories_any": "തിരഞ്ഞെടുത്തതിൽ ഏതെങ്കിലും",
        "rc-change-size-new": "മാറ്റത്തിനു ശേഷം {{PLURAL:$1|ഒരു ബൈറ്റ്|$1 ബൈറ്റുകൾ}}",
        "newsectionsummary": "/* $1 */ പുതിയ ഉപവിഭാഗം",
        "rc-enhanced-expand": "അധികവിവരങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "upload-copy-upload-invalid-domain": "ഈ ഡൊമൈനിൽ നിന്നും പകർത്തി അപ്‌ലോഡ് ചെയ്യൽ ലഭ്യമല്ല.",
        "upload-dialog-title": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക",
        "upload-dialog-button-cancel": "റദ്ദാക്കുക",
+       "upload-dialog-button-back": "പുറകോട്ട്",
        "upload-dialog-button-done": "ചെയ്തു കഴിഞ്ഞു",
        "upload-dialog-button-save": "സേവ് ചെയ്യുക",
        "upload-dialog-button-upload": "അപ്‌‌ലോഡ്",
        "uploadstash-errclear": "പ്രമാണങ്ങൾ ശൂന്യമാക്കൽ വിജയകരമായിരുന്നില്ല.",
        "uploadstash-refresh": "പ്രമാണങ്ങളുടെ പട്ടിക പുതുക്കുക",
        "uploadstash-thumbnail": "ലഘുചിത്രം കാണുക",
+       "uploadstash-bad-path-unknown-type": "അപരിചിതമായ തരം \"$1\".",
        "img-auth-accessdenied": "പ്രവേശനമില്ല",
        "img-auth-nopathinfo": "PATH_INFO ലഭ്യമല്ല.\nതാങ്കളുടെ സെർവർ ഈ വിവരം കൈമാറ്റം ചെയ്യാൻ തയ്യാറാക്കിയിട്ടില്ല.\nഅത് img_auth പിന്തുണയില്ലാത്ത സി.ജി.ഐ. അധിഷ്ഠിതമായ ഒന്നായിരിക്കാം.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization കാണുക.",
        "img-auth-notindir": "ആവശ്യപ്പെട്ട പാത അപ്‌‌ലോഡ് ഡയറക്റ്ററിയിൽ സജ്ജീകരിച്ചു നൽകിയിട്ടില്ല.",
        "listfiles_size": "വലിപ്പം",
        "listfiles_description": "വിവരണം",
        "listfiles_count": "പതിപ്പുകൾ",
-       "listfiles-show-all": "à´\9aà´¿à´¤àµ\8dà´°à´¤àµ\8dതിനàµ\8dà´±െ പഴയ പതിപ്പുകളും ഉൾപ്പെടുത്തുക",
+       "listfiles-show-all": "à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\9fെ പഴയ പതിപ്പുകളും ഉൾപ്പെടുത്തുക",
        "listfiles-latestversion": "ഇപ്പോഴത്തെ പതിപ്പ്",
        "listfiles-latestversion-yes": "അതെ",
        "listfiles-latestversion-no": "അല്ല",
        "pageswithprop": "താളിന്റെ സവിശേഷതകളുള്ള താളുകൾ",
        "pageswithprop-legend": "ഒരു താൾ സവിശേഷതയുള്ള താളുകൾ",
        "pageswithprop-prop": "ഗുണം:",
+       "pageswithprop-reverse": "വിപരീതമായും ക്രമപ്പെടുത്തുക",
        "pageswithprop-submit": "പോകൂ",
        "doubleredirects": "ഇരട്ട തിരിച്ചുവിടലുകൾ",
        "doubleredirectstext": "ഈ താളിൽ ഒരു തിരിച്ചുവിടലിൽ നിന്നും മറ്റു തിരിച്ചുവിടൽ താളുകളിലേയ്ക്ക് പോകുന്ന താളുകൾ കൊടുത്തിരിക്കുന്നു. ഓരോ വരിയിലും ഒന്നാമത്തേയും രണ്ടാമത്തേയും തിരിച്ചുവിടൽ താളിലേക്കുള്ള കണ്ണികളും, രണ്ടാമത്തെ തിരിച്ചുവിടൽ താളിൽ നിന്നു ശരിയായ ലക്ഷ്യതാളിലേക്കുള്ള കണ്ണികളും ഉൾക്കൊള്ളുന്നു.\n<del>വെട്ടിക്കൊടുത്തിരിക്കുന്നവ</del> ശരിയാക്കിയവയാണ്.",
        "apisandbox": "എ.പി.ഐ. എഴുത്തുകളരി",
        "apisandbox-api-disabled": "ഈ സൈറ്റിൽ എ.പി.ഐ. പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.",
        "apisandbox-intro": "'''മീഡിയവിക്കി വെബ്‌ സെർവീസ് എ.പി.ഐ.'''യിൽ പരീക്ഷണങ്ങൾ നടത്താൻ ഈ താൾ ഉപയോഗിക്കുക.\nഎ.പി.ഐ.യുടെ ഉപയോഗത്തെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്കായി [https://www.mediawiki.org/wiki/API:Main_page the എ.പി.ഐ. സഹായം] പരിശോധിക്കുക. ഉദാഹരണം: [https://www.mediawiki.org/wiki/API#A_simple_example പ്രധാന താളിന്റെ ഉള്ളടക്കം എടുക്കുക]. കൂടുതൽ ഉദാഹരണങ്ങൾക്കായി പ്രവൃത്തി തിരഞ്ഞെടുക്കുക.\n\nഇതൊരു പരീക്ഷണകളരിയാണെങ്കിലും ഇവിടെ ചെയ്യുന്നവ വിക്കിയിൽ മാറ്റങ്ങൾ വരുത്തിയേക്കാമെന്ന് ഓർക്കുക.",
+       "apisandbox-unfullscreen": "താൾ പ്രദർശിപ്പിക്കുക",
        "apisandbox-submit": "അഭ്യർത്ഥിക്കുക",
        "apisandbox-reset": "ശൂന്യമാക്കുക",
-       "apisandbox-examples": "ഉദാഹരണം",
-       "apisandbox-results": "ഫലം",
+       "apisandbox-retry": "വീണ്ടും ശ്രമിക്കുക",
+       "apisandbox-helpurls": "സഹായ കണ്ണികൾ",
+       "apisandbox-examples": "ഉദാഹരണങ്ങൾ",
+       "apisandbox-dynamic-parameters": "കൂടുതലായുള്ള ചരങ്ങൾ",
+       "apisandbox-dynamic-parameters-add-label": "ചരം ചേർക്കുക:",
+       "apisandbox-dynamic-parameters-add-placeholder": "ചരത്തിന്റെ പേര്",
+       "apisandbox-results": "ഫലങ്ങൾ",
        "apisandbox-request-url-label": "അഭ്യർത്ഥനാ യൂ.ആർ.എൽ.:",
-       "apisandbox-request-time": "നടപ്പിലാക്കാൻ എടുത്ത സമയം: $1",
+       "apisandbox-request-time": "അഭ്യർത്ഥനയുടെ സമയം: {{PLURAL:$1|$1 മി.സെ.}}",
+       "apisandbox-results-fixtoken": "ചീട്ട് ശരിയാക്കിയ ശേഷം വീണ്ടും സമർപ്പിക്കുക",
+       "apisandbox-continue": "തുടരുക",
        "apisandbox-continue-clear": "ശൂന്യമാക്കുക",
+       "apisandbox-multivalue-all-namespaces": "$1 (എല്ലാ നാമമേഖലകളും)",
+       "apisandbox-multivalue-all-values": "$1 (എല്ലാ വിലകളും)",
        "booksources": "പുസ്തക സ്രോതസ്സുകൾ",
        "booksources-search-legend": "പുസ്തകസ്രോതസ്സുകൾക്കായി തിരയുക",
        "booksources-isbn": "ഐ.എസ്.ബി.എൻ.:",
        "unwatchthispage": "ശ്രദ്ധിക്കുന്നത് അവസാനിപ്പിക്കുക",
        "notanarticle": "ലേഖന താൾ അല്ല",
        "notvisiblerev": "മറ്റൊരു ഉപയോക്താവ് സൃഷ്ടിച്ച അവസാനത്തെ നാൾപ്പതിപ്പ് മായ്ച്ചിരിക്കുന്നു",
-       "watchlist-details": "സം‌വാദത്താളുകൾ ഉൾപ്പെടുത്താതെ {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.",
+       "watchlist-details": "{{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} (കൂടെ സംവാദത്താളുകളും) താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.",
        "wlheader-enotif": "ഇമെയിൽ അറിയിപ്പുകൾ സജ്ജമാക്കിയിരിക്കുന്നു.",
        "wlheader-showupdated": "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
        "wlnote": "$3, $4-നു കഴിഞ്ഞ {{PLURAL:$2|മണിക്കൂറിൽ|<strong>$2</strong> മണിക്കൂറിൽ}} നടന്ന {{PLURAL:$1|ഒരു പുതിയ മാറ്റം|<strong>$1</strong> പുതിയ മാറ്റങ്ങൾ}} താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു.",
        "enotif_body_intro_moved": "{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ $PAGEEDITDATE-നു {{gender:$2|$2}} മാറ്റിയിരിക്കുന്നു, ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിനായി $3 കാണുക.",
        "enotif_body_intro_restored": "{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ $PAGEEDITDATE-നു {{gender:$2|$2}} പുനഃസ്ഥാപിച്ചിരിക്കുന്നു, ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിനായി $3 കാണുക.",
        "enotif_body_intro_changed": "{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താളിൽ $PAGEEDITDATE-നു {{gender:$2|$2}} മാറ്റം വരുത്തിയിരിക്കുന്നു, ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിനായി $3 കാണുക.",
-       "enotif_lastvisited": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\85വസാന à´¸à´¨àµ\8dദർശനതàµ\8dതിനàµ\81 à´¶àµ\87à´·à´®àµ\81à´£àµ\8dà´\9fായ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´\95ാണàµ\81വാൻ  $1 à´¸à´¨àµ\8dദർശിà´\95àµ\8dà´\95ുക.",
+       "enotif_lastvisited": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\85വസാന à´¸à´¨àµ\8dദർശനതàµ\8dതിനàµ\81 à´¶àµ\87à´·à´®àµ\81à´£àµ\8dà´\9fായ à´\8eà´²àµ\8dലാ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\81à´\82,  $1 à´\95ാണുക.",
        "enotif_lastdiff": "ഈ മാറ്റം കാണാൻ $1 കാണുക.",
        "enotif_anon_editor": "അജ്ഞാത ഉപയോക്താവ് $1",
        "enotif_body": "പ്രിയ $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n{{SITENAME}} സം‌രംഭത്തിലെ $PAGETITLE എന്ന താൾ $PAGEEDITDATE-ൽ $PAGEEDITOR എന്ന ഉപയോക്താവ് $CHANGEDORCREATED, ഇപ്പോഴുള്ള പതിപ്പിനായി $PAGETITLE_URL കാണുക.\n\n$NEWPAGE\n\nതിരുത്തിയയാൾ നൽകിയ സം‌ഗ്രഹം: $PAGESUMMARY $PAGEMINOREDIT\n\nതിരുത്തിയയാളെ ബന്ധപ്പെടുക:\nമെയിൽ: $PAGEEDITOR_EMAIL\nവിക്കി: $PAGEEDITOR_WIKI\n\nതാങ്കൾ ലോഗിൻ ചെയ്ത് ഈ താൾ സന്ദർശിക്കുന്നില്ലങ്കിൽ മറ്റ് അറിയിപ്പുകൾ ഒന്നുമുണ്ടാകുന്നതല്ല. ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക സന്ദർശിച്ചും ഉൾപ്പെട്ട താളുകളിലെ അറിയിപ്പ് മുദ്രകൾ താങ്കൾക്ക് പുനഃക്രമീകരിക്കാവുന്നതാണ്‌.\n\nതാങ്കളുടെ {{SITENAME}} സുഹൃദ് അറിയിപ്പ് സജ്ജീകരണം\n\n--\nഇമെയിൽ അറിയിപ്പ് സജ്ജീകരണങ്ങളിൽ മാറ്റംവരുത്താൻ, സന്ദർശിക്കുക\n{{canonicalurl:{{#special:Preferences}}}}\n\nശ്രദ്ധിക്കുന്ന പട്ടികയിലെ ക്രമീകരണങ്ങളിൽ മാറ്റം വരുത്താൻ, സന്ദർശിക്കുക\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nതാൾ താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിൽ നിന്ന് നീക്കംചെയ്യാൻ, സന്ദർശിക്കുക\n$UNWATCHURL\n\nഅഭിപ്രായം അറിയിക്കാനും മറ്റു സഹായങ്ങൾക്കും:\n$HELPPAGE",
+       "enotif_minoredit": "ഇതൊരു ചെറിയ തിരുത്താണ്",
        "created": "സൃഷ്ടിച്ചു",
        "changed": "മാറ്റിയിരിക്കുന്നു",
        "deletepage": "താൾ മായ്ക്കുക",
        "delete-toobig": "ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ നിലനില്പ്പിനെ തന്നെ ബാധിക്കുമെന്നതിനാൽ ഈ താൾ മായ്ക്കുന്നതിനുള്ള അവകാശം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.",
        "delete-warning-toobig": "ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. അതായത്, ഇതിനു് $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ ഡാറ്റാബേസ് ഓപ്പറേഷനെ ബാധിച്ചേക്കാം. അതിനാൽ വളരെ ശ്രദ്ധാപൂർവ്വം തുടർനടപടികളിലേക്കു നീങ്ങുക.",
        "deleteprotected": "ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നതിനാൽ താങ്കൾക്കിത് മായ്ക്കാനാവില്ല.",
-       "deleting-backlinks-warning": "'''മുന്നറിയിപ്പ്:''' മറ്റു താളുകളിൽ നിന്നും [[Special:WhatLinksHere/{{FULLPAGENAME}}|താളിലേയ്ക്കുള്ള കണ്ണികൾ]] അല്ലെങ്കിൽ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
+       "deleting-backlinks-warning": "<strong>മുന്നറിയിപ്പ്:</strong> മറ്റു താളുകളിൽ നിന്നും [[Special:WhatLinksHere/{{FULLPAGENAME}}|താളിലേയ്ക്കുള്ള കണ്ണികൾ]] അല്ലെങ്കിൽ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
+       "deleting-subpages-warning": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ മായ്ക്കാൻ പോകുന്ന താളിന് [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|ഒരു ഉപതാൾ|$1 ഉപതാളുകൾ|51=അമ്പതിലധികം ഉപതാളുകൾ}}]] ഉണ്ട്.",
        "rollback": "തിരുത്തുകൾ റോൾബാക്ക് ചെയ്യുക",
        "rollbacklink": "റോൾബാക്ക്",
        "rollbacklinkcount": "{{PLURAL:$1|ഒരു തിരുത്ത്|$1 തിരുത്തുകൾ}} മുൻപ്രാപനം ചെയ്യുക",
        "editcomment": "തിരുത്തലിന്റെ ചുരുക്കം: <em>$1</em> എന്നായിരുന്നു.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) നടത്തിയ തിരുത്തലുകൾ നീക്കം ചെയ്തിരിക്കുന്നു; നിലവിലുള്ള പതിപ്പ് [[User:$1|$1]] സൃഷ്ടിച്ചതാണ്",
        "revertpage-nouser": "മറയ്ക്കപ്പെട്ട ഉപയോക്താവ് നടത്തിയ തിരുത്തലുകൾ {{GENDER:$1|[[User:$1|$1]]}} സൃഷ്ടിച്ച അവസാന പതിപ്പിലേയ്ക്ക് മുൻപ്രാപനം ചെയ്തിരിക്കുന്നു",
-       "rollback-success": "$1 ചെയ്ത തിരുത്ത് തിരസ്ക്കരിച്ചിരിക്കുന്നു; $2 ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു.",
+       "rollback-success": "{{GENDER:$3|$1}} ചെയ്ത തിരുത്ത് തിരസ്ക്കരിച്ചിരിക്കുന്നു; {{GENDER:$4|$2}} ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു.",
+       "rollback-success-notify": "$1 ചെയ്ത തിരുത്തുകൾ തിരസ്ക്കരിച്ചിരിക്കുന്നു; $2 ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു. [$3 മാറ്റങ്ങൾ കാണിക്കുക]",
        "sessionfailure-title": "സെഷൻ പരാജയപ്പെട്ടിരിക്കുന്നു",
-       "sessionfailure": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´²àµ\8bà´\97ിൻ à´¸àµ\86ഷനിൽ à´ªàµ\8dà´°à´¶àµ\8dà´¨à´\99àµ\8dà´\99à´³àµ\81à´³àµ\8dളതായി à´\95ാണàµ\81à´¨àµ\8dà´¨àµ\81;\nà´¸àµ\86ഷൻ à´¤à´\9fàµ\8dà´\9fà´¿à´¯àµ\86à´\9fàµ\81à´\95àµ\8dà´\95ൽ à´\92ഴിവാà´\95àµ\8dà´\95ാനàµ\81à´³àµ\8dà´³ à´®àµ\81ൻà´\95à´°àµ\81തലായി à´\88 à´ªàµ\8dà´°à´µàµ\83à´¤àµ\8dതി à´±à´¦àµ\8dദാà´\95àµ\8dà´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.\nദയവായി à´ªà´¿à´¨àµ\8dà´¨àµ\8bà´\9fàµ\8dà´\9fàµ\8d à´ªàµ\8bയി à´¤à´¾à´\99àµ\8dà´\95ൾ à´µà´¨àµ\8dà´¨ à´¤à´¾à´³à´¿àµ½ à´\9aàµ\86à´¨àµ\8dà´¨àµ\8d, à´µàµ\80à´£àµ\8dà´\9fàµ\81à´\82 à´¶àµ\8dà´°à´®ിക്കുക.",
+       "sessionfailure": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´²àµ\8bà´\97ിൻ à´¸àµ\86ഷനിൽ à´ªàµ\8dà´°à´¶àµ\8dà´¨à´\99àµ\8dà´\99à´³àµ\81à´³àµ\8dളതായി à´\95ാണàµ\81à´¨àµ\8dà´¨àµ\81;\nà´¸àµ\86ഷൻ à´¤à´\9fàµ\8dà´\9fà´¿à´¯àµ\86à´\9fàµ\81à´\95àµ\8dà´\95ൽ à´\92ഴിവാà´\95àµ\8dà´\95ാനàµ\81à´³àµ\8dà´³ à´®àµ\81ൻà´\95à´°àµ\81തലായി à´\88 à´ªàµ\8dà´°à´µàµ\83à´¤àµ\8dതി à´±à´¦àµ\8dദാà´\95àµ\8dà´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.\nദയവായി à´«àµ\8bà´\82 à´µàµ\80à´£àµ\8dà´\9fàµ\81à´\82 à´¸à´®àµ¼à´ªàµ\8dà´ªിക്കുക.",
        "changecontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
+       "changecontentmodel-legend": "ഉള്ളടക്ക രീതി മാറ്റുക",
        "changecontentmodel-title-label": "താളിന്റെ തലക്കെട്ട്",
        "changecontentmodel-model-label": "പുതിയ ഉള്ളടക്ക രീതി",
        "changecontentmodel-reason-label": "കാരണം:",
+       "changecontentmodel-submit": "മാറ്റുക",
        "changecontentmodel-success-title": "ഉള്ളടക്കരീതി മാറിയിരിക്കുന്നു",
        "changecontentmodel-success-text": "[[:$1]] എന്നതിന്റെ ഉള്ളടക്കരീതി മാറിയിട്ടുണ്ട്.",
        "changecontentmodel-cannot-convert": "[[:$1]] താളിലെ ഉള്ളടക്കം $2 തരത്തിലേക്ക് മാറ്റാനാവില്ല.",
        "modifiedarticleprotection": "\"[[$1]]\" എന്ന താളിനുള്ള സം‌രക്ഷണമാനം മാറ്റിയിരിക്കുന്നു",
        "unprotectedarticle": "\"[[$1]]\" എന്ന താളിന്റെ സംരക്ഷണം നീക്കി",
        "movedarticleprotection": "\"[[$2]]\" എന്ന താളിന്റെ സംരക്ഷണമാനങ്ങൾ \"[[$1]]\" എന്ന താളിലേക്ക് മാറ്റിയിരിക്കുന്നു",
+       "protectedarticle-comment": "\"[[$1]]\" {{GENDER:$2|സംരക്ഷിച്ചു}}",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" താളിന്റെ {{GENDER:$2|സംരക്ഷണ തലം മാറ്റി}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" താളിന്റെ {{GENDER:$2|സംരക്ഷണം ഒഴിവാക്കി}}",
        "protect-title": "\"$1\" താളിനു സം‌രക്ഷണമാനം സജ്ജീകരിക്കുന്നു",
        "protect-title-notallowed": "\"$1\" താളിന്റെ സം‌രക്ഷണമാനം കാണുക",
        "prot_1movedto2": "[[$1]] എന്ന താളിന്റെ പേർ [[$2]] എന്നാക്കിയിരിക്കുന്നു",
        "undeletehistorynoadmin": "ഈ താൾ മായ്ക്കപ്പെട്ടിരിക്കുന്നു.\nഈ താൾ മായ്കാനുള്ള കാരണവും താൾ മായ്ക്കുന്നതിനു മുൻപ് തിരുത്തിയവരെ കുറിച്ചുള്ള വിവരങ്ങളും, താഴെ കൊടുത്തിരിക്കുന്നു.\nമായ്ക്കപ്പെട്ട ഈ പതിപ്പുകളുടെ ഉള്ളടക്കം കാര്യനിർവാഹകർക്ക് മാത്രമേ പ്രാപ്യമാകൂ.",
        "undelete-revision": "$1 എന്ന താളിന്റെ ($4, $5-ൽ) $3 സൃഷ്ടിച്ച പതിപ്പ് മായ്ച്ചിരിക്കുന്നു:",
        "undeleterevision-missing": "അസാധുവായ അല്ലെങ്കിൽ ലഭ്യമല്ലാത്ത നാൾപ്പതിപ്പ്.\nഒന്നുകിൽ താങ്കൾ നൽകിയ കണ്ണി തെറ്റായായിരിക്കാം അല്ലെങ്കിൽ താങ്കൾ തിരയുന്നത് ഒഴിവാക്കപ്പെട്ട ഒരു പതിപ്പായിരിക്കാം.",
+       "undeleterevision-duplicate-revid": "<code>rev_id</code> ഉപയോഗത്തിലുള്ളതിനാൽ, {{PLURAL:$1|ഒരു നാൾപ്പതിപ്പ്|$1 നാൾപ്പതിപ്പുകൾ}} പുനഃസ്ഥാപിക്കാൻ കഴിയില്ല.",
        "undelete-nodiff": "പഴയ പതിപ്പുകൾ ഒന്നും കണ്ടില്ല.",
        "undeletebtn": "പുനഃസ്ഥാപിക്കുക",
        "undeletelink": "കാണുക/പുനഃസ്ഥാപിക്കുക",
        "undeleteviewlink": "കാണുക",
        "undeleteinvert": "വിപരീതം തിരഞ്ഞെടുക്കുക",
        "undeletecomment": "കാരണം:",
-       "cannotundelete": "മായ്ക്കൽ തിരസ്കരണം പരാജയപ്പെട്ടു:\n$1",
+       "cannotundelete": "à´\9aിലതിനàµ\8dà´±àµ\86/à´\8eà´²àµ\8dലാതàµ\8dതിനàµ\8dà´±àµ\86à´¯àµ\81à´\82 à´®à´¾à´¯àµ\8dà´\95àµ\8dà´\95ൽ à´¤à´¿à´°à´¸àµ\8dà´\95à´°à´£à´\82 à´ªà´°à´¾à´\9cയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fàµ\81:\n$1",
        "undeletedpage": "'''$1 പുനഃസ്ഥാപിച്ചിരിക്കുന്നു'''\n\nപുതിയതായി നടന്ന ഒഴിവാക്കലുകളുടേയും പുനഃസ്ഥാപനങ്ങളുടേയും വിവരങ്ങൾ കാണാൻ [[Special:Log/delete|മായ്ക്കൽ ലോഗ്]] കാണുക.",
        "undelete-header": "അടുത്തകാലത്ത് നീക്കംചെയ്ത താളുകളുടെ പട്ടികയ്ക്ക് [[Special:Log/delete|നീക്കം ചെയ്യൽ പ്രവർത്തനരേഖ]] കാണുക.",
        "undelete-search-title": "നീക്കം ചെയ്യപ്പെട്ട താളുകൾ തിരയുക",
        "undelete-search-box": "നീക്കംചെയ്ത താളുകളിൽ തിരയുക",
        "undelete-search-prefix": "ഈ വാക്കിൽ തുടങ്ങുന്ന താളുകൾ കാണിക്കുക:",
+       "undelete-search-full": "ഇതുൾപ്പെടുന്ന താൾ തലക്കെട്ടുകൾ കാണിക്കുക:",
        "undelete-search-submit": "തിരയൂ",
        "undelete-no-results": "യോജിക്കുന്ന താളുകളൊന്നും ഡിലിഷൻ ആർക്കൈവിൽ കണ്ടെത്താനായില്ല.",
        "undelete-filename-mismatch": "$1 എന്ന സമയത്തുണ്ടാക്കിയ പതിപ്പിന്റെ മായ്ക്കുൽ തിരസ്ക്കരിക്കുവാൻ സാധിച്ചില്ല: പ്രമാണത്തിന്റെ പേരു യോജിക്കുന്നില്ല",
        "sp-contributions-newbies-sub": "പുതിയ ഉപയോക്താക്കൾ ചെയ്തവ",
        "sp-contributions-newbies-title": "പുതിയ അംഗത്വമെടുത്ത ഉപയോക്താക്കളുടെ സേവനങ്ങൾ",
        "sp-contributions-blocklog": "തടയൽ രേഖ",
-       "sp-contributions-suppresslog": "ഒതുക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ",
-       "sp-contributions-deleted": "മായ്ക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ",
+       "sp-contributions-suppresslog": "ഒതുക്കപ്പെട്ട {{GENDER:$1|ഉപയോക്തൃ}}സംഭാവനകൾ",
+       "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": "ഈ ഉപയോക്താവ് ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്. അവലംബമായി തടയൽ രേഖയുടെ പുതിയ ഭാഗം താഴെ കൊടുത്തിരിക്കുന്നു:",
        "sp-contributions-blocked-notice-anon": "ഈ ഐ.പി. വിലാസം ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്.\nഅവലംബമായി തടയൽ രേഖയുടെ പുതിയഭാഗം താഴെ കൊടുത്തിരിക്കുന്നു:",
        "sp-contributions-search": "ചെയ്ത സേവനങ്ങൾ",
        "sp-contributions-newonly": "താളുകൾ സൃഷ്ടിച്ച തിരുത്തുകൾ മാത്രം പ്രദർശിപ്പിക്കുക",
        "sp-contributions-hideminor": "ചെറുതിരുത്തുകൾ മറയ്ക്കുക",
        "sp-contributions-submit": "തിരയൂ",
+       "sp-contributions-outofrange": "ഫലങ്ങൾ കാണിക്കാൻ കഴിയില്ല. ആവശ്യപ്പെട്ട ഐ.പി. ശ്രേണി /$1 സി.ഐ.ഡി.ആർ. പരിധിയിലും കൂടുതലാണ്.",
        "whatlinkshere": "ഈ താളിലേക്കുള്ള കണ്ണികൾ",
        "whatlinkshere-title": "\"$1\" എന്ന താളിലേക്കുള്ള കണ്ണികൾ",
        "whatlinkshere-page": "താൾ:",
        "ipb-unblock": "ഒരു ഐ.പി. വിലാസത്തിനോ ഉപയോക്താവിനോ ഉള്ള തടയൽ നീക്കംചെയ്യുക",
        "ipb-blocklist": "നിലവിലുള്ള തടയലുകൾ",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} നൽകിയ സംഭാവനകൾ",
+       "ipb-blocklist-duration-left": "$1 പോയി",
        "unblockip": "ഉപയോക്താവിനുള്ള തടയൽ നീക്കുക",
        "unblockiptext": "മുൻപ് തടയപ്പെട്ട ഐ.പി.യുടേയും ഉപയോക്താവിന്റേയും തിരുത്തൽ അവകാശം പുനഃസ്ഥാപിക്കാൻ താഴെയുള്ള ഫോം ഉപയോഗിക്കുക.",
        "ipusubmit": "ഈ വിലക്ക് ഒഴിവാക്കുക",
        "unblocked-id": "$1 എന്ന തടയൽ നീക്കിയിരിക്കുന്നു.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] എന്ന വിലാസത്തിനുണ്ടായിരുന്ന തടയൽ നീക്കിയിരിക്കുന്നു.",
        "blocklist": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
+       "autoblocklist": "സ്വതേതടയൽ",
+       "autoblocklist-submit": "തിരയുക",
+       "autoblocklist-legend": "സ്വതേതടയലുകളുടെ പട്ടിക",
+       "autoblocklist-localblocks": "പ്രാദേശിക {{PLURAL:$1|സ്വതേതടയൽ|സ്വതേതടയലുകൾ}}",
+       "autoblocklist-total-autoblocks": "ആകെ സ്വതേതടയലുകൾ: $1",
+       "autoblocklist-empty": "സ്വതേതടയൽപ്പട്ടിക ശൂന്യമാണ്‌.",
+       "autoblocklist-otherblocks": "മറ്റ് {{PLURAL:$1|സ്വതേതടയൽ|സ്വതേതടയലുകൾ}}",
        "ipblocklist": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
        "ipblocklist-legend": "തടഞ്ഞ ഒരു ഉപയോക്താവിനെ തിരയുക",
        "blocklist-userblocks": "അംഗത്വ തടയലുകൾ മറയ്ക്കുക",
        "block-log-flags-hiddenname": "ഉപയോക്തൃനാമം മറയ്ക്കപ്പെട്ടിരിക്കുന്നു",
        "range_block_disabled": "സിസോപ്പിനു റേഞ്ച് ബ്ലോക്കു ചെയ്യാനുള്ള സൗകര്യം ദുർബലപ്പെടുത്തുക.",
        "ipb_expiry_invalid": "കാലാവധി സമയം അസാധുവാണ്‌.",
+       "ipb_expiry_old": "കാലവധി തീരുന്ന സമയം ഭൂതകാലത്തിലാണ്.",
        "ipb_expiry_temp": "മറയ്ക്കപ്പെട്ട ഉപയോക്തൃനാമങ്ങളിലുള്ള തടയൽ സ്ഥിരമായിരിക്കണം.",
        "ipb_hide_invalid": "ഈ അംഗത്വം ഒതുക്കാൻ കഴിയില്ല; അതിന് {{PLURAL:$1|ഒരു തിരുത്ത്|$1 തിരുത്തുകൾ}} ഉണ്ട്.",
        "ipb_already_blocked": "\"$1\" ഇതിനകം തന്നെ തടയപ്പെട്ടിരിക്കുന്നു.",
        "ipb_blocked_as_range": "പിഴവ്:  $1 എന്ന ഐ.പി.യെ നേരിട്ടല്ല തടഞ്ഞിട്ടുള്ളത്. അതിനാൽ തടയൽ നീക്കം ചെയ്യുവാൻ സാദ്ധ്യമല്ല. അതിനെ $2ന്റെ ഭാഗമായുള്ള റേഞ്ചിൽ ആണ്‌ തടഞ്ഞിട്ടുള്ളത്. അത് ഒഴിവാക്കാവുന്നതാണ്.",
        "ip_range_invalid": "അസാധുവായ ഐ.പി. റേഞ്ച്.",
        "ip_range_toolarge": "പരിധി നിശ്ചയിച്ചുള്ള തടയലുകൾ /$1 എന്നതിലും കൂടുതലാകാൻ അനുവദിക്കുന്നില്ല.",
+       "ip_range_exceeded": "ഐ.പി. ശ്രേണി പരമാവധിയിലും കൂടുതലാണ്. അനുവദിച്ചിട്ടുള്ള പരിധി: /$1.",
+       "ip_range_toolow": "ഐ.പി. ശ്രേണികൾ ഉപയോഗിക്കുന്നത് അനുവദിച്ചിട്ടില്ല.",
        "proxyblocker": "പ്രോക്സി തടയൽ",
        "proxyblockreason": "ഓപ്പൺ പ്രോക്സി ആയതിനാൽ താങ്കളുടെ ഐ.പി. വിലാസത്തെ തടഞ്ഞിരിക്കുന്നു. ഇതു എന്തെങ്കിലും പിഴവ് മൂലം സംഭവിച്ചതാണെങ്കിൽ താങ്കളുടെ ഇന്റർനെറ്റ് സേവന ദാതാവിനെ സമീപിച്ചു ഈ സുരക്ഷാ പ്രശ്നത്തെ കുറിച്ച് ബോധിപ്പിക്കുക.",
        "sorbsreason": "{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്.",
        "sorbs_create_account_reason": "{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്. താങ്കൾക്ക് അംഗത്വമെടുക്കാൻ സാദ്ധ്യമല്ല.",
+       "softblockrangesreason": "താങ്കളുടെ ഐ.പി. വിലാസത്തിൽ ($1) നിന്നുമുള്ള അജ്ഞാത സംഭാവനകൾ അനുവദിച്ചിട്ടില്ല. ദയവായി പ്രവേശിക്കുക.",
        "xffblockreason": "എക്സ്-ഫോർവേഡഡ്-ഫോർ ഹെഡറിലെ ഒരു ഐ.പി. വിലാസം, താങ്കളുടേതോ താങ്കൾ ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവറിലേതോ ആകാം, തടയപ്പെട്ടിരിക്കുന്നതാണ്. തടയലിന്റെ കാരണം: $1",
        "cant-see-hidden-user": "താങ്കൾ തടയാൻ ശ്രമിക്കുന്ന ഉപയോക്താവ് മുമ്പേ തടയപ്പെടുകയും മറയ്ക്കപ്പെടുകയും ചെയ്യപ്പെട്ടതാണ്. താങ്കൾക്ക് ഉപയോക്താവിനെ മറയ്ക്കാനുള്ള അവകാശം ഇല്ലെങ്കിൽ, ഉപയോക്താവിനെതിരെ ഉള്ള തടയൽ കാണാനോ തിരുത്താനോ കഴിയുന്നതല്ല.",
        "ipbblocked": "മറ്റുള്ളവരെ തടയാനോ അവരുടെ തടയൽ നീക്കാനോ താങ്കൾക്ക് കഴിയില്ല. കാരണം താങ്കൾ തന്നെ തടയപ്പെട്ടിരിക്കുകയാണ്",
        "lockdbsuccesstext": "ഡാറ്റാബേസ് ബന്ധിച്ചിരിക്കുന്നു.<br />\nശുദ്ധീകരണപ്രവർത്തനം കഴിഞ്ഞതിനു ശേഷം [[Special:UnlockDB|ഈ കണ്ണിയുപയോഗിച്ച്]] ഡാറ്റാബേസ് സ്വതന്ത്രമാക്കുക.",
        "unlockdbsuccesstext": "ഡാറ്റാബേസ് സ്വതന്ത്രമാക്കിയിരിക്കുന്നു.",
        "lockfilenotwritable": "ഡേറ്റാബേസ് പൂട്ടൽ പ്രമാണത്തിൽ മാറ്റങ്ങൾ വരുത്താൻ കഴിഞ്ഞില്ല.\nഡേറ്റാബേസ് പൂട്ടാനും തുറക്കാനും, ഇതിൽ വെബ് സെർവർ ഉപയോഗിച്ച് മാറ്റങ്ങൾ വരുത്താൻ കഴിയണം.",
+       "databaselocked": "ഡാറ്റാബേസ് ബന്ധിച്ചിരിക്കുകയാണ്.",
        "databasenotlocked": "ഡാറ്റാബേസ് ബന്ധിച്ചിട്ടില്ല.",
        "lockedbyandtime": "($3 $2-നു $1 ചെയ്തത്)",
        "move-page": "$1 മാറ്റുക",
        "cant-move-to-user-page": "ഉപയോക്താവിനുള്ള താളിന്റെ തലക്കെട്ടു മാറ്റാനുള്ള അനുമതി താങ്കൾക്കില്ല (ഉപയോക്താവിനുള്ള ഉപതാളുകൾ ഒഴിച്ച്).",
        "cant-move-category-page": "വർഗ്ഗ താളുകൾ മാറ്റാനുള്ള അനുവാദം താങ്കൾക്കില്ല.",
        "cant-move-to-category-page": "ഒരു താൾ വർഗ്ഗ താളാക്കി മാറ്റാനുള്ള അനുവാദം താങ്കൾക്കില്ല.",
+       "cant-move-subpages": "ഉപതാളുകൾ മാറ്റുവാനുള്ള അനുവാദം താങ്കൾക്കില്ല.",
+       "namespace-nosubpages": "\"$1\" നാമമേഖല ഉപതാളുകൾ അനുവദിക്കുന്നില്ല.",
        "newtitle": "പുതിയ തലക്കെട്ട്:",
        "move-watch": "ഈ താളിലെ മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക",
        "movepagebtn": "താൾ മാറ്റുക",
        "movelogpagetext": "തലക്കെട്ട് മാറ്റിയ താളുകളുടെ പട്ടിക താഴെ കാണാം.",
        "movesubpage": "{{PLURAL:$1|ഉപതാൾ|ഉപതാളുകൾ}}",
        "movesubpagetext": "ഈ താളിനുള്ള {{PLURAL:$1|ഒരു ഉപതാൾ|$1 ഉപതാളുകൾ}} താഴെ കൊടുത്തിരിക്കുന്നു.",
+       "movesubpagetalktext": "ഈ സംവാദത്താളിനുള്ള {{PLURAL:$1|ഒരു ഉപതാൾ|$1 ഉപതാളുകൾ}} താഴെ കൊടുത്തിരിക്കുന്നു.",
        "movenosubpage": "ഈ താളിന്‌ ഉപതാളുകൾ ഇല്ല",
        "movereason": "കാരണം:",
        "revertmove": "പൂർവ്വസ്ഥിതിയിലാക്കുക",
        "import-mapping-namespace": "ഒരു നാമമേഖലയിലേക്ക് ഇറക്കുമതി ചെയ്യുക:",
        "import-mapping-subpage": "ഇനിക്കൊടുക്കുന്ന താളിന്റെ ഉപതാളുകളായി ഇറക്കുമതി ചെയ്യുക:",
        "import-upload-filename": "പ്രമാണത്തിന്റെ പേര്‌",
+       "import-upload-username-prefix": "അന്തർവിക്കി പൂർവ്വാക്ഷരങ്ങൾ:",
        "import-comment": "കുറിപ്പ്:",
        "importtext": "ദയവായി സ്രോതസ്സ് വിക്കിയിൽ നിന്ന് [[Special:Export|കയറ്റുമതി ഉപകരണം]] ഉപയോഗിച്ച് പ്രമാണം കയറ്റുമതി ചെയ്യുക.\nഅത് താങ്കളുടെ കമ്പ്യൂട്ടറിൽ ശേഖരിച്ച് ഇവിടെ അപ്‌‌ലോഡ് ചെയ്യുക.",
        "importstart": "താളുകൾ ഇറക്കുമതി ചെയ്യുന്നു...",
        "tooltip-pt-mycontris": "{{GENDER:|താങ്കളുടെ}} സേവനങ്ങളുടെ പട്ടിക",
        "tooltip-pt-anoncontribs": "ഈ ഐ.പി. വിലാസത്തിൽ നിന്നും ചെയ്തിട്ടുള്ള തിരുത്തുകളുടെ പട്ടിക",
        "tooltip-pt-login": "ലോഗിൻ ചെയ്യുവാൻ താല്പര്യപ്പെടുന്നു; പക്ഷേ നിർബന്ധമല്ല",
+       "tooltip-pt-login-private": "ഈ വിക്കി ഉപയോഗിക്കാൻ താങ്കൾ പ്രവേശിച്ചിരിക്കണം",
        "tooltip-pt-logout": "ലോഗൗട്ട് ചെയ്യാനുള്ള കണ്ണി",
        "tooltip-pt-createaccount": "നിർബന്ധമില്ലെങ്കിലും, താങ്കൾ ഒരു അംഗത്വമെടുക്കണമെന്നും പ്രവേശിക്കണമെന്നും താത്പര്യപ്പെടുന്നു",
        "tooltip-ca-talk": "വിവരദായക താളിനെക്കുറിച്ചുള്ള ചർച്ച",
        "tooltip-ca-nstab-category": "വർഗ്ഗം താൾ കാണുക",
        "tooltip-minoredit": "ഇത് ഒരു ചെറുതിരുത്തലായി അടയാളപ്പെടുത്തുക",
        "tooltip-save": "മാറ്റങ്ങൾ സംരക്ഷിക്കുന്നു",
+       "tooltip-publish": "താങ്കളുടെ മാറ്റങ്ങൾ പ്രസിദ്ധീകരിക്കുക",
        "tooltip-preview": "താങ്കൾ വരുത്തിയ മാറ്റത്തിന്റെ ഫലം എങ്ങനെയായിരിക്കുമെന്നു കാണുന്നതിനു താൾ സംരക്ഷിക്കുന്നതിനു മുൻപ് ഈ ബട്ടൺ ഉപയോഗിക്കുക!",
        "tooltip-diff": "താങ്കൾ ഉള്ളടക്കത്തിൽ വരുത്തിയ മാറ്റങ്ങൾ ഏതൊക്കെയെന്നു പ്രദർശിപ്പിക്കുക",
        "tooltip-compareselectedversions": "ഈ താളിന്റെ താങ്കൾ തിരഞ്ഞെടുത്ത രണ്ട് പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം കാണുക.",
        "anonymous": "{{SITENAME}} സംരംഭത്തിലെ അജ്ഞാത {{PLURAL:$1|ഉപയോക്താവ്|ഉപയോക്താക്കൾ}}",
        "siteuser": "{{SITENAME}} ഉപയോക്താവ് $1",
        "anonuser": "{{SITENAME}} പദ്ധതിയിലെ അജ്ഞാത ഉപയോക്താവ് $1",
-       "lastmodifiedatby": "$2, $1 നു $3 ആണ്‌ ഈ താൾ അവസാനം പുതുക്കിയത്.",
+       "lastmodifiedatby": "$2, $1 -നു $3 ആണ്‌ ഈ താൾ അവസാനം തിരുത്തിയത്.",
        "othercontribs": "$1 നടത്തിയ സൃഷ്ടിയെ അധികരിച്ച്.",
        "others": "മറ്റുള്ളവർ",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|ഉപയോക്താവ്‌}}|ഉപയോക്താക്കൾ}} $1",
        "pageinfo-length": "താളിന്റെ നീളം (ബൈറ്റിൽ)",
        "pageinfo-article-id": "താളിന്റെ ഐ.ഡി.",
        "pageinfo-language": "താളിന്റെ ഉള്ളടക്കത്തിന്റെ ഭാഷ",
+       "pageinfo-language-change": "മാറ്റുക",
        "pageinfo-content-model": "താളിന്റെ ഉള്ളടക്ക രീതി",
+       "pageinfo-content-model-change": "മാറ്റുക",
        "pageinfo-robot-policy": "റോബോട്ടുകളുടെ സൂചികാവത്കരണം",
        "pageinfo-robot-index": "അനുവദിച്ചിരിക്കുന്നു",
        "pageinfo-robot-noindex": "അനുവദിച്ചിട്ടില്ല",
        "pageinfo-category-pages": "താളുകളുടെ എണ്ണം",
        "pageinfo-category-subcats": "ഉപവർഗ്ഗങ്ങളുടെ എണ്ണം",
        "pageinfo-category-files": "പ്രമാണങ്ങളുടെ എണ്ണം",
+       "pageinfo-user-id": "ഉപയോക്തൃ ഐ.ഡി.",
+       "pageinfo-file-hash": "ഹാഷ് വില",
        "markaspatrolleddiff": "റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
        "markaspatrolledtext": "ഈ താളിൽ റോന്തുചുറ്റിയതായി രേഖപ്പെടുത്തുക",
        "markaspatrolledtext-file": "പ്രമാണത്തിന്റെ ഈ പതിപ്പിൽ റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
        "patrol-log-header": "റോന്തുചുറ്റപ്പെട്ട നാൾപ്പതിപ്പുകളുടെ രേഖയാണിത്",
        "log-show-hide-patrol": "റോന്തുചുറ്റൽ രേഖ $1",
        "log-show-hide-tag": "ടാഗ് രേഖ $1",
+       "confirm-markpatrolled-button": "ശരി",
+       "confirm-markpatrolled-top": "$2 താളിലെ $3 നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തണോ?",
        "deletedrevision": "$1 എന്ന പഴയ പതിപ്പ് മായ്ച്ചിരിക്കുന്നു",
        "filedeleteerror-short": "പ്രമാണം നീക്കം ചെയ്യുമ്പോൾ പ്രശ്നം: $1",
        "filedeleteerror-long": "പ്രമാണം നീക്കം ചെയ്യുമ്പോൾ ചില പ്രശ്നങ്ങൾ സംഭവിച്ചു:\n\n$1",
        "newimages-summary": "ചുരുക്കം",
        "newimages-legend": "അരിപ്പ",
        "newimages-label": "പ്രമാണത്തിന്റെ പേര്‌ (അഥവാ പേരിന്റെ ഭാഗം)",
+       "newimages-user": "ഐ.പി. വിലാസം അഥവാ ഉപയോക്തൃനാമം",
+       "newimages-newbies": "പുതിയ അംഗങ്ങൾ നടത്തിയ തിരുത്തുകൾ മാത്രം കാണിക്കുക",
        "newimages-showbots": "യന്ത്രങ്ങൾ ചെയ്ത അപ്‌ലോഡുകൾ പ്രദർശിപ്പിക്കുക",
        "newimages-hidepatrolled": "റോന്തുചുറ്റപ്പെട്ട അപ്‌ലോഡുകൾ മറയ്ക്കുക",
+       "newimages-mediatype": "മീഡിയ തരം:",
        "noimages": "ഒന്നും കാണാനില്ല.",
        "ilsubmit": "തിരയൂ",
        "bydate": "ദിനക്രമത്തിൽ",
        "confirmrecreate-noreason": "താങ്കൾ തിരുത്താനാരംഭിച്ചതിനു ശേഷം, ഉപയോക്താവ് [[User:$1|$1]] ([[User talk:$1|സംവാദം]]) ഈ താൾ {{GENDER:$1|മായ്ച്ചിരിക്കുന്നു}}. ഈ താൾ പുനഃസൃഷ്ടിക്കണം എന്നത് സ്ഥിരീകരിക്കുക.",
        "recreate": "പുനഃസൃഷ്ടിക്കുക",
        "unit-pixel": "ബിന്ദു",
+       "confirm-purge-title": "ഈ താൾ ശുദ്ധീകരിക്കുക",
        "confirm_purge_button": "ശരി",
        "confirm-purge-top": "ഈ താളിന്റെ കാഷെ ക്ലീയർ ചെയ്യട്ടെ?",
        "confirm-purge-bottom": "താൾ ശുദ്ധീകരിക്കുമ്പോൾ കാഷെ ഒഴിവാക്കുകയും, ഏറ്റവും പുതിയ പതിപ്പ് പ്രത്യക്ഷപ്പെടാൻ സമ്മർദ്ദം ചെലുത്തുകയും ചെയ്യുന്നതാണ്.",
        "confirm-watch-top": "ഈ താൾ താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിലേക്കു ചേർക്കട്ടെ?",
        "confirm-unwatch-button": "ശരി",
        "confirm-unwatch-top": "ഈ താൾ ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്നും നീക്കട്ടെ?",
+       "confirm-rollback-button": "ശരി",
+       "confirm-rollback-top": "ഈ താളിലെ തിരുത്തുകൾ തിരിച്ചാക്കണോ?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← മുൻപത്തെ താൾ",
        "imgmultipagenext": "അടുത്ത താൾ →",
        "autosumm-blank": "താൾ ശൂന്യമാക്കി",
        "autosumm-replace": "താളിലെ വിവരങ്ങൾ $1 എന്നാക്കിയിരിക്കുന്നു",
        "autoredircomment": "[[$1]] എന്ന താളിലേക്ക് തിരിച്ചുവിടുന്നു",
+       "autosumm-removed-redirect": "[[$1]] താളിലോട്ടുള്ള തിരിച്ചുവിടൽ ഒഴിവാക്കി",
+       "autosumm-changed-redirect-target": "തിരിച്ചുവിടൽ [[$1]] എന്നതിൽ നിന്നും [[$2]] എന്നതിലേക്ക് മാറ്റി",
        "autosumm-new": "'$1' താൾ സൃഷ്ടിച്ചിരിക്കുന്നു",
        "autosumm-newblank": "ശൂന്യമായ താൾ സൃഷ്ടിച്ചു",
        "size-bytes": "$1 ബൈ",
        "watchlistedit-clear-titles": "തലക്കെട്ടുകൾ:",
        "watchlistedit-clear-submit": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക ശൂന്യമാക്കുക (ഇത് സ്ഥിരമായിരിക്കും!)",
        "watchlistedit-clear-done": "താങ്കളുടെ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക ശൂന്യമാക്കിയിരിക്കുന്നു.",
+       "watchlistedit-clear-jobqueue": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക ശുദ്ധീകരിക്കുന്നു. ഇത് അല്പം സമയം എടുക്കും!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|ഒരു തലക്കെട്ട്|$1 തലക്കെട്ടുകൾ}} ഒഴിവാക്കി:",
        "watchlistedit-too-many": "പ്രദർശിപ്പിക്കാൻ വളരെയധികം താളുകൾ ഉണ്ട്.",
        "watchlisttools-clear": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക ശൂന്യമാക്കുക",
        "tag-filter": "[[Special:Tags|അനുബന്ധങ്ങളുടെ]] അരിപ്പ:",
        "tag-filter-submit": "അരിപ്പ",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|റ്റാഗ്|റ്റാഗുകൾ}}]]: $2)",
+       "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": "ഒരു താളിന്റെ 90% ഉള്ളടക്കം മാറ്റുന്ന തിരുത്ത്",
+       "tag-mw-rollback": "റോൾബാക്ക്",
+       "tag-mw-rollback-description": "തിരിച്ചാക്കൽ കണ്ണി ഉപയോഗിച്ച് പഴയ തിരുത്തുകൾ ഒഴിവാക്കുന്ന തിരുത്ത്",
+       "tag-mw-undo": "തിരസ്ക്കരിക്കൽ",
+       "tag-mw-undo-description": "തിരസ്കരിക്കുക കണ്ണി ഉപയോഗിച്ച് മുമ്പത്തെ തിരുത്തുകൾ ഒഴിവാക്കുന്ന തിരുത്തുകൾ",
        "tags-title": "അനുബന്ധങ്ങൾ",
        "tags-intro": "സോഫ്റ്റ്‌വെയർ അടയാളപ്പെടുത്തിയ തിരുത്തുകളുടെ അനുബന്ധങ്ങളും, അവയുടെ അർത്ഥവും ഈ താളിൽ പ്രദർശിപ്പിക്കുന്നു.",
        "tags-tag": "റ്റാഗിന്റെ പേര്‌",
        "tags-actions-header": "പ്രവൃത്തികൾ",
        "tags-active-yes": "അതെ",
        "tags-active-no": "അല്ല",
-       "tags-source-extension": "à´\92à´°àµ\81 à´\85à´¨àµ\81ബനàµ\8dà´§à´\82 നിർവ്വചിച്ചിരിക്കുന്നത് പ്രകാരം",
+       "tags-source-extension": "à´¸àµ\8bà´«àµ\8dà´±àµ\8dà´±àµ\8dâ\80\8cà´µàµ\87ർ നിർവ്വചിച്ചിരിക്കുന്നത് പ്രകാരം",
        "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à´±à´\99àµ\8dà´\99ൾ à´µà´¿à´\9cà´¯à´\95രമായി à´¬à´¾à´§à´\95മാà´\95àµ\8dà´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.",
+       "tags-edit-success": "മാറ്റങ്ങൾ ബാധകമാക്കിയിരിക്കുന്നു.",
        "tags-edit-failure": "മാറ്റങ്ങൾ ബാധകമാക്കാൻ കഴിഞ്ഞില്ല:\n$1",
        "tags-edit-nooldid-title": "അസാധുവായ ലക്ഷ്യ നാൾപ്പതിപ്പ്",
        "tags-edit-nooldid-text": "താങ്കൾ ഒന്നെങ്കിൽ ഈ  പ്രവൃത്തി ചെയ്യേണ്ട ലക്ഷ്യ നാൾപ്പതിപ്പ് വ്യക്തമാക്കിയില്ല അല്ലെങ്കിൽ ആ നാൾപ്പതിപ്പ് നിലവിലില്ല.",
        "compare-invalid-title": "താങ്കൾ നൽകിയ തലക്കെട്ട് അസാധുവാണ്.",
        "compare-title-not-exists": "താങ്കൾ നൽകിയ തലക്കെട്ട് നിലവിലില്ല.",
        "compare-revision-not-exists": "താങ്കൾ വ്യക്തമാക്കിയ നാൾപ്പതിപ്പ് നിലവിലില്ല.",
+       "diff-form": "വ്യത്യാസങ്ങൾ",
+       "diff-form-oldid": "പഴയ നാൾപ്പതിപ്പ് ഐ.ഡി.(ഐച്ഛികം)",
+       "diff-form-revid": "വ്യത്യാസം വേണ്ട നാൾപ്പതിപ്പ് ഐ.ഡി.",
+       "diff-form-submit": "വ്യത്യാസം കാണിക്കുക",
+       "permanentlink": "സ്ഥിരംകണ്ണി",
+       "permanentlink-revid": "നാൾപ്പതിപ്പ് ഐ.ഡി.",
+       "permanentlink-submit": "നാൾപ്പതിപ്പിലേക്ക് പോവുക",
        "dberr-problems": "ക്ഷമിക്കണം! ഈ സൈറ്റിൽ സാങ്കേതിക തകരാറുകൾ അനുഭവപ്പെടുന്നുണ്ട്.",
        "dberr-again": "കുറച്ച് മിനിട്ടുകൾ കാത്തിരുന്ന് വീണ്ടും തുറക്കുവാൻ ശ്രമിക്കുക.",
        "dberr-info": "(വിവരശേഖരം എടുക്കാൻ പറ്റിയില്ല: $1)",
        "htmlform-cloner-create": "കൂടുതൽ ചേർക്കുക",
        "htmlform-cloner-delete": "നീക്കം ചെയ്യുക",
        "htmlform-cloner-required": "കുറഞ്ഞത് ഒരു വിലയെങ്കിലും നൽകിയിരിക്കണം.",
+       "htmlform-date-placeholder": "വവവവ-മാമാ-തീതീ",
+       "htmlform-time-placeholder": "മമ:മിമി:സെസെ",
+       "htmlform-datetime-placeholder": "വവവവ-മാമാ-തീതീ മമ:മിമി:സെസെ",
+       "htmlform-date-invalid": "താങ്കൾ നൽകിയ വില തീയതിയായി കണക്കാക്കാനാകുന്നില്ല. വവവവ-മാമാ-തീതീ ഘടന ഉപയോഗിച്ചുനോക്കുക",
+       "htmlform-time-invalid": "താങ്കൾ നൽകിയ വില സമയമായി കണക്കാക്കാനാകുന്നില്ല. മമ:മിമി:സെസെ ഘടന ഉപയോഗിച്ചുനോക്കുക",
+       "htmlform-datetime-invalid": "താങ്കൾ നൽകിയ വില തീയതിയും സമയവുമായി കണക്കാക്കാനാകുന്നില്ല. വവവവ-മാമാ-തീതീ മമ:മിമി:സെസെ ഘടന ഉപയോഗിച്ചുനോക്കുക",
        "htmlform-title-badnamespace": "[[:$1]] ഉള്ളത് \"{{ns:$2}}\" നാമമേഖലയിലല്ല.",
        "htmlform-title-not-creatable": "\"$1\" സൃഷ്ടിക്കാനാവുന്ന തലക്കെട്ടല്ല.",
        "htmlform-title-not-exists": "$1 നിലവിലില്ല.",
        "htmlform-user-not-exists": "<strong>$1</strong> നിലവിലില്ല.",
        "htmlform-user-not-valid": "<strong>$1</strong> സാധുതയുള്ള ഉപയോക്തൃനാമമല്ല.",
        "logentry-delete-delete": "$3 എന്ന താൾ $1 {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}",
-       "logentry-delete-restore": "$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}}",
+       "logentry-delete-delete_redir": " $3 എന്ന തിരിച്ചുവിടൽ, $1, മുകളിൽ ചേർത്തത് വഴി {{GENDER:$2|മായ്‌ച്ചിരിക്കുന്നു}}",
+       "logentry-delete-restore": "$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}} ($4)",
+       "logentry-delete-restore-nocount": "$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}}",
+       "restore-count-revisions": "{{PLURAL:$1|ഒരു നാൾപ്പതിപ്പ്|$1 നാൾപ്പതിപ്പുകൾ}}",
+       "restore-count-files": "{{PLURAL:$1|ഒരു പ്രമാണം|$1 പ്രമാണങ്ങൾ}}",
        "logentry-delete-event": "$3 എന്ന {{PLURAL:$5|രേഖയിലെ മാറ്റത്തിന്റെ|രേഖയിലെ $5 മാറ്റങ്ങളുടെ}} ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4",
        "logentry-delete-revision": "$3 എന്ന താളിലെ {{PLURAL:$5|നാൾപ്പതിപ്പിന്റെ|$5 നാൾപ്പതിപ്പുകളുടെ}} ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4",
        "logentry-delete-event-legacy": "$3 എന്ന രേഖയിലെ മാറ്റങ്ങളുടെ ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-protect-protect-cascade": "$3 താൾ $1 {{GENDER:$2|സംരക്ഷിച്ചു}} $4 [നിർഝരിതം]",
        "logentry-protect-modify": "$3 താളിന്റെ സംരക്ഷണതലം $1 {{GENDER:$2|മാറ്റി}} $4",
        "logentry-protect-modify-cascade": "$3 താളിന്റെ സംരക്ഷണതലം $1 {{GENDER:$2|മാറ്റി}} $4 [നിർഝരിതം]",
-       "logentry-rights-rights": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
+       "logentry-rights-rights": "{{GENDER:$6|$3}} എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-rights-rights-legacy": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-rights-autopromote": "$1 എന്ന ഉപയോക്താവ് $4 എന്നതിൽ നിന്നും $5 എന്നതിലേയ്ക്ക് സ്വയമേവ {{GENDER:$2|ഉയർത്തപ്പെട്ടിരിക്കുന്നു}}",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|അപ്‌ലോഡ് ചെയ്തു}}",
        "logentry-tag-update-revision": "$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പിൽ ടാഗുകൾ $1 {{GENDER:$2|പുതുക്കി}} ($6 {{PLURAL:$7|ചേർത്തു}}; $8 {{PLURAL:$9|നീക്കംചെയ്തു}})",
        "logentry-tag-update-logentry": "$3 എന്ന താളിന്റെ $5 എന്ന രേഖയിലെ ഉൾപ്പെടുത്തലിൽ ടാഗുകൾ $1 {{GENDER:$2|പുതുക്കി}} ($6 {{PLURAL:$7|ചേർത്തു}}; $8 {{PLURAL:$9|നീക്കംചെയ്തു}})",
        "rightsnone": "(ഒന്നുമില്ല)",
+       "rightslogentry-temporary-group": "$1 (താത്കാലികം, $2 വരെ)",
        "feedback-adding": "താങ്കളുടെ അഭിപ്രായങ്ങൾ താളിലേയ്ക്ക് ചേർക്കുന്നു...",
        "feedback-back": "പുറകോട്ട്",
        "feedback-bugcheck": "കൊള്ളാം! [$1 അറിയാവുന്ന ബഗുകളിൽ] ഒന്നല്ല എന്ന് ഒന്നു പരിശോധിച്ചേക്കുക.",
        "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": "{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}}",
        "duration-minutes": "{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}",
        "limitreport-expansiondepth": "വികസിപ്പിക്കാനാവുന്ന ഉയർന്ന പരിധി",
        "limitreport-expensivefunctioncount": "വ്യയമേറിയ പാഴ്സർ ഫങ്ഷൻ എണ്ണം",
        "expandtemplates": "ഫലകങ്ങൾ വികസിപ്പിക്കുക",
-       "expand_templates_intro": "à´\88 à´ªàµ\8dà´°à´¤àµ\8dà´¯àµ\87à´\95 à´¤à´¾àµ¾, à´\9aà´¿à´² à´\8eà´´àµ\81à´¤àµ\8dà´¤àµ\81à´\95ൾ à´\8eà´\9fàµ\81à´¤àµ\8dà´¤àµ\8d à´\8eà´²àµ\8dലാ à´«à´²à´\95à´\99àµ\8dà´\99à´³àµ\81à´\82 à´ªàµ\81നരാവർതàµ\8dതിത à´¸àµ\8dവഭാവതàµ\8dà´¤àµ\8bà´\9fàµ\86 à´µà´¿à´\95സിപàµ\8dപിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.\n<code><nowiki>{{</nowiki>#à´\8eà´\99àµ\8dà´\95ിൽ:…}}</code> തുടങ്ങിയ പാഴ്‌സർ ഫങ്ഷനുകളും\n<code><nowiki>{{</nowiki>ഈദിവസം}}</code> തുടങ്ങിയ ചരങ്ങളും, ഈ താൾ വികസിപ്പിക്കുന്നുണ്ട്.\nചുരുക്കിപറഞ്ഞാൽ ഇരട്ട കോഷ്ഠകങ്ങളിലുള്ള എന്തിനേയും വികസിപ്പിക്കുന്നു.",
+       "expand_templates_intro": "à´\88 à´ªàµ\8dà´°à´¤àµ\8dà´¯àµ\87à´\95 à´¤à´¾àµ¾, à´\9aà´¿à´² à´µà´¿à´\95àµ\8dà´\95à´¿à´\8eà´´àµ\81à´¤àµ\8dà´¤àµ\81à´\95ൾ à´\8eà´\9fàµ\81à´¤àµ\8dà´¤àµ\8d à´\8eà´²àµ\8dലാ à´«à´²à´\95à´\99àµ\8dà´\99à´³àµ\81à´\82 à´ªàµ\81നരാവർതàµ\8dതിത à´¸àµ\8dവഭാവതàµ\8dà´¤àµ\8bà´\9fàµ\86 à´µà´¿à´\95സിപàµ\8dപിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.\n<code><nowiki>{{</nowiki>#ഭാഷ:…}}</code> തുടങ്ങിയ പാഴ്‌സർ ഫങ്ഷനുകളും\n<code><nowiki>{{</nowiki>ഈദിവസം}}</code> തുടങ്ങിയ ചരങ്ങളും, ഈ താൾ വികസിപ്പിക്കുന്നുണ്ട്.\nചുരുക്കിപറഞ്ഞാൽ ഇരട്ട കോഷ്ഠകങ്ങളിലുള്ള എന്തിനേയും വികസിപ്പിക്കുന്നു.",
        "expand_templates_title": "{{FULLPAGENAME}} മുതലായവ എടുക്കാനായി ഉള്ളടക്കത്തിന്റെ തലക്കെട്ട്:",
-       "expand_templates_input": "à´\87ൻപàµ\81à´\9fàµ\8dà´\9fàµ\8d à´\9fàµ\86à´\95àµ\8dà´¸àµ\8dà´±àµ\8dà´±്:",
+       "expand_templates_input": "à´\87ൻപàµ\81à´\9fàµ\8dà´\9fàµ\8d à´µà´¿à´\95àµ\8dà´\95à´¿à´\8eà´´àµ\81à´¤àµ\8dà´¤്:",
        "expand_templates_output": "ഫലം",
        "expand_templates_xml_output": "എക്സ്.എം.എൽ. ഔട്ട്പുട്ട്",
        "expand_templates_html_output": "അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ. ഔട്ട്പുട്ട്",
        "expand_templates_generate_xml": "എക്സ്.എം.എൽ. പാഴ്‌സർ ട്രീ പ്രദർശിപ്പിക്കുക",
        "expand_templates_generate_rawhtml": "അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ. പ്രദർശിപ്പിക്കുക",
        "expand_templates_preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
-       "expand_templates_preview_fail_html": "<em>{{SITENAME}} സംരംഭത്തിൽ അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ സജ്ജമാക്കിയിരിക്കുന്നതിനാലും, സെഷൻ വിവരങ്ങൾ നഷ്ടപ്പെട്ടിരിക്കുന്നതിനാലും, ജാവാസ്ക്രിപ്റ്റ് ആക്രമണങ്ങൾക്കെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ എങ്ങനെയുണ്ടെന്ന് കാണൽ മറച്ചിരിക്കുകയാണ്.</em>\n\n<strong>ഇത് എങ്ങനെയുണ്ടെന്ന് കാണാനുള്ള യഥാർത്ഥശ്രമമാണെങ്കിൽ വീണ്ടും ശ്രമിക്കുക.</strong>\nഇപ്പോഴും പ്രവർത്തിക്കുന്നില്ലെങ്കിൽ, [[Special:UserLogout|പുറത്ത് കടന്ന്]] വീണ്ടും പ്രവേശിച്ച ശേഷം പരീക്ഷിക്കുക.",
+       "expand_templates_preview_fail_html": "<em>{{SITENAME}} സംരംഭത്തിൽ അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ സജ്ജമാക്കിയിരിക്കുന്നതിനാലും, സെഷൻ വിവരങ്ങൾ നഷ്ടപ്പെട്ടിരിക്കുന്നതിനാലും, ജാവാസ്ക്രിപ്റ്റ് ആക്രമണങ്ങൾക്കെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ എങ്ങനെയുണ്ടെന്ന് കാണൽ മറച്ചിരിക്കുകയാണ്.</em>\n\n<strong>ഇത് എങ്ങനെയുണ്ടെന്ന് കാണാനുള്ള യഥാർത്ഥശ്രമമാണെങ്കിൽ വീണ്ടും ശ്രമിക്കുക.</strong>\nഇപ്പോഴും പ്രവർത്തിക്കുന്നില്ലെങ്കിൽ, [[Special:UserLogout|പുറത്ത് കടന്ന്]] വീണ്ടും പ്രവേശിച്ച ശേഷം പരീക്ഷിക്കുക, താങ്കളുടെ ബ്രൗസർ ഈ സൈറ്റിൽ നിന്നുള്ള കുക്കികൾ അനുവദിക്കുന്നുണ്ടെന്നും ഉറപ്പാക്കുക.",
        "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} സംരംഭത്തിൽ അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ സജ്ജമാക്കിയിരിക്കുന്നതിനാലും, സെഷൻ വിവരങ്ങൾ നഷ്ടപ്പെട്ടിരിക്കുന്നതിനാലും, ജാവാസ്ക്രിപ്റ്റ് ആക്രമണങ്ങൾക്കെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ എങ്ങനെയുണ്ടെന്ന് കാണൽ മറച്ചിരിക്കുകയാണ്.</em>\n\n<strong>ഇത് എങ്ങനെയുണ്ടെന്ന് കാണാനുള്ള യഥാർത്ഥശ്രമമാണെങ്കിൽ [[Special:UserLogin|പ്രവേശിച്ച ശേഷം]] വീണ്ടും ശ്രമിക്കുക.</strong>",
        "expand_templates_input_missing": "ചില വിവരങ്ങളെങ്കിലും താങ്കൾ നൽകിയിരിക്കണം.",
-       "pagelanguage": "താളിന്റെ ഭാഷാ തിരഞ്ഞെടുപ്പ് സൗകര്യം",
+       "pagelanguage": "താളിന്റെ ഭാഷ മാറ്റുക",
        "pagelang-name": "താൾ",
        "pagelang-language": "ഭാഷ",
        "pagelang-use-default": "സ്വതേയുള്ള ഭാഷ ഉപയോഗിക്കുക",
        "pagelang-select-lang": "ഭാഷ തിരഞ്ഞെടുക്കുക",
        "pagelang-reason": "കാരണം",
        "pagelang-submit": "സമർപ്പിക്കുക",
+       "pagelang-nonexistent-page": "$1 എന്ന താൾ നിലവിലില്ല.",
        "right-pagelang": "താളിന്റെ ഭാഷ മാറ്റുക",
        "action-pagelang": "താളിന്റെ ഭാഷ മാറ്റുക",
        "log-name-pagelang": "ഭാഷ മാറ്റലിന്റെ രേഖ",
        "special-characters-title-emdash": "എം ഡാഷ്",
        "special-characters-title-minus": "വ്യവകലന ചിഹ്നം",
        "mw-widgets-dateinput-no-date": "തീയതി ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല",
+       "mw-widgets-mediasearch-input-placeholder": "മീഡിയയ്ക്കായി തിരയുക",
+       "mw-widgets-mediasearch-noresults": "ഫലങ്ങളൊന്നും കണ്ടെത്താനായില്ല.",
        "mw-widgets-titleinput-description-new-page": "താൾ ഇപ്പോൾ നിലവിലില്ല",
        "mw-widgets-titleinput-description-redirect": "$1 എന്ന താളിലേക്കുള്ള തിരിച്ചുവിടൽ",
+       "mw-widgets-categoryselector-add-category-placeholder": "വർഗ്ഗം ചേർക്കുക...",
        "mw-widgets-usersmultiselect-placeholder": "കൂടുതൽ ചേർക്കുക...",
        "date-range-from": "ഈ തീയതി മുതൽ:",
        "date-range-to": "ഈ തീയതി വരെ:",
        "sessionprovider-generic": "$1 സെഷനുകൾ",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "കൂക്കി-അധിഷ്ഠിത സെഷനുകൾ",
        "sessionprovider-nocookies": "കൂക്കികൾ സജ്ജമല്ലായിരിക്കാം. കൂക്കികൾ സജ്ജമാണോയെന്ന് ഉറപ്പാക്കിയ ശേഷം വീണ്ടും തുടങ്ങുക.",
-       "randomrootpage": "മൂലതാൾ ക്രമരഹിതമായി നൽകുക"
+       "randomrootpage": "മൂലതാൾ ക്രമരഹിതമായി നൽകുക",
+       "log-action-filter-block": "തടയലിന്റെ തരം:",
+       "log-action-filter-delete": "മായ്ക്കലിന്റെ തരം:",
+       "log-action-filter-import": "ഇറക്കുമതിയുടെ തരം:",
+       "log-action-filter-move": "മാറ്റലിന്റെ തരം:",
+       "log-action-filter-all": "എല്ലാം",
+       "log-action-filter-block-block": "തടയൽ",
+       "log-action-filter-block-reblock": "തടയലിൽ വരുത്തുന്ന മാറ്റം",
+       "log-action-filter-block-unblock": "തടയൽ നീക്കൽ",
+       "log-action-filter-delete-delete": "താൾ മായ്ക്കൽ",
+       "log-action-filter-delete-delete_redir": "തിരിച്ചുവിടൽ മാറ്റിയെഴുതൽ",
+       "log-action-filter-delete-restore": "താൾ പുനഃസ്ഥാപനം",
+       "log-action-filter-delete-event": "രേഖയുടെ മായ്ക്കൽ",
+       "log-action-filter-delete-revision": "നാൾപ്പതിപ്പ് മായ്ക്കൽ",
+       "log-action-filter-import-interwiki": "ട്രാൻസ്‌‌വിക്കി ഇറക്കുമതി",
+       "log-action-filter-import-upload": "എക്സ്.എം.എൽ. അപ്‌ലോഡ് വഴിയുള്ള ഇറക്കുമതി",
+       "log-action-filter-protect-protect": "സംരക്ഷണം",
+       "log-action-filter-protect-unprotect": "സംരക്ഷണമൊഴിവാക്കൽ",
+       "log-action-filter-protect-move_prot": "സംരക്ഷണം മാറ്റി",
+       "log-action-filter-suppress-event": "രേഖ ഒതുക്കൽ",
+       "log-action-filter-suppress-revision": "നാൾപ്പതിപ്പ് ഒതുക്കൽ",
+       "log-action-filter-suppress-delete": "താൾ ഒതുക്കൽ",
+       "log-action-filter-upload-upload": "പുതിയ അപ്‌ലോഡ്",
+       "log-action-filter-upload-overwrite": "പുനർ അപ്‌ലോഡ്",
+       "authmanager-create-disabled": "അംഗത്വസൃഷ്ടി പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.",
+       "authmanager-create-from-login": "താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കാൻ, ദയവായി കളങ്ങൾ പൂരിപ്പിക്കുക.",
+       "authmanager-create-not-in-progress": "സെഷൻ ഡേറ്റ നഷ്ടപ്പെട്ടതിനാൽ അംഗത്വസൃഷ്ടിയുടെ പുരോഗതി നഷ്ടമായിരിക്കുന്നു. ദയവായി  ആദ്യം മുതൽ വീണ്ടും തുടങ്ങുക.",
+       "authmanager-create-no-primary": "അംഗത്വസൃഷ്ടിക്ക് നൽകിയിരിക്കുന്ന വിവരങ്ങൾ ഉപയോഗിക്കാനാവില്ല.",
+       "authmanager-link-no-primary": "അംഗത്വം ബന്ധിപ്പിക്കാൻ നൽകിയിരിക്കുന്ന വിവരങ്ങൾ ഉപയോഗിക്കാനാവില്ല.",
+       "authmanager-link-not-in-progress": "സെഷൻ ഡേറ്റ നഷ്ടപ്പെട്ടതിനാൽ അംഗത്വം ബന്ധിപ്പിക്കലിന്റെ പുരോഗതി നഷ്ടമായിരിക്കുന്നു. ദയവായി  ആദ്യം മുതൽ വീണ്ടും തുടങ്ങുക.",
+       "authmanager-authplugin-setpass-failed-title": "രഹസ്യവാക്ക് മാറ്റം പരാജയപ്പെട്ടു",
+       "authmanager-authplugin-setpass-bad-domain": "അസാധുവായ ഡൊമൈൻ.",
+       "authmanager-userdoesnotexist": "\"$1\" എന്ന ഉപയോക്തൃ അം‌ഗത്വം നിലവിലില്ല.",
+       "authmanager-userlogin-remembermypassword-help": "രഹസ്യവാക്ക് സെഷൻ കാലയളവിലധികം ഓർത്തുവെക്കണോ.",
+       "authmanager-username-help": "രഹസ്യവാക്ക് ഉപയോഗിച്ചുള്ള സാധൂകരണം.",
+       "authmanager-password-help": "രഹസ്യവാക്ക് ഉപയോഗിച്ചുള്ള സാധൂകരണം.",
+       "authmanager-domain-help": "ഡൊമൈൻ ഉപയോഗിച്ചുള്ള ബാഹ്യ സാധൂകരണം.",
+       "authmanager-retype-help": "സ്ഥിരീകരിക്കാനായി വീണ്ടും രഹസ്യവാക്ക് നൽകുക.",
+       "authmanager-email-label": "ഇമെയിൽ",
+       "authmanager-email-help": "ഇമെയിൽ വിലാസം",
+       "authmanager-realname-label": "യഥാർത്ഥ പേര്‌",
+       "authmanager-realname-help": "ഉപയോക്താവിന്റെ യഥാർത്ഥ പേര്",
+       "authmanager-provider-password": "രഹസ്യവാക്ക്-അധിഷ്ഠിത സാധൂകരണം",
+       "authmanager-provider-password-domain": "രഹസ്യവാക്ക്-ഡൊമൈൻ-അധിഷ്ഠിത സാധൂകരണം",
+       "authmanager-provider-temporarypassword": "താത്കാലിക രഹസ്യവാക്ക്",
+       "authprovider-resetpass-skip-label": "മറികടക്കുക",
+       "specialpage-securitylevel-not-allowed-title": "അനുവദിച്ചിട്ടില്ല",
+       "cannotauth-not-allowed-title": "അനുമതി നിഷേധിച്ചിരിക്കുന്നു",
+       "cannotauth-not-allowed": "ഈ താൾ ഉപയോഗിക്കാൻ താങ്കൾക്ക് അനുവാദമില്ല",
+       "edit-error-short": "പിഴവ്: $1",
+       "edit-error-long": "പിഴവുകൾ:\n\n$1",
+       "revid": "നാൾപ്പതിപ്പ് $1",
+       "pageid": "താൾ ഐ.ഡി. $1",
+       "rawhtml-notallowed": "&lt;html&gt; ടാഗുകൾ സാധാരണ താളുകൾക്ക്പുറത്ത് ഉപയോഗിക്കാനാകില്ല.",
+       "gotointerwiki": "{{SITENAME}} സംരംഭത്തിൽ നിന്നും പോകുകയാണ്",
+       "gotointerwiki-invalid": "നൽകിയിരിക്കുന്ന തലക്കെട്ട് അസാധുവാണ്.",
+       "pagedata-title": "താൾ വിവരങ്ങൾ",
+       "pagedata-bad-title": "അസാധുവായ തലക്കെട്ട്: $1."
 }
index dabc353..78ffe43 100644 (file)
        "newpageletter": "Ш",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 хэрэглэгч харж байна]",
-       "rc_categories": "Ангиллуудад хязгаарлах (\"|\" тэмдгээр тусгаарлана)",
-       "rc_categories_any": "Хамаагүй",
        "rc-change-size-new": "Өөрчилсний дараа $1 {{PLURAL:$1|байт|байт}}",
        "newsectionsummary": "/* $1 */ шинэ хэсэг",
        "rc-enhanced-expand": "Дэлгэрэнгүй мэдээллийг үзүүлэх (ЖаваСкрипт хэрэглэгдэнэ)",
index 16db22e..bd57dcc 100644 (file)
@@ -50,7 +50,8 @@
                        "Nemo bis",
                        "Suyog",
                        "Matma Rex",
-                       "Tiven2240"
+                       "Tiven2240",
+                       "Sureshkhole"
                ]
        },
        "tog-underline": "दुव्यांचे अधोरेखन:",
        "revertmerge": "अविलीन करा",
        "mergelogpagetext": "एका पानाचा इतिहास इतर पानात टाकून अगदी अलीकडे एकत्रित केलेली एकत्रिकरणे निम्न्दर्शीत सूचीमध्ये आहेत.",
        "history-title": "\"$1\" चा संपादन इतिहास",
-       "difference-title": "\"$1\" à¤\9aà¥\8dया à¤µà¤¿à¤µà¤¿à¤§ à¤\89à¤\9cळण्यांमधील फरक",
+       "difference-title": "\"$1\" à¤\9aà¥\8dया à¤µà¤¿à¤µà¤¿à¤§ à¤\86वà¥\83त्यांमधील फरक",
        "difference-title-multipage": "\"$1\" व \"$2\" या पानांमधला फरक",
        "difference-multipage": "(पानांमधील फरक)",
        "lineno": "ओळ $1:",
        "searchprofile-articles-tooltip": "$1 मध्ये शोधा",
        "searchprofile-images-tooltip": "संचिकांसाठी शोधा",
        "searchprofile-everything-tooltip": "सर्व पाने शोधा (चर्चापानांसहित)",
-       "searchprofile-advanced-tooltip": "पारà¤\82परित(कस्टम) नामविश्वांमध्ये शोधा",
+       "searchprofile-advanced-tooltip": "बदलतà¥\8dया à¤¯à¥\87णà¥\8dयाà¤\9cà¥\8bà¤\97à¥\8dया(कस्टम) नामविश्वांमध्ये शोधा",
        "search-result-size": "$1 ({{PLURAL:$2|१ शब्द|$2 शब्द}})",
        "search-result-category-size": "{{PLURAL:$1|१ सदस्य|$1 सदस्य}} ({{PLURAL:$2|१ उपवर्ग|$2 उपवर्ग}}, {{PLURAL:$3|1 संचिका|$3 संचिका}})",
        "search-redirect": "($1 पासून पुनर्निर्देशन)",
        "recentchanges-label-newpage": "या संपादनाने नवीन पान तयार झाले",
        "recentchanges-label-minor": "हे एक किरकोळ संपादन आहे",
        "recentchanges-label-bot": "हे संपादन एका सांगकाम्याकडून केले गेले आहे",
-       "recentchanges-label-unpatrolled": "हà¥\87 à¤¸à¤\82पादन à¤\85à¤\9cà¥\82न à¤¤à¤ªà¤¾à¤¸à¤²à¥\8dया गेले नाही",
+       "recentchanges-label-unpatrolled": "हà¥\87 à¤¸à¤\82पादन à¤\85à¤\9cà¥\82न à¤¤à¤ªà¤¾à¤¸à¤²à¥\87 गेले नाही",
        "recentchanges-label-plusminus": "या पानाचा आकार इतक्या बाइटस् ने बदलला",
        "recentchanges-legend-heading": "<strong>विवरण:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "newpageletter": "न.पा.",
        "boteditletter": "सां.",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|सदस्याने|सदस्यांनी}} पहारा दिलेला आहे]",
-       "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा):",
-       "rc_categories_any": "निवडल्यापैकी कोणतेही",
        "rc-change-size-new": " बदलानंतर $1 {{PLURAL:$1|बाईट|बाईटस्}}",
        "newsectionsummary": "/* $1 */ नवीन विभाग",
        "rc-enhanced-expand": "तपशील दाखवा",
        "undelete-show-file-submit": "होय",
        "namespace": "नामविश्व:",
        "invert": "निवडीचा क्रम उलटा करा",
-       "tooltip-invert": "निवडलà¥\87लà¥\8dया à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल (à¤\86णि à¤¤à¤¸à¥\87 à¤¨à¤¿à¤µà¤¡à¤²à¥\8dयास à¤¸à¤\82बà¤\82धित à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल)  à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\87 à¤¬à¤¦à¤²  à¤\85दà¥\83षà¥\8dय à¤\95रण्यासाठी टिचकी मारा",
+       "tooltip-invert": "निवडलà¥\87लà¥\8dया à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल (à¤\86णि à¤¤à¤¸à¥\87 à¤¨à¤¿à¤µà¤¡à¤²à¥\8dयास à¤¸à¤\82बà¤\82धित à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल)  à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\87 à¤¬à¤¦à¤²  à¤²à¤ªà¤µण्यासाठी टिचकी मारा",
        "namespace_association": "सहभागी नामविश्वे",
        "tooltip-namespace_association": "निवडलेल्या नामविश्वासंबधीत विषय अथवा चर्चा नामविश्वसुद्धा आंतर्भूत करण्याकरिता हा बॉक्स टिचकवून चिह्नित करा",
        "blanknamespace": "(मुख्य)",
        "whatlinkshere": "येथे काय जोडले आहे",
        "whatlinkshere-title": "\"$1\" ला जुळलेली पाने",
        "whatlinkshere-page": "पान:",
-       "linkshere": "खालील लेख '''[[:$1]]''' या पानाशी जोडले आहेत:",
+       "linkshere": "à¤\96ालà¥\80ल à¤²à¥\87à¤\96 '''[[:$1]]''' à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\82शà¥\80 à¤\9cà¥\8bडलà¥\87 à¤\86हà¥\87त:",
        "nolinkshere": "'''[[:$1]]''' येथे कोणत्याही पानांचे दुवे नाहीत.",
        "nolinkshere-ns": "निवडलेल्या नामविश्वातील कोणतीही पाने <strong>[[:$1]]</strong>ला दुवा देत नाहीत .",
        "isredirect": "पुनर्निर्देशित पान",
        "htmlform-user-not-exists": "<strong>$1</strong> अस्तीत्वात नाही.",
        "htmlform-user-not-valid": "<strong>$1</strong> हे वैध सदस्यनाम नाही.",
        "logentry-delete-delete": "$1 {{GENDER:$2|वगळलेले पान}} $3",
-       "logentry-delete-delete_redir": "$1 ने $3 हे पुनर्निर्देशन उपरीलेखन(ओव्हररायटिंग) करून {{GENDER:$2|वगळले}}",
+       "logentry-delete-delete_redir": "$1 ने $3 हे पुनर्निर्देशन उपरीलेखन (ओव्हररायटिंग) करून {{GENDER:$2|वगळले}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|पुनर्स्थापित पृष्ठ}} $3",
        "logentry-delete-event": "$1 ने $3 वर{{PLURAL:$5|नोंद-प्रसंग|$5 नोंद प्रसंगांची}} दृष्यता{{GENDER:$2|बदलली}}:$4",
        "logentry-delete-revision": "$1 ने $3 पानावर{{PLURAL:$5|आवृत्ती|$5 आवृत्यांची}} दृष्यता{{GENDER:$2|बदलली}}:$4",
        "randomrootpage": "अविशिष्ट मूळ पान",
        "log-action-filter-contentmodel": "आशय नमूना बदलाचा प्रकार",
        "log-action-filter-delete": "वगळण्याचा प्रकार:",
+       "log-action-filter-move": "स्थानांतरणाचा प्रकार:",
+       "log-action-filter-all": "सर्व",
+       "log-action-filter-move-move": "उपरीलेखन (ओव्हररायटिंग) न-करता केलेली स्थानांतरणे",
+       "log-action-filter-move-move_redir": "उपरीलेखनासह (ओव्हररायटिंग) असलेली स्थानांतरणे",
        "log-action-filter-rights-rights": "मानवी बदल",
        "log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे",
        "changecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) बदला",
index 058eb5b..74271eb 100644 (file)
        "toc": "Isi kandungan",
        "showtoc": "tunjukkan",
        "hidetoc": "sorokkan",
-       "collapsible-collapse": "Lipat",
-       "collapsible-expand": "Kembangkan",
+       "collapsible-collapse": "Tutup",
+       "collapsible-expand": "Buka",
        "confirmable-confirm": "Pastikah {{GENDER:$1|anda}}?",
        "confirmable-yes": "Ya",
        "confirmable-no": "Tidak",
        "botpasswords-created-title": "Kata laluan bot telah dicipta",
        "botpasswords-created-body": "Kata laluan bot untuk nama bot \"$1\" bagi {{GENDER:$2|pengguna}} \"$2\" telah dicipta.",
        "botpasswords-updated-title": "Kata laluan bot telah dikemaskinikan",
-       "botpasswords-updated-body": "Kata laluan bot untuk nama bot \"$1\" bagi {GENDER:$2|pengguna}} \"$2\" telah dikemaskini.",
+       "botpasswords-updated-body": "Kata laluan bot untuk nama bot \"$1\" bagi {{GENDER:$2|pengguna}} \"$2\" telah dikemaskini.",
        "botpasswords-deleted-title": "Kata laluan bot telah dipadam",
        "botpasswords-deleted-body": "Kata laluan bot untuk nama bot \"$1\" bagi {{GENDER:$2|pengguna}} \"$2\" telah dipadam.",
        "botpasswords-newpassword": "Kata laluan baru untuk log masuk dengan <strong>$1</strong> adalah <strong>$2</strong>. <em>Sila catatkan ini untuk rujukan masa depan.</em> <br> (Untuk bot-bot lama yang memerlukan nama log masuk agar sama dengan nama pengguna akhirnya, anda juga boleh menggunakan <strong>$3</strong> sebagai nama pengguna dan <strong>$4</strong> sebagai kata laluan.)",
        "newarticle": "(Baru)",
        "newarticletext": "Anda telah mengikuti pautan ke laman yang belum wujud.\nUntuk mencipta laman ini, sila taip dalam kotak di bawah\n(lihat [$1 laman bantuan] untuk maklumat lanjut).\nJika anda tiba di sini secara tak sengaja, hanya klik butang '''back''' pada pelayar anda.",
        "anontalkpagetext": "<em>Ini ialah laman perbincangan bagi pengguna tanpa nama yang belum membuka akaun atau tidak menggunakannya.</em>\nOleh itu, kami terpaksa menggunakan alamat IP angka untuk mengenal pasti pengguna tersebut. Alamat IP ini boleh dikongsi oleh ramai pengguna.\nSekiranya anda ialah seorang pengguna tanpa nama dan berasa bahawa komen yang tidak relevan telah ditujukan kepada anda, sila [[Special:CreateAccount|buka akaun baru]] atau [[Special:UserLogin|log masuk]] untuk mengelakkan sebarang kekeliruan dengan pengguna tanpa nama yang lain.",
-       "noarticletext": "Laman ini buat masa sekarang tidak berteks. Anda boleh [[Special:Search/{{PAGENAME}}|cari tajuk bagi laman ini]] dalam laman-laman lain, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cari log-log yang berkaitan], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} sunting laman ini]</span>.",
+       "noarticletext": "Laman ini tiada teks buat masa sekarang.\nAnda boleh [[Special:Search/{{PAGENAME}}|cari tajuk bagi laman ini]] di laman-laman lain, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cari log-log yang berkaitan], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} sunting laman ini]</span>.",
        "noarticletext-nopermission": "Tiada teks dalam laman ini ketika ini.\nAnda boleh [[Special:Search/{{PAGENAME}}|mencari tajuk laman ini]] dalam laman lain,\natau <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log yang berkaitan]</span>.",
        "missing-revision": "Semakan #$1 pada halaman \"{{FULLPAGENAME}}\" tidak wujud.\n\nHal ini biasanya disebabkan oleh pautan sejarah yang lapuk ke halaman yang sudah dihapuskan.\nButirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "userpage-userdoesnotexist": "Akaun pengguna \"<nowiki>$1</nowiki>\" tidak berdaftar. Sila pastikan sama ada anda mahu mencipta/menyunting laman ini.",
        "postedit-confirmation-created": "Halaman telah diwujudkan.",
        "postedit-confirmation-restored": "Halaman telah dipulihkan.",
        "postedit-confirmation-saved": "Suntingan anda telah disimpan.",
+       "postedit-confirmation-published": "Suntingan anda telah disiarkan.",
        "edit-already-exists": "Tidak dapat mencipta laman baru kerana ia telah wujud.",
        "defaultmessagetext": "Teks mesej asal",
        "content-failed-to-parse": "Kandungan $2 tidak dapat dihuraikan untuk model $1: $3",
        "invalid-content-data": "Data kandungan tidak sah",
        "content-not-allowed-here": "Kandungan \"$1\" tidak dibenarkan di halaman [[$2]]",
        "editwarning-warning": "Meninggalkan laman ini mungkin akan menyebabkan sebarang perubahan yang telah anda lakukan hilang.\nJika anda sudah log masuk, anda boleh melumpuhkan amaran ini di bahagian \"{{int:prefs-editing}}\" dalam keutamaan anda.",
+       "editpage-invalidcontentmodel-title": "Model kandungan tidak disokong",
+       "editpage-invalidcontentmodel-text": "Model kandungan \"$1\" tidak disokong.",
        "editpage-notsupportedcontentformat-title": "Format kandungan tidak disokong",
        "editpage-notsupportedcontentformat-text": "Format kandungan $1 tidak disokong oleh model kandungan $2.",
        "content-model-wikitext": "wikiteks",
        "mergehistory-empty": "Tiada semakan yang boleh digabungkan",
        "mergehistory-done": "$3 semakan bagi $1 telah digabungkan ke dalam [[:$2]].",
        "mergehistory-fail": "Gagal melaksanakan penggabungan sejarah, sila semak semula laman tersebut dan parameter waktu.",
+       "mergehistory-fail-bad-timestamp": "Cap masa tidak sah.",
+       "mergehistory-fail-invalid-source": "Halaman asal tidak sah.",
+       "mergehistory-fail-invalid-dest": "Halaman tujuan tidak sah.",
        "mergehistory-fail-toobig": "Tidak dapat melakukan gabungan sejarah sebab lebih daripada had $1 semakan perlu dipindahkan.",
        "mergehistory-no-source": "Laman sumber $1 tidak wujud.",
        "mergehistory-no-destination": "Laman destinasi $1 tidak wujud.",
        "searchprofile-advanced-tooltip": "Cari dalam ruang nama yang tersuai",
        "search-result-size": "$1 ({{PLURAL:$2|$2 patah perkataan}})",
        "search-result-category-size": "$1 {{PLURAL:$1|ahli|ahli}} ($2 {{PLURAL:$2|subkategori|subkategori}}, $3 {{PLURAL:$3|fail|fail}})",
-       "search-redirect": "(pelencongan $1)",
+       "search-redirect": "(lencongan dari $1)",
        "search-section": "(bahagian $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(sepadan dengan kandungan fail)",
        "search-interwiki-caption": "Hasil dari projek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(lagi)",
+       "search-interwiki-more-results": "hasil-hasil selanjutnya",
        "search-relatedarticle": "Berkaitan",
        "searchrelated": "berkaitan",
        "searchall": "semua",
        "username": "{{GENDER:$1|Nama pengguna}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ahli}} {{PLURAL:$1|kumpulan|kumpulan-kumpulan}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (hingga $2)",
        "prefs-registration": "Waktu pendaftaran:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Nama sebenar:",
        "grant-editmywatchlist": "Sunting senarai pantau anda",
        "grant-editpage": "Sunting laman sedia ada",
        "grant-editprotected": "Sunting laman yang dilindungi",
+       "grant-uploadfile": "Muat naik fail baru",
+       "grant-basic": "Hak-hak asas",
        "newuserlogpage": "Log akaun baru",
        "newuserlogpagetext": "Yang berikut ialah log penciptaan pengguna.",
        "rightslog": "Log hak pengguna",
        "rcfilters-other-review-tools": "Alat semakan lain",
        "rcfilters-activefilters": "Penapis yang aktif",
        "rcfilters-savedqueries-defaultlabel": "Penapis yang disimpan",
+       "rcfilters-savedqueries-setdefault": "Tetapkan sebagai asali",
+       "rcfilters-savedqueries-unsetdefault": "Gugurkan sebagai asali",
+       "rcfilters-savedqueries-remove": "Gugurkan",
+       "rcfilters-savedqueries-new-name-label": "Nama",
        "rcfilters-savedqueries-add-new-title": "Simpan tetapan penapis terkini",
        "rcfilters-filter-humans-label": "Manusia (bukan bot)",
        "rcfilters-filter-pageedits-label": "Suntingan laman",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 pemantau]",
-       "rc_categories": "Hadkan kepada kategori (asingkan dengan \"|\")",
-       "rc_categories_any": "Mana-mana yang terpilih",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 bait selepas perubahan",
        "newsectionsummary": "/* $1 */ bahagian baru",
index 5202c2e..55f3314 100644 (file)
        "newpageletter": "Ġ",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[osservat minn {{PLURAL:$1|$1 utent|$1 utent}}]",
-       "rc_categories": "Illimita għall-kategoriji (issepara b' \"|\")",
-       "rc_categories_any": "Kwalunkwe",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} wara l-modifika",
        "newsectionsummary": "/* $1 */ sezzjoni ġdida",
        "rc-enhanced-expand": "Uri d-dettalji",
index 6729c10..8571dbd 100644 (file)
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
-       "rc_categories_any": "Qualquiera de ls scolhidos",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} açpuis las altaraçones",
        "newsectionsummary": "/* $1 */ nuobo cacho",
        "rc-enhanced-expand": "Amostrar detailhes",
index e78a52f..2a2b710 100644 (file)
        "newpageletter": "အသစ်",
        "boteditletter": "ဘော့",
        "number_of_watching_users_pageview": "[စောင့်ကြည့်နေသော အသုံးပြုသူ $1 {{PLURAL:$1|ဦး|ဦး}}]",
-       "rc_categories": "ကဏ္ဍများအား ကန့်သတ်ရန် (\"|\" ဖြင့် ခွဲခြား):",
-       "rc_categories_any": "ရွေးချယ်ခံရသော မည်သူမဆို",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ပြောင်းလဲပြီးနောက်",
        "newsectionsummary": "/* $1 */ အပိုင်းသစ်",
        "rc-enhanced-expand": "အသေးစိတ် ပြရန်",
index 1484dc9..a13b456 100644 (file)
        "recentchanges-label-minor": "Те а покшкэ витнемась-петнемась",
        "recentchanges-label-bot": "Те витнеманть-петнеманть теизе кона-кона бот",
        "recentchanges-label-unpatrolled": "",
+       "recentchanges-legend-heading": "<strong>Чарькодевтема:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вантаять [[Special:NewPages|од лопань лемрисьме]])",
        "rcnotefrom": "Ало максозь {{PLURAL:$5|лиякстомтомась, конась|лиякстомтоматне, конатне}} теезь <strong>$3, $4</strong> шкасто саезь (весемеде ламо невтезь <strong>$1</strong>).",
        "rclistfrom": "Невтемс од витьнематнень $3 $2-нть эйстэ саезь.",
        "minoreditletter": "а",
        "newpageletter": "О",
        "boteditletter": "б",
-       "rc_categories_any": "Кочказетнень эйстэ кодамо-понгсь",
        "rc-change-size-new": "Полавтнемадонть мейле {{PLURAL:$1|байттнэде}}: $1",
        "newsectionsummary": "/* $1 */ од пелькс",
        "rc-enhanced-expand": "Невтемс седе ламо тень ланга",
        "recentchangeslinked-feed": "Сюлмавозь лиякстоматне",
        "recentchangeslinked-toolbox": "Сюлмавозь лиякстоматне",
        "recentchangeslinked-title": "Полавтнемат-лиякстомтомат конат кандовить теватезэнь \"$1\"",
-       "recentchangeslinked-summary": "ТеÑ\81Ñ\8d Ð¼Ð°ÐºÑ\81озÑ\8c Ð¼ÐµÐµÐ»Ñ\8cÑ\81е Ñ\88канÑ\8c Ð²Ð¸Ñ\82немаÑ\82-пеÑ\82немаÑ\82, ÐºÐ¾Ð½Ð°Ñ\82 Ñ\82еезелÑ\8cÑ\82Ñ\8c Ð±Ð°Ñ\88ка Ð¼Ð°ÐºÑ\81озÑ\8c Ð»Ð¾Ð¿Ð° Ð²ÐµÐ»Ñ\8cде (Ñ\8dли ÐºÐ°Ñ\82егоÑ\80иÑ\8fÑ\81 Ñ\81овавÑ\82овиÑ\86Ñ\8f Ñ\82евнеÑ\81). Ð\92анома Ð»Ð¾Ð¿Ð°Ñ\81оÑ\82 Ð»Ð¾Ð¿Ð°Ñ\82не Ð¼Ð°ÐºÑ\81озÑ\8c '''Ñ\8dÑ\87кÑ\81Ñ\82Ñ\8d Ñ\82еÑ\88Ñ\82езÑ\8c'''",
+       "recentchangeslinked-summary": "Ули Ð¼ÐµÐ»ÐµÑ\82Ñ\8c Ð½ÐµÐµÐ¼Ñ\81 Ð¿Ð¾Ð»Ð°Ð²Ñ\82немаÑ\82, ÐºÐ¾Ð½Ð°Ñ\82 Ñ\82еезÑ\8c ÐºÐ¾Ð´Ð°Ð¼Ð¾Ñ\8fк Ð»Ð¾Ð¿Ð°Ñ\81 Ñ\81Ñ\8eлмазÑ\8c Ð»Ð¾Ð¿Ð°Ñ\82неÑ\81, Ñ\81Ñ\91Ñ\80мадÑ\82 Ð»Ð¾Ð¿Ð°Ð½Ñ\82Ñ\8c Ð»ÐµÐ¼ÐµÐ½Ð·Ñ\8d. (Ули Ð¼ÐµÐ»ÐµÑ\82Ñ\8c Ð½ÐµÐµÐ¼Ñ\81 ÐºÐ°Ñ\82егоÑ\80иÑ\8fÑ\81 Ñ\81овавÑ\82овиÑ\86Ñ\8fÑ\82, Ñ\81Ñ\91Ñ\80мадÑ\82 Ð\9aаÑ\82егоÑ\80иÑ\8f:\"Ð\9aаÑ\82егоÑ\80иÑ\8fнÑ\82Ñ\8c Ð»ÐµÐ¼ÐµÐ½Ð·Ñ\8d\".) Ð\9bопаÑ\82неÑ\81 Ñ\82еезÑ\8c Ð²Ð¸Ñ\82немаÑ\82-пеÑ\82немаÑ\82 Ñ\82еÑ\88кÑ\81Ñ\82авиÑ\82Ñ\8c [[Special:Watchlist|Ð\92анома Ð»Ð¾Ð¿Ð°Ñ\81оÑ\82]] <strong>Ñ\8dÑ\87кÑ\81Ñ\82Ñ\8d</strong>",
        "recentchangeslinked-page": "Лопанть лемезэ:",
        "recentchangeslinked-to": "Тень таркас невтить те лопанть марто сюлмазь лопатнесэ полавтнематнень",
        "upload": "Ёкстамс файла",
        "tooltip-t-recentchangeslinked": "Чияконь полавтнемат сеть лопатнесэ, конат сюлмазь те лопанть марто",
        "tooltip-feed-rss": "\"RSS\" чидикерькске те лопантень",
        "tooltip-feed-atom": "Атом лезкс те лопантень",
-       "tooltip-t-contributions": "Ð\92аÑ\80Ñ\88Ñ\82Ñ\8bк Ð¿Ñ\83Ñ\82овкÑ\81 Ð¿Ð¾Ñ\82монÑ\82Ñ\8c Ñ\82е Ñ\82еиÑ\86Ñ\8fнÑ\82ь",
+       "tooltip-t-contributions": "Ð\9dевÑ\82Ñ\82Ñ\8c Ð¼ÐµÐ·Ðµ {{GENDER:$1|Ñ\82е Ñ\82еиÑ\86Ñ\8fÑ\81Ñ\8c}} Ð¿Ð¾Ð»Ð°Ð²Ñ\82Ñ\81ь",
        "tooltip-t-emailuser": "Те теицянтень кучомс е-сёрма",
        "tooltip-t-upload": "Йовкстамс файлат",
        "tooltip-t-specialpages": "Башка тевень лопатне мельга-мельцек",
        "exif-software": "Тевс нолдазь программатне",
        "exif-artist": "Теицязо",
        "exif-copyright": "Копия теемань видечинь кирдицясь",
+       "exif-exifversion": "Exif версиясь",
        "exif-colorspace": "Тюс ютко",
        "exif-pixelxdimension": "Артовксонть келезэ",
        "exif-pixelydimension": "Артовксонть сэрезэ",
        "exif-usercomment": "Теицянь мельть-арьсемат",
+       "exif-datetimedigitized": "Цифракстомтомань чись ды шкась",
        "exif-exposuretime": "Валдомтомань (Экспозициянь) шка",
        "exif-fnumber": "Диафрагмань числась",
        "exif-brightnessvalue": "APEX-нть валдоксчизэ",
        "feedback-close": "Анок",
        "feedback-message": "Пачтямнэсь:",
        "feedback-subject": "Мезде:",
-       "searchsuggest-search": "Вешнемс",
+       "searchsuggest-search": "Вешнемс вана тестэ {{SITENAME}}",
        "api-error-unknownerror": "Апак содань ильведевкс: «$1».",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секундат}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минутат}}",
index 7776556..19efe88 100644 (file)
        "newpageletter": "Y",
        "boteditletter": "T",
        "number_of_watching_users_pageview": "[$1 tlatequitiltilīlli {{PLURAL:$1|tlachiya|tlachiyah}}]",
-       "rc_categories_any": "Zāzo in tlaihittalli",
        "newsectionsummary": "Yancuīc tlahtōltzintli: /* $1 */",
        "recentchangeslinked": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan",
index 82c49f0..66a71d2 100644 (file)
@@ -9,7 +9,8 @@
                        "Luuva",
                        "Macofe",
                        "進也",
-                       "Liuxinyu970226"
+                       "Liuxinyu970226",
+                       "Yoxem"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sûn:",
        "pool-timeout": "Chhiau-koè só-tēng ê sî-kan",
        "pool-queuefull": "Tūi-lia̍t pâi moá ah",
        "pool-errorunknown": "M̄-chai siáⁿ chhò-gō͘",
-       "pool-servererror": "無提供系統服務總數的統計。",
+       "pool-servererror": "Bô thê-kiong hē-thóng ho̍k-bū chóng-sò͘--ê thóng-kè ($1).",
        "poolcounter-usage-error": "Ēng-hoat chhò-gō͘: $1",
        "aboutsite": "Koan-hē {{SITENAME}}",
        "aboutpage": "Project:Koan-hē",
        "collapsible-expand": "Hiàn",
        "confirmable-confirm": "{{GENDER:$1|你}}敢確定唅?",
        "confirmable-yes": "著啦",
-       "confirmable-no": "無啦!毋是!",
+       "confirmable-no": "Bô--lah!",
        "thisisdeleted": "Khoàⁿ a̍h-sī kiù $1?",
        "viewdeleted": "Beh khoàⁿ $1?",
        "restorelink": "{{PLURAL:$1|chi̍t ê thâi-tiàu ê pian-chi̍p|$1 thâi-tiàu ê pian-chi̍p}}",
        "formerror": "Chhò-gō·: bô-hoat-tō· kā pió sàng chhut khì.",
        "badarticleerror": "Bē-tàng tiàm chit ia̍h chip-hêng chit ê tōng-chok.",
        "cannotdelete": "Bô-hoat-tō· kā hit ê ia̍h a̍h-sī iáⁿ-siōng 「$1」 thâi tiāu. (Khó-lêng pa̍t-lâng í-keng kā thâi tiāu ah.)",
-       "cannotdelete-title": "無法度共\"$1\"這頁刣掉。",
+       "cannotdelete-title": "Bô-hoat-tō͘ kā \"$1\" chit ia̍h thâi-tiāu.",
        "delete-hook-aborted": "有設定阻擋刣掉的動作。\n毋閣無其他的解說。",
        "no-null-revision": "袂當予\"$1\"產生一个空的修訂本。",
        "badtitle": "M̄-chiâⁿ piau-tê",
        "namespaceprotected": "Lí bô khoân-lī kái '''$1'''  miâ-khong-kan ê ia̍h",
        "customcssprotected": "你無受權去改這个 CSS頁,因為這个頁有包括別个用者的個人設定。",
        "customjsprotected": "你無授權去改這个JavaScript頁,因為這个頁包括別个用者的個人設定。",
-       "mycustomcssprotected": "你無授權去改這个CSS頁。",
-       "mycustomjsprotected": "你無授權去改這个JavaScript頁。",
-       "myprivateinfoprotected": "你無授權改你家己的私人資訊。",
-       "mypreferencesprotected": "你無授權改你的家己的喜愛設定。",
+       "mycustomcssprotected": "Lí bô hí-khó lâi kái chit ê CSS ia̍h.",
+       "mycustomjsprotected": "Lí bô hí-khó lâi kái chit ê Javascript ia̍h.",
+       "myprivateinfoprotected": "Lí bô hí-khó lâi kái lí ka-tī--ê su-jîn chu-sìn.",
+       "mypreferencesprotected": "Lí bô hí-khó kái ka-kī--ê iōng-chiá siat-tēng.",
        "ns-specialprotected": "特殊頁袂得改。",
        "titleprotected": "這个標題已經予[[User:$1|$1]]保護起來,袂得提來用。\n原因是 <em>$2</em>。",
        "filereadonlyerror": "因為檔案庫這馬只會使看,所以袂得改 \"$1\"這个檔案。\n鎖檔案庫的管理員講是因為:\"$3\"。",
        "invalidtitle-knownnamespace": "佇名空間 \"$2\"佮文字\"$3\"的標題袂使得。",
        "invalidtitle-unknownnamespace": "名空間編號 $1(毋知名)的\"$2\"文字標題袂使用。",
        "exception-nologin": "Bô teng-ji̍p",
-       "exception-nologin-text": "請先登入,才有法度看這頁抑對這頁做動作。",
-       "exception-nologin-text-manual": "請先$1,才有法度看這頁抑對這頁做動作。",
+       "exception-nologin-text": "Chhiáⁿ seng teng-ji̍p, chiah ū hoat-tō͘ khoàⁿ chit ia̍h iah tùi chit ia̍h chò tōng-chok.",
+       "exception-nologin-text-manual": "Chhiáⁿ seng $1, chiah ū hoat-tō͘ khoàⁿ chit ia̍h iah tùi chit ia̍h chò tōng-chok.",
        "virus-badscanner": "設定毋著:你的病毒掃描程式阮毋知:<em>$1</em>",
-       "virus-scanfailed": "掃病毒無成功(代碼$1)",
+       "virus-scanfailed": "Sáu pēⁿ-to̍k bô sêng-kong (tāi-bé: $1)",
        "virus-unknownscanner": "M̄-chai siáⁿ pēⁿ-to̍k:",
        "logouttext": "'''Lí í-keng teng-chhut.'''\nChhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iáu teng-ji̍p tī leh; che chi-iàu piàⁿ tiāu liû-lám-khì ê khoài-chhú-khu, tiō ē chèng-siông.",
        "welcomeuser": "Hoan-gêng, $1!",
        "badretype": "Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.",
        "userexists": "Lí phah ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ lí iōng pa̍t-ê miâ.",
        "loginerror": "Teng-ji̍p chhò-gō·",
-       "createacct-error": "開口座無成功",
+       "createacct-error": "Khui kháu-chō bô sêng-kong",
        "createaccounterror": "Bô hoat-tō͘ khui kháu-chō: $1",
        "nocookiesnew": "Lí--ê iōng-chiá kháu-chō í-keng khui hó--ah, m̄-koh lí iáu-boē teng-ji̍p.\n{{SITENAME}} ū sái Cookies choè kì-lio̍k teng-ji̍p--ê iōng-chiá.\nLí bô ín-chún iōng Cookies, chhiáⁿ lí seng kā chó͘-tòng the̍h tiāu, chiah koh iōng lí--ê iōng-chiá-miâ kap bi̍t-bé teng-ji̍p.",
        "nocookieslogin": "{{SITENAME}}有用cookies做記錄用者,毋過你無允準用cookies,等你改做會當了後,才閣試。",
-       "nocookiesfornew": "因為不明的原因,阮無法度建立用者的口座。\n請先確定你的cookie會使用,閣重進入這頁,閣試一擺。",
+       "nocookiesfornew": "In-ūi put-bêng--ê goân-in, gún bô-hoat-tō͘ kiàn-li̍p iōng-chiá--ê kháu-chō. Chhiáⁿ seng khak-tēng lí--ê cookie ē-tàng ēng, têng chìn-ji̍p chit ia̍h, koh chhì chi̍t pái.",
        "noname": "Lí phah--ê iōng-chiá-miâ boē-sái.",
        "loginsuccesstitle": "Teng-ji̍p sêng-kong",
        "loginsuccess": "Lí hiān-chhú-sî í-keng teng-ji̍p {{SITENAME}} chò \"$1\".",
        "anonpreviewwarning": "<em>Lí bô teng-ji̍p. Nā-sī lí beh pó-chûn, lí--ê IP ūi-chí ē kì-lo̍k tī i--ê siu-kái le̍k-sú lāi-bīn.</em>",
        "summary-preview": "Khài-iàu ê preview:",
        "subject-preview": "Ū-lám tê-bo̍k/piau-tê:",
-       "blockednoreason": "無寫理由",
+       "blockednoreason": "bô siá lí-iû",
        "whitelistedittext": "Lí ài $1 chiah ē-sái siu-kái.",
        "nosuchsectiontitle": "Chhoé bô toān-lo̍h",
        "loginreqtitle": "Su-iàu Teng-ji̍p",
        "histfirst": "Tùi thâu-chêng",
        "histlast": "Tùi āu-piah",
        "history-feed-item-nocomment": "$1 tī $2",
-       "revdel-restore": "改會當看無",
+       "revdel-restore": "kái ē-tàng khoàⁿ--bô",
        "revertmerge": "取消合併",
        "history-title": "\"$1\"--ê le̍k-sú pán-pún",
        "difference-title": "\"$1\" pán-pún chi-kan bô-kāng--ê tē-hng",
        "search-section": "(toān-lo̍h $1)",
        "searchall": "choân-pō·",
        "showingresults": "Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$1</b> hāng kiat-kó.",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ê kiat-kó <strong>$1</strong>|<strong>$3</strong> ê kiat-kó <strong>$1 – $2</strong>}}",
        "search-nonefound": "Chhoē m̄ tio̍h",
        "powersearch-legend": "Kiám-sek",
        "preferences": "Siat-tēng",
        "recentchanges-label-newpage": "Chit ê siu-kái ē sán-seng sin ia̍h",
        "recentchanges-label-minor": "Che sī sió siu-kái",
        "recentchanges-label-bot": "Che sī ki-khì-lâng kái--ê",
-       "recentchanges-label-unpatrolled": "這个編輯抑無巡視過",
+       "recentchanges-label-unpatrolled": "Chit ê pian-chi̍p iah bô sûn--koè.",
        "recentchanges-label-plusminus": "Hit ia̍h kái liáu; cheng-chha ê ūi-goân-cho͘",
        "recentchanges-legend-heading": "<strong>Ké-soeh:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁清單]])",
        "recentchangeslinked-title": "kap \"$1\" siong-koan ê kái-piàn",
        "recentchangeslinked-summary": "這是有相接到指定頁(抑是指定分類的所有成員),而且最近家己頁的內容有改過的清單。\n遐的頁[[Special:Watchlist|佇你的監視清單]]會用<strong>粗體</strong> 標示。",
        "recentchangeslinked-page": "Ia̍h ê miâ:",
+       "recentchangeslinked-to": "Ōaⁿ chò tián-sī liân kòe chí-tēng ia̍h-bīn ê ia̍h-bīn ê kái-piàn",
        "upload": "Kā tóng-àn chiūⁿ-bāng",
        "uploadbtn": "Kā tóng-àn chiūⁿ-bāng",
        "reuploaddesc": "Tò khì sàng-chiūⁿ-bāng ê pió.",
        "metadata-fields": "佇顯示圖片的頁,若掀開元資料,下跤的EXIF資料會儂看著。其他的元資料是先看無。\n* 廠商\n* 機型\n* 翕像的時陣\n* 曝光\n* 光圈\n* ISO 速率\n* 焦距\n* 作者\n* 版權\n* 說明\n* 緯度(GPS)\n* 經度(GPS)\n* 海拔(GPS)",
        "exif-xresolution": "Chúi-pêⁿ kái-siōng-tō͘",
        "exif-yresolution": "Sûi-ti̍t kái-siōng-tō͘",
+       "exif-datetime": "Tóng-àn kái-piàn ê ji̍t-chí kap sî-kan",
        "exif-software": "Sú-iōng ê nńg-thé",
        "exif-colorspace": "Sek-chhái khong-kan",
        "namespacesall": "choân-pō·",
index 61e4403..d8cd8f6 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[osservata 'a {{PLURAL:$1|n'utente|$1 utente}}]",
-       "rc_categories": "Lemmeta a 'e categurìe (spartute 'a \"|\"):",
-       "rc_categories_any": "Qualunque d' 'e scigliute",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} aropp'ô cagnamiento",
        "newsectionsummary": "/* $1 */ sezziona nnova",
        "rc-enhanced-expand": "Fa vede dettaglie",
index e399720..276c072 100644 (file)
        "postedit-confirmation-created": "Siden har blitt opprettet.",
        "postedit-confirmation-restored": "Siden har blitt gjenopprettet.",
        "postedit-confirmation-saved": "Redigeringen din ble lagret.",
+       "postedit-confirmation-published": "Endringen din ble publisert.",
        "edit-already-exists": "Kunne ikke opprette ny side fordi den finnes fra før.",
        "defaultmessagetext": "Standard meldingstekst",
        "content-failed-to-parse": "Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]",
-       "rc_categories": "Begrens til kategorier (skilletegn: «|»)",
-       "rc_categories_any": "Alle",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} etter endring",
        "newsectionsummary": "/* $1 */ ny seksjon",
        "rc-enhanced-expand": "Vis detaljer",
        "rollback-success": "Tilbakestilte endringer av {{GENDER:$3|$1}}; endret til siste versjon av {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Tilbakestilte endringer av $1;\nendret tilbake til siste revisjon av $2. [$3 Vis endringer]",
        "sessionfailure-title": "Sesjonsfeil",
-       "sessionfailure": "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
+       "sessionfailure": "Det ser ut til å være et problem med innloggingen din, og handlingen ble avbrutt av sikkerhetshensyn. Vennlgist prøv å sende skjemaet en gang til.",
        "changecontentmodel": "Endre innholdsmodell for en side",
        "changecontentmodel-legend": "Endre innholdsmodell",
        "changecontentmodel-title-label": "Sidetittel",
        "watchlistedit-clear-titles": "Titler:",
        "watchlistedit-clear-submit": "Rensk overvåkningslisten (dette er permanent!)",
        "watchlistedit-clear-done": "Overvåkningslisten din har blitt rensket.",
+       "watchlistedit-clear-jobqueue": "Overvåkningslisten din tømmes. Dette kan ta tid!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Én tittel|$1 titler}} ble fjernet:",
        "watchlistedit-too-many": "Det er for mange sider til å vise dem her.",
        "watchlisttools-clear": "Rensk overvåkningslisten",
index a3c2e33..b621163 100644 (file)
        "printableversion": "Aofdrokbaore versie",
        "permalink": "Vaste verwiezing",
        "print": "Aofdrokken",
-       "view": "Lezen",
+       "view": "Leasen",
        "view-foreign": "Bekieken op $1",
        "edit": "Bewarken",
        "edit-local": "Lokale beschrieving bewarken",
        "talkpagelinktext": "Overleg",
        "specialpage": "Spesiale zied",
        "personaltools": "Persoonlike instellingen",
-       "talk": "Overleg",
+       "talk": "Oaverleg",
        "views": "Weergaven",
        "toolbox": "Hulpmiddels",
        "imagepage": "Bestaandszied bekieken",
        "nstab-template": "Mal",
        "nstab-help": "Hulpe",
        "nstab-category": "Kategorie",
-       "mainpage-nstab": "Veurblad",
+       "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",
        "boteditletter": "B",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op n volglieste]",
-       "rc_categories": "Beparking tot kategorieën (scheien mit \"|\")",
-       "rc_categories_any": "alles",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nao de wieziging",
        "newsectionsummary": "Niej onderwarp: /* $1 */",
        "rc-enhanced-expand": "Details bekieken",
        "feedback-subject": "Onderwarp:",
        "feedback-submit": "Opslaon",
        "feedback-thanks": "Bedankt! Joew kommentaar is op de zied \"[$2 $1]\" ezet.",
-       "searchsuggest-search": "{{SITENAME}} deurzeuken",
+       "searchsuggest-search": "{{SITENAME}} döärsöken",
        "searchsuggest-containing": "bevat...",
        "api-error-badtoken": "Interne fout: t token klopt niet.",
        "api-error-emptypage": "Je maggen gien lege nieje ziejen anmaken.",
index 19a85d0..e71366a 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|Een Bruker|$1 Brukers}}, de oppasst]",
-       "rc_categories": "Blot Sieden ut de Kategorien (trennt mit „|“):",
-       "rc_categories_any": "All",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} achter Ännern",
        "newsectionsummary": "/* $1 */ nee Afsnitt",
        "rc-enhanced-expand": "Details wiesen (bruukt JavaScript)",
index c922fa3..3a53657 100644 (file)
        "viewyourtext": "यस पृष्ठमा रहेका '''तपाईंका सम्पादनहरू''' हेर्न या प्रतिलिपी गर्न सक्नुहुन्छ :",
        "protectedinterface": "यो पृष्ठले सफ्टवेयरको लागि अन्तरमोहडा पाठ प्रदान गर्दछ , र यसलाई दुरुपयोग हुनबाट बचाउन सुरक्षा प्रादन गरिएको छ।\nसम्पूर्ण विकिहरूका लागि अनुवादमा परिवर्तन गर्नको लागि [https://translatewiki.net/ translatewiki.net], प्रयोग गर्नुहोस् ,  मिडियाविकि स्थानियकरण परियोजना ।",
        "editinginterface": "<strong>चेतावनी:</strong> तपाईं यस पृष्ठलाई सम्पादन गर्नुहुँदैछ, जसले सफ्टवेयरको लागि \nइन्टरफेस सामग्रीहरू प्रदान गर्दछ।\nयस पृष्ठमा गरिएकोपरिवर्तनले यस विकिमा अरु प्रयोगकर्ताको इन्टरफेसको प्रदर्शनमा प्रभाव पार्नेछ ।",
-       "translateinterface": "सबà¥\88 à¤µà¤¿à¤\95िहरà¥\82à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤\85नà¥\81वाद à¤\9cà¥\8bडà¥\8dन à¤µà¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¤\95ा à¤²à¤¾à¤\97ि à¤®à¥\80डियाविà¤\95ि à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80यà¤\95रण à¤ªà¤°à¤¿à¤¯à¥\8bà¤\9cना [https://translatewiki.net/ à¤\9fà¥\8dरानà¥\8dसलà¥\87à¤\9fविà¤\95ि.नà¥\87à¤\9f]को प्रयोग गर्नुहोस।",
+       "translateinterface": "सबà¥\88 à¤µà¤¿à¤\95िहरà¥\82à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\85नà¥\81वाद à¤\9cà¥\8bडà¥\8dन à¤µà¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¤\95ा à¤²à¤¾à¤\97ि à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95à¥\80 à¤¸à¥\8dथानियà¤\95रण à¤ªà¤°à¤¿à¤¯à¥\8bà¤\9cना [https://translatewiki.net/ translatewiki.net]को प्रयोग गर्नुहोस।",
        "cascadeprotected": "यो पृष्ठ सम्पादन गर्नबाट सुरक्षित गरिएकोछ किनभनें {{PLURAL:$1|पृष्ठ |पृष्ठहरू}}मा सुरक्षित गर्नुका साथै प्रपात (\"cascading\") विकल्प खुल्ला राखिएको छ:\n$2",
        "namespaceprotected": " '''$1'''  नेमस्पेसमा रहेका पृष्ठहरू सम्पादन गर्ने अनुमति यहाँलाई छैन ।",
        "customcssprotected": "तपाईंलाई यो  पृष्ठ सम्पादन गर्ने अनुमति छैन, किनकी यसमा कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
        "invalidtitle-knownnamespace": "नेमस्पेस \"$2\" तथा अक्षर \"$3\" सहितको अवैश शिर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नेमस्पेस अंक $1 तथा अक्षर \"$2\" भएको अवैध शिर्षक",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
-       "exception-nologin-text": "यस à¤ªà¥\83षà¥\8dठमा à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dन à¤µà¤¾ à¤\95à¥\81नà¥\88 à¤\95ारà¥\8dय à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤\95à¥\83पया à¤ªà¥\8dरवà¥\87श (लà¤\97 à¤\87न) à¤\97रà¥\8dनà¥\81 होस् ।",
-       "exception-nologin-text-manual": "यस à¤ªà¥\83षà¥\8dठमा à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dन à¤µà¤¾ à¤\95à¥\81नà¥\88 à¤\95ारà¥\8dय à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 कृपया $1 गर्नु होस् ।",
+       "exception-nologin-text": "यस à¤ªà¥\83षà¥\8dठमा à¤\9cान à¤µà¤¾ à¤\95à¥\81नà¥\88 à¤\95ारà¥\8dय à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\95à¥\83पया à¤ªà¥\8dरवà¥\87श (लà¤\97 à¤\87न) à¤\97रà¥\8dनà¥\81होस् ।",
+       "exception-nologin-text-manual": "यस à¤ªà¥\83षà¥\8dठमा à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dन à¤µà¤¾ à¤\95à¥\81नà¥\88 à¤\95ारà¥\8dय à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि कृपया $1 गर्नु होस् ।",
        "virus-badscanner": "खराव मिलान: अज्ञात भाइरस स्क्यानर :''$1''",
        "virus-scanfailed": "पढाइ असफल(कोड $1)",
        "virus-unknownscanner": "अज्ञात एन्टीभाइरस:",
        "resetpass-temp-emailed": "तपाईं अस्थाई इमेल कोडले प्रवेश गर्नुभएको छ।\nप्रवेश सफल पार्नका लागि, तपाईंले यहाँ एउटा नयाँ पासवर्ड राख्नु पर्नेछ:",
        "resetpass-temp-password": "अस्थाइ पासवर्ड",
        "resetpass-abort-generic": "एक्सटेन्सनले पासवर्ड परिवर्तनलाई बन्द गराएको छ ।",
-       "resetpass-expired": "तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¥\82रानà¥\8b à¤­à¤\8fà¤\95à¥\8bà¤\9b à¥¤ à¤\95à¥\83पया à¤ªà¥\8dरवà¥\87श (लà¤\97 à¤\87न) à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 नयाँ पासवर्ड राख्नुहोस् ।",
+       "resetpass-expired": "तपाà¤\88à¤\81à¤\95à¥\8b à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¥\82रानà¥\8b à¤­à¤\8fà¤\95à¥\8b à¤\9b à¥¤ à¤\95à¥\83पया à¤ªà¥\8dरवà¥\87श (लà¤\97 à¤\87न) à¤\95à¥\8b à¤²à¤¾à¤\97ि नयाँ पासवर्ड राख्नुहोस् ।",
        "resetpass-expired-soft": "तपाईंको पासवर्ड म्याद सकिएको छ र यसलाई रिसेट गर्नुपर्नेछ। कृपया एउटा नयाँ पासवर्ड छान्नुहोस् वा \"{{int:authprovider-resetpass-skip-label}}\"मा क्लिक गरी पछि रिसेट गर्नुहोला।",
        "resetpass-validity-soft": "तपाईंको पासवर्ड मान्य छैन:$1\n\nकृपया नयाँ पासवर्ड छान्नुहोस् वा \"{{int:authprovider-resetpass-skip-label}}\"मा क्लिक गरी पछि रिसेट गर्नुहोला।",
        "passwordreset": "प्रवेशशव्द पुनः तय गर्ने",
        "cantcreateaccount-text": "IP ठेगाना ('''$1''')बाट खाता खोल्न  [[User:$3|$3]]द्वारा बन्देज लगाइएको छ।\n\n $3ले दिनुभएको कारण  ''$2'' हो",
        "cantcreateaccount-range-text": "<strong>$1</strong> को श्रेणीमा आउने आइपि ठेगानाबाट, जसमा तपाईंको आइपि ठेगाना (<strong>$4</strong>) सामेल छ, नयाँ खाता सृजना [[User:$3|$3]]द्वारा अवरोधित गरिएको छ। \n\n$3 द्वारा दिइएको कारण: \"$2\"",
        "viewpagelogs": "यस पृष्ठका लगहरू हेर्नुहोस्",
-       "nohistory": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 कुनै सम्पादन इतिहास छैन।",
+       "nohistory": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤²à¤¾à¤\97ि कुनै सम्पादन इतिहास छैन।",
        "currentrev": "हालको संस्करण",
        "currentrev-asof": "$1को रुपमा हालको पुनरावलोकनहरू",
        "revisionasof": "$1 जस्तै गरी पुनरावलोकन",
        "boteditletter": "बो",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 निगरानी गर्दै{{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ताहरु}}]",
-       "rc_categories": "श्रेणीहरूमा सीमित (\"|\" ले छुट्याउनुहोस्)",
-       "rc_categories_any": "छानिएका कुनै",
        "rc-change-size": "$1",
        "rc-change-size-new": "परिवर्तनपछि $1 {{PLURAL:$1|बाइट|बाइट}}",
        "newsectionsummary": "/* $1 */ नयाँ खण्ड",
        "backend-fail-stream": "फाइल ''$1'' प्रवाह गर्न सकिएन ।",
        "backend-fail-backup": "फाइल ''$1'' जगेडा संग्रह गर्न सकिएन ।",
        "backend-fail-notexists": "फाइल $1 पृष्ठ अस्तित्वमा छैन ।",
-       "backend-fail-hashes": "तà¥\81लनाà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 फाइल ह्यासेस्हरू भेटाउन सकिएन ।",
+       "backend-fail-hashes": "तà¥\81लनाà¤\95à¥\8b à¤²à¤¾à¤\97ि फाइल ह्यासेस्हरू भेटाउन सकिएन ।",
        "backend-fail-notsame": "अमिल्दो फाइल पहिला देखिनै \"$1\" मा अवस्थित रहेको छ ।",
        "backend-fail-invalidpath": "\"$1\" वैध भण्डारण पथ होइन।",
        "backend-fail-delete": " $1 फाइल मेट्न सकिएन ।",
        "filejournal-fail-dbquery": "भण्डारण ब्याकएन्ड \"$1\" लाई जर्नल डेटाबेससँग अपडेट गर्न सकिएन।",
        "lockmanager-notlocked": "\"$1\" लाई खुला गर्न सकिएन; यो बन्द छैन् ।",
        "lockmanager-fail-closelock": "\"$1\" को लागि फाइललाई बन्द गर्न सकिएन।",
-       "lockmanager-fail-deletelock": "\"$1\" à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 बन्द फाइललाई मेटाउन सकिएन ।",
-       "lockmanager-fail-acquirelock": "\"$1\" à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 बन्द फाइललाई प्राप्त गर्न सकिएन ।",
+       "lockmanager-fail-deletelock": "\"$1\" à¤\95à¥\8b à¤²à¤¾à¤\97ि बन्द फाइललाई मेटाउन सकिएन ।",
+       "lockmanager-fail-acquirelock": "\"$1\" à¤\95à¥\8b à¤²à¤¾à¤\97ि बन्द फाइललाई प्राप्त गर्न सकिएन ।",
        "lockmanager-fail-openlock": "\"$1\" को लागी बन्द फाइललाई खोल्न सकिएन ।",
-       "lockmanager-fail-releaselock": "\"$1\" à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 बन्द खुल्ला गर्न सकिएन ।",
+       "lockmanager-fail-releaselock": "\"$1\" à¤\95à¥\8b à¤²à¤¾à¤\97ि बन्द खुल्ला गर्न सकिएन ।",
        "lockmanager-fail-db-bucket": "बकेट $1 मा आवश्यक संख्यामा बन्द डेटाबेससँग सम्पर्क हुन सकेन।",
        "lockmanager-fail-db-release": "डाटाबेस \"$1\" मा बन्दहरू खुल्ला गर्न सकिएन ।",
        "lockmanager-fail-svr-acquire": "सर्भर \"$1\" मा बन्दहरू प्राप्त गर्न सकिएन ।",
        "img-auth-isdir": "तपाईं डायरेक्टरी \"$1\" खोल्ने प्रयास गर्दैहुनुहुन्छ। मात्रै फाइल खोल्न सकिनेछ।",
        "img-auth-streaming": "\"$1\" बग्दै",
        "img-auth-public": "img_auth.php निजी विकिबाट फाइलहरू प्रदान गर्ने कार्य गर्दछ। यो विकि सार्वजनिक रुपले तयार गरिएको विकि हो। उचित सुरक्षाको लागि img_auth.php अक्षम छ।",
-       "img-auth-noread": "\"$1\" à¤ªà¤¢à¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 प्रयोगकर्तालाई अनुमति छैन् ।",
+       "img-auth-noread": "\"$1\" à¤ªà¤¢à¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि प्रयोगकर्तालाई अनुमति छैन् ।",
        "http-invalid-url": "अवैध URL: $1",
        "http-invalid-scheme": "\"$1\" देखि सुरू हुने युआरयल स्वीकार्य छैन।",
        "http-request-error": "एचटिटिपि अनुरोध अज्ञात त्रुटिको कारणले असफल रह्यो।",
        "unusedimagestext": "निम्न फाइलहरू छन्, तर कुनै पनि पृष्ठमा प्रयोग गरिएको छैन। कृपया ध्यान दें कि अन्य वेबसाइट एउटा सिधै लिङ्कको फाइलसँग जोड्न सकिन्छ, र सक्रिय उपयोगमा हुँदा पनि यहाँ देखाउन सकिन्छ।",
        "unusedcategoriestext": "तल श्रेणीका पृष्ठहरू उपलब्ध भएता पनि उक्त पृष्ठहरूलाई अन्य पृष्ठहरू तथा श्रेणीले प्रयोग गर्न सक्दैनन् ।",
        "notargettitle": "कुनैपनि निसाना(टारगेट) छैन",
-       "notargettext": "यà¥\8b à¤\95ारà¥\8dयà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82ले कुनै लक्षित पृष्ठ वा प्रयोगकर्ता निर्दिष्ट गर्नु भएको छैन ।",
+       "notargettext": "यà¥\8b à¤\95ारà¥\8dयà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\81ले कुनै लक्षित पृष्ठ वा प्रयोगकर्ता निर्दिष्ट गर्नु भएको छैन ।",
        "nopagetitle": "त्यस्तो गन्तव्या पृष्ठ भेटिएन",
        "nopagetext": "तपाईंले खुलाउनु भएको गन्तव्य पृष्ठ अस्तित्वमा  छैन।",
        "pager-newer-n": "{{PLURAL:$1|नयाँ १|नयाँ $1}}",
        "listgrouprights-namespaceprotection-namespace": "नामपद",
        "listgrouprights-namespaceprotection-restrictedto": "प्रयोगकर्तालाई सम्पादन गर्ने अधिकार(हरू) दिने",
        "trackingcategories": "श्रेणीहरू पछ्याउने",
-       "trackingcategories-summary": "यस à¤ªà¥\83षà¥\8dठमा à¤¤à¥\80 à¤\9cà¥\8bडिनà¥\87 à¤¶à¥\8dरà¥\87णिहरà¥\82à¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤­à¥\87à¤\9fà¥\8dदà¤\9b à¤\9cà¥\81न à¤¸à¥\8dवतà¤\83 à¤°à¥\82पलà¥\87 à¤®à¥\80डियाविà¤\95ि à¤¸à¤«à¥\8dà¤\9fवà¥\87यरदà¥\8dवारा à¤¬à¤¨à¤¾à¤\87नà¥\87 à¤\97रिनà¥\8dà¤\9b। à¤\89नà¥\80हरà¥\82à¤\95à¥\8b à¤¨à¤¾à¤® à¤¸à¤®à¥\8dबनà¥\8dधित à¤ªà¥\8dरणालà¥\80 à¤¸à¤¨à¥\8dदà¥\87शलाà¤\88 à¤ªà¤°à¥\80वर्तनले {{ns:8}} नामस्थानमा परिवर्तन गर्न सकिन्छ।",
+       "trackingcategories-summary": "यस à¤ªà¥\83षà¥\8dठमा à¤¤à¥\80 à¤\9cà¥\8bडिनà¥\87 à¤¶à¥\8dरà¥\87णिहरà¥\82à¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤­à¥\87à¤\9fà¥\8dदà¤\9b à¤\9cà¥\81न à¤¸à¥\8dवतà¤\83 à¤°à¥\82पलà¥\87 à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95à¥\80 à¤¸à¤«à¥\8dà¤\9fवà¥\87यरदà¥\8dवारा à¤¬à¤¨à¤¾à¤\87नà¥\87 à¤\97रिनà¥\8dà¤\9b। à¤\89नà¥\80हरà¥\82à¤\95à¥\8b à¤¨à¤¾à¤® à¤¸à¤®à¥\8dबनà¥\8dधित à¤ªà¥\8dरणालà¥\80 à¤¸à¤¨à¥\8dदà¥\87शलाà¤\88 à¤ªà¤°à¤¿वर्तनले {{ns:8}} नामस्थानमा परिवर्तन गर्न सकिन्छ।",
        "trackingcategories-msg": "श्रेणी पछ्याउने",
        "trackingcategories-name": "सन्देश नाम",
        "trackingcategories-desc": "श्रेणी समावेशी आधारहरू",
        "cant-move-user-page": "तपाईसँग प्रयोगकर्ता पृष्ठहरू सार्न अनुमती छैन (सहपृष्ठहरू बाहेक)",
        "cant-move-to-user-page": "तपाईंलाई पृष्ठहरू प्रयोगकर्ता पृष्ठमा सार्न अनुमती छैन (प्रयोगकर्ता सहपृष्ठहरूमा बाहेक)",
        "cant-move-category-page": "तपाईंलाई श्रेणीको पृष्ठहरू सार्ने अनुमति छैन ।",
-       "cant-move-to-category-page": "à¤\95à¥\81नà¥\88 à¤¶à¥\8dरà¥\87णà¥\80 à¤ªà¥\83षà¥\8dठमा à¤¸à¤¾à¤°à¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82लाई अनुमति छैन ।",
+       "cant-move-to-category-page": "à¤\95à¥\81नà¥\88 à¤¶à¥\8dरà¥\87णà¥\80 à¤ªà¥\83षà¥\8dठमा à¤¸à¤¾à¤°à¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤¤à¤ªà¤¾à¤\88à¤\81लाई अनुमति छैन ।",
        "newtitle": "नयाँ शीर्षकमा :",
        "move-watch": "यो पृष्ठ निगरानीमा राख्नुहोस्",
        "movepagebtn": "पृष्ठ सार्नुहोस्",
        "allmessagesname": "नाम",
        "allmessagesdefault": "डिफल्ट सन्देश पाठ",
        "allmessagescurrent": "वर्तमान सन्देश पाठ",
-       "allmessagestext": "यà¥\8b à¤®à¥\80डियाविà¤\95ि à¤¨à¥\87मसà¥\8dपà¥\87समा à¤ªà¤¾à¤\87नà¥\87 à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤¸à¤¨à¥\8dदà¥\87शहरà¥\82à¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤¹à¥\8b।\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤µà¥\8dयापà¤\95 à¤®à¥\80डिया à¤µà¤¿à¤\95ि à¤¸à¥\8dथानà¥\80यà¤\95रणमा à¤¯à¥\8bà¤\97दान à¤\97रà¥\8dन à¤\9aाहनà¥\81हà¥\81नà¥\8dà¤\9b à¤­à¤¨à¥\87à¤\82 कृपया [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation]मा र [https://translatewiki.net translatewiki.net]मा जानुहोस्।",
+       "allmessagestext": "यà¥\8b à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95à¥\80 à¤¨à¥\87मसà¥\8dपà¥\87समा à¤ªà¤¾à¤\87नà¥\87 à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤¸à¤¨à¥\8dदà¥\87शहरà¥\82à¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤¹à¥\8b।\nयदि à¤¤à¤ªà¤¾à¤\88à¤\81 à¤µà¥\8dयापà¤\95 à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95à¥\80 à¤¸à¥\8dथानà¥\80यà¤\95रणमा à¤¯à¥\8bà¤\97दान à¤\97रà¥\8dन à¤\9aाहनà¥\81हà¥\81नà¥\8dà¤\9b à¤­à¤¨à¥\87 कृपया [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation]मा र [https://translatewiki.net translatewiki.net]मा जानुहोस्।",
        "allmessagesnotsupportedDB": "<strong>$wgUseDatabaseMessages</strong> लाई निस्क्रिय गरिएकोले यो पृष्ठ प्रयोग गर्न सकिदैन ।",
        "allmessages-filter-legend": "फिल्टर",
        "allmessages-filter": "अनुकूल स्थितिको आधारमा छान्नुहोस्:",
        "exif-gpsimgdirectionref": "चित्रको दिशाकोलागि सन्दर्भ",
        "exif-gpsimgdirection": "चित्रको दिशा",
        "exif-gpsmapdatum": "जियोडेटिक सर्वेक्षण डेटा प्रयोग गरियो",
-       "exif-gpsdestlatituderef": "à¤\97नà¥\8dतवà¥\8dयà¤\95à¥\8b à¤\85à¤\95à¥\8dषाà¤\82शà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 सन्दर्भ",
+       "exif-gpsdestlatituderef": "à¤\97नà¥\8dतवà¥\8dयà¤\95à¥\8b à¤\85à¤\95à¥\8dषाà¤\99à¥\8dशà¤\95à¥\8b à¤²à¤¾à¤\97ि सन्दर्भ",
        "exif-gpsdestlatitude": "अक्षांश गंतव्य",
-       "exif-gpsdestlongituderef": "à¤\97नà¥\8dतवà¥\8dयà¤\95à¥\8b à¤¦à¥\87शानà¥\8dतरà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 सन्दर्भ",
+       "exif-gpsdestlongituderef": "à¤\97नà¥\8dतवà¥\8dयà¤\95à¥\8b à¤¦à¥\87शानà¥\8dतरà¤\95à¥\8b à¤²à¤¾à¤\97ि सन्दर्भ",
        "exif-gpsdestlongitude": "गंतव्यको देशान्तर",
-       "exif-gpsdestbearingref": "à¤\97नà¥\8dतवà¥\8dयà¤\95à¥\8b à¤\85सरà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 सन्दर्भ",
+       "exif-gpsdestbearingref": "à¤\97नà¥\8dतवà¥\8dयà¤\95à¥\8b à¤¬à¤¿à¤¯à¤°à¤¿à¤\99à¤\95à¥\8b à¤²à¤¾à¤\97ि सन्दर्भ",
        "exif-gpsdestbearing": "गंतव्यको असर",
-       "exif-gpsdestdistanceref": "à¤\97नà¥\8dतवà¥\8dयसमà¥\8dमà¤\95à¥\8b à¤¦à¥\81रà¥\80à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 सन्दर्भ",
+       "exif-gpsdestdistanceref": "à¤\97नà¥\8dतवà¥\8dयसमà¥\8dमà¤\95à¥\8b à¤¦à¥\81रà¥\80à¤\95à¥\8b à¤²à¤¾à¤\97ि सन्दर्भ",
        "exif-gpsdestdistance": "गंतव्यसम्मको दूरी",
        "exif-gpsprocessingmethod": "GPS प्रक्रिया पद्दतिको नाम",
        "exif-gpsareainformation": "जीपीएस क्षेत्रको नाम",
        "version-ext-colheader-license": "इजाजतपत्र",
        "version-ext-colheader-description": "विवरण",
        "version-ext-colheader-credits": "लेखकहरु",
-       "version-license-title": "$1 à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 इजाजतपत्र",
+       "version-license-title": "$1 à¤\95à¥\8b à¤²à¤¾à¤\97ि इजाजतपत्र",
        "version-license-not-found": "यस एक्सटेन्समा अनुमतीपत्रको विस्तृत जानकारी छैन् ।",
        "version-credits-title": "$1 को लागी श्रेयहरू",
        "version-credits-not-found": "यस एक्सटेन्समा श्रेयहरूको विस्तृत जानकारी छैन् ।",
        "version-poweredby-credits": "यो विकी '''[https://www.mediawiki.org/ मिडियाविकि]''' द्वारा सशक्तिकरण गरिएको छ, copyright © सन् २००१-$1 $2.",
        "version-poweredby-others": "अन्य",
        "version-poweredby-translators": "translatewiki.net अनुवादकर्ताहरू",
-       "version-credits-summary": "हामà¥\80 à¤¨à¤¿à¤®à¥\8dन à¤µà¥\8dयà¤\95à¥\8dतिहरà¥\82दà¥\8dवारा [[Special:Version|मà¥\80डियाविà¤\95ि]]मा à¤\97रिà¤\8fà¤\95à¥\8b à¤¯à¥\8bà¤\97दानहरà¥\82लाà¤\88 à¤¸à¤°à¤¾à¤¹à¤¨à¤¾ à¤\97रà¥\8dदà¤\9bà¥\8cà¤\82।",
+       "version-credits-summary": "हामà¥\80 à¤¨à¤¿à¤®à¥\8dन à¤µà¥\8dयà¤\95à¥\8dतिहरà¥\82दà¥\8dवारा [[Special:Version|मिडियाविà¤\95à¥\80]]मा à¤\97रिà¤\8fà¤\95à¥\8b à¤¯à¥\8bà¤\97दानहरà¥\82लाà¤\88 à¤¸à¤°à¤¾à¤¹à¤¨à¤¾ à¤\97रà¥\8dदà¤\9bà¥\8cà¤\81।",
        "version-license-info": "मीडियाविकि मुक्त सफ्टवेयर हो; तपाईं यसलाई पुनः वितरण गर्न सक्नुहुन्छ र/वा यसलाई संशोधित गर्न सक्नुहुन्छ जस्तै कि जेएनयु साधारण सार्वजनिक लाइसेन्स अन्तर्गत मुक्त लाइसेन्स फाउन्डेशनद्वारा प्रकाशित गरिएको थियो; वा लाइसेन्सको अवतरण २, वा (तपाईंको विकल्प अनुसार) कुनै अन्य अवतरण।\n\nबिना कुनै वारन्टि मीडियाविकि यस आशाका साथ वितरित गरिन्छ कि यो उपयुक्त छ; जसमा व्यापारिक मापदण्ड भएको वारन्टी पनि छैन र न त कुनै लक्ष्यको लागि पर्याप्त हुने प्रावधान नै छ । अरू जानकारीका लागि हेर्नुहोस जेएनयु साधारण सार्वजनिक लाइसेन्स।\n\nतपाईंलाई यस प्रोग्राम संगै [{{SERVER}}{{SCRIPTPATH}}/COPYING जेएनयु साधारण सार्वजनिक लाइसेन्सको एक प्रति] भेटिसकेको छ; यदि छैन भने तपाईं सम्पर्क गर्नुहोस फ्री लाइसेन्स फाउन्डेशन, इन्क., 51 फ्र्याङ्कलिन स्ट्रीट, पाँचौ तल्ला, बोस्टन, एमए 02110-1301, संयुक्त राज्य वा [//www.gnu.org/licenses/old-licenses/gpl-2.0.html अनलाइन पढ्नका निमित्त]।",
        "version-software": "स्थापना गरिएको सफ्टवेयर",
        "version-software-product": "उत्पादन",
        "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरू}}",
        "tags-manage-no-permission": "ट्याग मिलान गर्नको लागि तपाईंलाई अनुमति छैन ।",
        "tags-create-heading": "नयाँ ट्याग बनाउने",
-       "tags-create-explanation": "पà¥\81नà¤\83 à¤¨à¤¿à¤°à¥\8dधारित à¤°à¥\82पलà¥\87, à¤¨à¤µà¤¨à¤¿à¤°à¥\8dमित à¤\9fà¥\8dयाà¤\97 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82 à¤° à¤¬à¥\8bà¤\9fहरà¥\82à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 रहनेछ।",
+       "tags-create-explanation": "पà¥\81नà¤\83 à¤¨à¤¿à¤°à¥\8dधारित à¤°à¥\82पलà¥\87, à¤¨à¤µà¤¨à¤¿à¤°à¥\8dमित à¤\9fà¥\8dयाà¤\97 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82 à¤° à¤¬à¥\8bà¤\9fहरà¥\82à¤\95à¥\8b à¤²à¤¾à¤\97ि रहनेछ।",
        "tags-create-tag-name": "ट्याग नाम:",
        "tags-create-reason": "कारण:",
        "tags-create-submit": "सृजना गर्ने",
        "tags-edit-failure": "यी परिवर्तनहरू लागु गर्न सकिएनः\n$1",
        "tags-edit-nooldid-title": "अवैध संशोधन लक्ष्य",
        "tags-edit-nooldid-text": "या त तपाईंले कुनै लक्षित संशोधनको विवरण दिनुभएको छैन जहाँ यस कार्यलाई सम्पन्न गर्नु पर्नेछ, या विवरण गरिएको संशोधन छंदै छैन।",
-       "tags-edit-none-selected": "थपà¥\8dन à¤µà¤¾ à¤¹à¤\9fाà¤\89नà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 कृपया कम्तिमा एउटा ट्याग छान्नुहोस् ।",
+       "tags-edit-none-selected": "थपà¥\8dन à¤µà¤¾ à¤¹à¤\9fाà¤\89नà¤\95à¥\8b à¤²à¤¾à¤\97ि कृपया कम्तिमा एउटा ट्याग छान्नुहोस् ।",
        "comparepages": "पृष्ठहरू दाँज्ने",
        "compare-page1": "पृष्ठ 1",
        "compare-page2": "पृष्ठ 2",
index fc0f156..a6d0fad 100644 (file)
@@ -9,7 +9,8 @@
                        "McDutchie",
                        "Romaine",
                        "Mainframe98",
-                       "Mar(c)"
+                       "Mar(c)",
+                       "Robin van der Vliet"
                ]
        },
        "view-pool-error": "De servers zijn op het moment helaas overbelast.\nTe veel gebruikers proberen deze pagina te bekijken.\nWacht even voordat je opnieuw toegang probeert te krijgen tot deze pagina.\n\n$1",
        "prefs-help-variant": "Jouw voorkeursvariant of -spelling om de inhoudspagina's van deze wiki in weer te geven.",
        "prefs-help-signature": "Reacties op de overlegpagina's worden meestal ondertekend met \"<nowiki>~~~~</nowiki>\".\nDe tildes worden omgezet in je ondertekening en een datum en tijd van de bewerking.",
        "badsiglength": "Je ondertekening is te lang.\nDeze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.",
+       "gender-unknown": "De software gebruikt waar mogelijk geslachtsneutrale woorden als het over je gaat",
        "prefs-help-realname": "Echte naam is optioneel.\nAls je deze opgeeft, kan deze naam gebruikt worden om je erkenning te geven voor je werk.",
        "prefs-help-email": "E-mailadres is optioneel, maar maakt het mogelijk om jou je wachtwoord te e-mailen als je het bent vergeten.",
        "prefs-help-email-others": "Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een koppeling op uw gebruikers- en overlegpagina zonder dat je je identiteit prijsgeeft.",
index 8fa9c61..48620c4 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op een volglijst]",
-       "rc_categories": "Beperken tot categorieën (scheiden met een \"|\"):",
-       "rc_categories_any": "Een van de gekozen",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} na de wijziging",
        "newsectionsummary": "/* $1 */ nieuwe subkop",
        "rc-enhanced-expand": "Details weergeven",
        "watchlistedit-clear-titles": "Pagina's:",
        "watchlistedit-clear-submit": "Volglijst wissen (dit is definitief!)",
        "watchlistedit-clear-done": "Uw volglijst is gewist.",
+       "watchlistedit-clear-jobqueue": "Uw volglijst wordt leeggemaakt. Dit kan enige tijd duren!",
        "watchlistedit-clear-removed": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina's}} verwijderd:",
        "watchlistedit-too-many": "Er zijn te veel pagina's om hier weer te geven.",
        "watchlisttools-clear": "Volglijst wissen",
index bf46ac3..ed3f733 100644 (file)
        "textmatches": "Sider med treff på førespurnaden",
        "notextmatches": "Ingen sider hadde treff på førespurnaden",
        "prevn": "førre {{PLURAL:$1|$1}}",
-       "nextn": "neste {{PLURAL:$1|$1}}",
+       "nextn": "{{PLURAL:$1|neste|neste $1}}",
        "prev-page": "førre sida",
        "next-page": "neste side",
        "prevn-title": "Førre $1 {{PLURAL:$1|resultat|resultat}}",
        "newpageletter": "n",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|Éin brukar|$1 brukarar}} overvakar]",
-       "rc_categories": "Avgrens til kategoriar (skil med «|»):",
-       "rc_categories_any": "Alle",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte}} etter endringa",
        "newsectionsummary": "/* $1 */ ny bolk",
        "rc-enhanced-expand": "Vis detaljar",
index 6b16255..6d4e26d 100644 (file)
        "site-atom-feed": "Flux Atom de $1",
        "page-rss-feed": "Flux RSS de \"$1\"",
        "page-atom-feed": "Flux Atom de \"$1\"",
+       "feed-atom": "Atom",
        "red-link-title": "$1 (la pagina existís pas)",
        "sort-descending": "Botar en òrdre creissent",
        "sort-ascending": "Botar en òrdre descreissent",
        "nosuchusershort": "I a pas de contributor amb lo nom « $1 ». Verificatz l’ortografia.",
        "nouserspecified": "Vos cal especificar vòstre nom d'utilizaire.",
        "login-userblocked": "Aqueste utilizaire es blocat. Connexion pas autorizada.",
-       "wrongpassword": "Lo senhal es incorrècte. Ensajatz tornarmai.",
+       "wrongpassword": "Lo nom d'utilizaire o lo senhal es incorrècte.\nEnsajatz tornarmai.",
        "wrongpasswordempty": "Lo senhal picat èra void. Se vos plai, ensajatz tornarmai.",
        "passwordtooshort": "Vòstre senhal deu conténer al mens {{PLURAL:$1|1 caractèr|$1 caractèrs}}.",
        "password-name-match": "Vòstre senhal deu èsser diferent de vòstre nom d’utilizaire.",
        "botpasswords-bad-appid": "Lo nom del robòt «$1» es pas valid.",
        "botpasswords-insert-failed": "Fracàs de l’apondon del nom de robòt « $1 ». Es ja estat apondut ?",
        "botpasswords-created-title": "Senhal de robòts creat",
-       "botpasswords-created-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat creat.",
+       "botpasswords-created-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es estat creat.",
        "botpasswords-updated-title": "Senhal de robòts mes a jorn",
-       "botpasswords-updated-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat mes a jorn.",
+       "botpasswords-updated-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es estat mes a jorn.",
        "botpasswords-deleted-title": "Senhal de robòts suprimit",
-       "botpasswords-deleted-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat suprimit.",
+       "botpasswords-deleted-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es suprimit.",
        "botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible.",
        "resetpass_forbidden": "Los senhals pòdon pas èsser cambiats",
        "resetpass_forbidden-reason": "Los senhaus pòdon pas èsser cambiats : $1",
        "anoneditwarning": "<strong>Atencion :<strong> sètz pas connectat.\nVòstra adreça IP serà visibla per tot lo monde se fasètz de modificacions. Se <strong>[$1 vos connectatz]</strong> o <strong>[$2 creatz un compte]</strong>, vòstras modificacions seràn atribuidas a vòstre nom d’utilizaire, entre autres avantatges.",
        "anonpreviewwarning": "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''",
        "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fait sens avertiment mai.",
-       "missingcommenttext": "Mercé de metre un comentari çaijós.",
+       "missingcommenttext": "Mercé de metre un comentari.",
        "missingcommentheader": "<strong>Rapèl :</strong> Avètz pas provesit cap de subjècte per aqueste comentari.\nSe clicatz tornamai sus « {{int:Savearticle}} », vòstra modificacion serà enregistrada sens subjècte.",
        "summary-preview": "Apercebut del resumit de modificacion :",
        "subject-preview": "Apercebut del subjècte :",
        "readonlywarning": "<strong>AVERTIMENT : La basa de donadas es estada verrolhada per d'operacions de mantenença. Doncas, poiretz pas publicar vòstras modificacions pel moment.</strong>\nL’administrator sistèma qu'an verrolhada la basa de donadas a donat l’explicacion seguenta : $1",
        "protectedpagewarning": "'''AVERTIMENT : Aquesta pagina es protegida. Sols los utilizaires qu'an l'estatut d'administrator la p�don modificar. ''' La darri�ra entrada del jornal es afichada �aij�s per refer�ncia :",
        "semiprotectedpagewarning": "'''N�ta:''' Aquesta pagina es estada protegida d'un tal biais que sols los contributors enregistrats la p�scan modificar. La darri�ra entrada del jornal es afichada �aij�s per refer�ncia :",
-       "cascadeprotectedwarning": "'''ATENCION :''' Aquesta pagina es estada protegida de biais que sols los administrators la pòscan editar perque es transclusa dins {{PLURAL:$1|la pagina protegida seguenta, qu'a|las paginas protegidas seguentas,  qu'an}} la « proteccion en cascada » activada :",
+       "cascadeprotectedwarning": "<strong>ATENCION :</strong> Aquesta pagina es estada protegida de biais que sols los utilizaires amb [[Special:ListGroupRights|de dreches especifics]] la pòscan modificar perque es inclusa dins {{PLURAL:$1|la pagina protegida seguenta, qu'a|las paginas protegidas seguentas,  qu'an}} la « proteccion en cascada » activada :",
        "titleprotectedwarning": "'''ATENCION : Aquesta pagina es estada protegida de tal biais que de [[Special:ListGroupRights|dreits especifics]] son requesits per la poder crear.''' La darrièra entrada del jornal es afichada çaijós per referéncia :",
        "templatesused": "{{PLURAL:$1|Modèl utilizat|Modèls utilizats}} sus aquesta pagina :",
        "templatesusedpreview": "{{PLURAL:$1|Modèl utilizat|Modèls utilizats}} dins aquesta previsualizacion :",
        "prefs-editwatchlist-clear": "Escafar la lista de seguiment",
        "prefs-watchlist-days": "Nombre de jorns d'afichar dins la lista de seguiment :",
        "prefs-watchlist-days-max": "(maximum $1 jorn{{PLURAL:$1||s}})",
-       "prefs-watchlist-edits": "Nombre de modificacions d'afichar dins la lista de seguiment espandida :",
+       "prefs-watchlist-edits": "Nombre maximal de modificacions d'afichar dins la lista de seguiment :",
        "prefs-watchlist-edits-max": "Nombre maximum : 1000",
        "prefs-watchlist-token": "Geton per la lista de seguiment :",
        "prefs-misc": "Preferéncias divèrsas",
        "recentchangesdays-max": "(maximum $1 {{PLURAL:$1|jorn|jorns}})",
        "recentchangescount": "Nombre de modificacions d'afichar per defaut :",
        "prefs-help-recentchangescount": "Aquò inclutz las modificacions recentas, las paginas d’istorics e los jornals.",
-       "prefs-help-watchlist-token2": "Aquí la clau secreta del flux Web de vòstra lista de seguiment.\nTota persona que la coneis poirà legir vòstra lista de seguiment, doncas, la comuniquetz pas.\n[[Special:ResetTokens|Clicatz aicí se la vos cal reïnicializar]].",
+       "prefs-help-watchlist-token2": "Aquí la clau secreta del flux Web de vòstra lista de seguiment.\nTota persona que la coneis poirà legir vòstra lista de seguiment, doncas, la comuniquetz pas.\nSe necessari, [[Special:ResetTokens|clicatz aicí per la reïnicializar]].",
        "savedprefs": "Las preferéncias son estadas salvadas.",
        "savedrights": "Los dreits d'utilizaire de {{GENDER:$1|$1}} son estats enregistrats.",
        "timezonelegend": "Fus orari :",
        "timezoneregion-europe": "Euròpa",
        "timezoneregion-indian": "Ocean Indian",
        "timezoneregion-pacific": "Ocean Pacific",
-       "allowemail": "Autorizar lo mandadís de corrièr electronic venent d’autres utilizaires",
+       "allowemail": "Autorizar los autres utilizaires a me mandar de corrièls",
        "prefs-searchoptions": "Recèrca",
        "prefs-namespaces": "Noms d’espacis",
        "default": "defaut",
        "recentchanges-label-plusminus": "La talha de la pagina a cambiat d'aqueste nombre d’octets.",
        "recentchanges-legend-heading": "<strong>Legenda :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
+       "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Afichar",
        "rcfilters-activefilters": "Filtres actius",
        "rcfilters-hours-title": "Darrièras oras",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilizaire seguent|utilizaires seguents}}]",
-       "rc_categories": "Limitar a las categorias (separadas per « | ») :",
-       "rc_categories_any": "Una de las seleccionadas",
        "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} aprèp cambiament",
        "newsectionsummary": "/* $1 */ seccion novèla",
        "rc-enhanced-expand": "Vejatz los detalhs",
        "recentchangeslinked-feed": "Seguit dels ligams",
        "recentchangeslinked-toolbox": "Seguit dels ligams",
        "recentchangeslinked-title": "Seguit dels ligams associats a \"$1\"",
-       "recentchangeslinked-summary": "Aquesta pagina especiala fa veire los darrièrs cambiaments sus las paginas que son ligadas. Las paginas de [[Special:Watchlist|vòstra lista de seguimznt]] son '''en gras'''.",
+       "recentchangeslinked-summary": "Entrar un nom de pagina per veire las modificacions faitas recentament sus de paginas ligadas dempuèi o cap a aquesta pagina (per veire los membres d’una categoria, entratz Categoria:Nom de categoria). Las modificacions de las paginas de [[Special:Watchlist|vòstra lista de seguiment]] son <strong>en gras</strong>.",
        "recentchangeslinked-page": "Nom de la pagina :",
        "recentchangeslinked-to": "Afichar los cambiaments cap a las paginas ligadas al luòc de la pagina donada",
        "recentchanges-page-added-to-category": "[[:$1]] apondut a la categoria",
        "unwatchthispage": "Arrestar de seguir",
        "notanarticle": "Pas cap d'article",
        "notvisiblerev": "Version suprimida",
-       "watchlist-details": "I a {{PLURAL:$1|$1 pagina|$1 paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.",
+       "watchlist-details": "{{PLURAL:$1|$1 pagina es|$1 paginas son}} dins vòstra lista de seguiment (amai las paginas de discussion).",
        "wlheader-enotif": "La notificacion per corrièr electronic es activada.",
        "wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
        "wlnote": "Çaijós {{PLURAL:$1|figura la darrièra modificacion efectuada|figuran las <strong>$1</strong> darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las <strong>$2</strong> darrièras oras}}, dempuèi $3, $4.",
        "sp-contributions-uploads": "impòrts",
        "sp-contributions-logs": "jornals",
        "sp-contributions-talk": "Discutir",
-       "sp-contributions-userrights": "gerir los dreits",
+       "sp-contributions-userrights": "gerir los dreits d’utilizair{{GENDER:$1|e|a}}",
        "sp-contributions-blocked-notice": "Aqueste utilizaire es actualament blocat. La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
        "sp-contributions-blocked-notice-anon": "Aquesta adreça IP es actualament blocada.\nLa darrièra intrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
        "sp-contributions-search": "Cercar las contribucions",
        "autoredircomment": "Redireccion cap a [[$1]]",
        "autosumm-new": "Creacion de la pagina amb « $1 »",
        "autosumm-newblank": "Pagina voida creada",
-       "size-bytes": "$1 o",
+       "size-bytes": "$1 {{PLURAL:$1|octet|octets}}",
        "size-kilobytes": "$1 Ko",
        "size-megabytes": "$1 Mo",
        "size-gigabytes": "$1 Go",
index 87afb1e..3fbf2c4 100644 (file)
        "newpageletter": "ନୂଆ",
        "boteditletter": "ବଟ",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ସଭ୍ୟ|ସଭ୍ୟଗଣା}}ଙ୍କୁ ଦେଖୁଅଛି]",
-       "rc_categories": "ଶ୍ରେଣୀସମୂହ ପାଇଁ ସୀମା ( \"|\" ଦେଇ ଅଲଗା କରିବେ)",
-       "rc_categories_any": "ଯେ କୌଣସି",
        "rc-change-size-new": "ବଦଳ ପରେ $1 {{PLURAL:$1|ବାଇଟ|ବାଇଟସବୁ}}",
        "newsectionsummary": "/* $1 */ ନୂଆ ଭାଗ",
        "rc-enhanced-expand": "ସବିଶେଷ ଦେଖାନ୍ତୁ",
index 1009452..f30e77c 100644 (file)
        "minoreditletter": "ч",
        "newpageletter": "Н",
        "boteditletter": "б",
-       "rc_categories_any": "Кæцы фæнды",
        "newsectionsummary": "/* $1 */ ног хай",
        "rc-enhanced-expand": "Лæмбынæг информаци равдисын",
        "rc-enhanced-hide": "Айсын лæмбынæг информаци",
index a3fad60..2460fdc 100644 (file)
        "newpageletter": "ਨ",
        "boteditletter": "ਬੋਟ",
        "number_of_watching_users_pageview": "[$1 ਵੇਖ ਰਹੇ ਹਨ {{PLURAL:$1|ਯੂਜ਼ਰ}}]",
-       "rc_categories_any": "ਚੁਣੇ ਹੋਇਅਾਂ ਵਿੱਚੋਂ ਕੋਈ ਵੀ",
        "rc-change-size-new": "$1 {{PLURAL:$|ਬਾਈਟ|ਬਾਈਟਾਂ}} ਤਬਦੀਲੀ ਤੋਂ ਬਾਅਦ",
        "newsectionsummary": "/* $1 */ ਨਵਾਂ ਭਾਗ",
        "rc-enhanced-expand": "ਵੇਰਵੇ ਵੇਖਾਓ",
index e75d87d..21f57d3 100644 (file)
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 lalbe {{PLURAL:$1|talagamit|talagamit}}]",
-       "rc_categories": "Angganan/limitasiun da reng kategoriya (pikawani la king \"|\")",
-       "rc_categories_any": "Andyang sanu",
        "newsectionsummary": "/* $1 */ bayung seksiyon/dake",
        "rc-enhanced-expand": "Pakit la reng detalle (mangailangan yang JavaScript)",
        "rc-enhanced-hide": "Isalikut la reng detalle",
index 4f526d1..97b1427 100644 (file)
        "minoreditletter": "g",
        "newpageletter": "N",
        "boteditletter": "W",
-       "rc_categories_any": "All",
        "rc-change-size-new": "$1 {{PLURAL:$1|Beit|Beit}} nooch daer Ennering",
        "newsectionsummary": "Neier Abschnitt /* $1 */",
        "recentchangeslinked": "Was on verlinkde Bledder geduh warre iss",
index f5807e4..fd24862 100644 (file)
        "minoreditletter": "k",
        "newpageletter": "N",
        "boteditletter": "B",
-       "rc_categories": "Oigschrengd uff Sachgrubbe (abgdeeld middm \"|\")",
-       "rc_categories_any": "Ebbes",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte}} nochde Ännarung",
        "rc-enhanced-expand": "Änzlhaide zaische",
        "rc-enhanced-hide": "Oagawe vaschdeggle",
index 92efb1e..b6bff28 100644 (file)
@@ -93,7 +93,9 @@
                        "Wojtas",
                        "Kastanoto",
                        "Sebek Adamowicz",
-                       "Cholewka"
+                       "Cholewka",
+                       "Ankam",
+                       "Anwar2"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "postedit-confirmation-created": "Strona została utworzona.",
        "postedit-confirmation-restored": "Strona została przywrócona.",
        "postedit-confirmation-saved": "Twoja edycja została zapisana.",
+       "postedit-confirmation-published": "Twoja edycja została opublikowana.",
        "edit-already-exists": "Nie udało się stworzyć nowej strony.\nStrona już istnieje.",
        "defaultmessagetext": "Domyślny tekst komunikatu",
        "content-failed-to-parse": "Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3",
        "recentchanges-legend": "Opcje ostatnich zmian",
        "recentchanges-summary": "Ta strona przedstawia historię ostatnich zmian w tej wiki.",
        "recentchanges-noresult": "Brak zmian w wybranym okresie spełniających twoje kryteria.",
+       "recentchanges-timeout": "To wyszukiwanie przekroczyło limit czasu. Możesz spróbować z innymi parametrami wyszukiwania.",
        "recentchanges-network": "Z powodu błędu technicznego nie można załadować żadnych wyników. Spróbuj odświeżyć stronę.",
        "recentchanges-notargetpage": "Wprowadź powyżej nazwę strony, aby zobaczy zmiany związane z tą stroną.",
        "recentchanges-feed-description": "Obserwuj najświeższe zmiany w tej wiki.",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|obserwujący użytkownik|obserwujących użytkowników}}]",
-       "rc_categories": "Ogranicz do kategorii (oddzielaj za pomocą „|”)",
-       "rc_categories_any": "Dowolna z wybranych",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtów}} po zmianie",
        "newsectionsummary": "/* $1 */ nowa sekcja",
        "rc-enhanced-expand": "Pokaż szczegóły",
        "uploaded-script-svg": "Znaleziono element skryptowy „$1” we przesyłanym pliku SVG.",
        "uploaded-hostile-svg": "Znaleziono niebezpieczny kod CSS w przesyłanym pliku SVG.",
        "uploaded-event-handler-on-svg": "Ustawianie atrybutów obsługi zdarzeń <code>$1=\"$2\"</code> jest niedozwolone w plikach SVG.",
-       "uploaded-href-attribute-svg": "atrybuty href w plikach SVG mogą linkować tylko do celów z http:// lub https://, znaleziono <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-attribute-svg": "Elementy <a> mogą tylko łączyć (href) z danymi: (wbudowany plik), http: // lub https: // lub fragmentami (#, ten sam-dokument) obiektami docelowymi. W przypadku innych elementów, takich jak <image>, dozwolone są tylko dane: i fragment. Spróbuj osadzać obrazy podczas eksportowania SVG. Znaleziono <code> & lt; 1 $ 2 $ = \"$ 3\" & gt; </ code>.",
        "uploaded-href-unsafe-target-svg": "Znaleziono atrybut href kierujący do niebezpiecznych danych: cel URI <code>&lt;$1 $2=\"$3\"&gt;</code> w przesłanym pliku SVG.",
        "uploaded-animate-svg": "Znaleziono znacznik \"animate\", który może zmieniać atrybut href, przy użyciu atrybutu \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> w przesłanym pliku SVG.",
        "uploaded-setting-event-handler-svg": "Ustawianie atrybutów obsługi zdarzeń jest zablokowane, znaleziono <code>&lt;$1 $2=\"$3\"&gt;</code> w przesyłanym pliku SVG.",
        "lockmanager-fail-closelock": "Nie można znieść blokady z pliku \"$1\".",
        "lockmanager-fail-deletelock": "Nie można usunąć blokady z pliku \"$1\".",
        "lockmanager-fail-acquirelock": "Nie można ustawić blokady dla pliku \"$1\".",
-       "lockmanager-fail-openlock": "Nie można znieść blokady z pliku \"$1\".",
+       "lockmanager-fail-openlock": "Nie można otworzyć pliku blokady dla \"$1\". Upewnij się, że katalog przesyłania jest poprawnie skonfigurowany, a twój serwer internetowy ma uprawnienia do zapisu w tym katalogu. Więcej informacji można znaleźć na stronie https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory.",
        "lockmanager-fail-releaselock": "Nie może zwolnić blokady dla \" $1 \".",
        "lockmanager-fail-db-bucket": "Nie można powiązać wystarczającej ilości zablokowanych baz danych w segmencie $1 .",
        "lockmanager-fail-db-release": "Nie udało się zwolnić blokad w bazie danych $1.",
        "uploadstash-bad-path": "Ścieżka nie istnieje.",
        "uploadstash-bad-path-invalid": "Ścieżka jest nieprawidłowa.",
        "uploadstash-bad-path-unknown-type": "Nieznany typ „$1”.",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Nierozpoznana nazwa miniaturki.",
+       "uploadstash-bad-path-no-handler": "Nie znaleziono obsługi dla typu mime 1 $ pliku $2.",
+       "uploadstash-bad-path-bad-format": "Klucz \"$1\" nie jest w odpowiednim formacie.",
+       "uploadstash-file-not-found": "Klucz \"$1\" nie został znaleziony w schowku.",
        "uploadstash-file-not-found-no-thumb": "Nie można uzyskać miniaturki.",
        "uploadstash-file-not-found-no-local-path": "Brak lokalnej ścieżki dla skalowanego elementu.",
        "uploadstash-file-not-found-no-object": "Nie można utworzyć lokalnego obiektu pliku dla miniatury.",
        "uploadstash-file-not-found-no-remote-thumb": "Nie udało się pobrać miniatury: $1\nURL = $2",
        "uploadstash-file-not-found-missing-content-type": "Brakuje nagłówka content-type.",
+       "uploadstash-file-not-found-not-exists": "Nie można znaleźć ścieżki ani zwykłego pliku.",
        "uploadstash-file-too-large": "Nie można wyświetlić pliku większego niż $1 bajtów.",
        "uploadstash-not-logged-in": "Użytkownik nie jest zalogowany, a pliki muszą należeć do użytkowników.",
        "uploadstash-wrong-owner": "Ten plik ($1) nie należy do bieżącego użytkownika.",
        "rollback-success": "Wycofano edycje {{GENDER:$3|użytkownika|użytkowniczki}} $1;\nprzywrócono ostatnią wersję autorstwa {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2. [$3 Pokaż zmiany]",
        "sessionfailure-title": "Błąd sesji",
-       "sessionfailure": "Wystąpił problem z weryfikacją zalogowania.\nPolecenie zostało anulowane, aby uniknąć przechwycenia sesji.\nNaciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.",
+       "sessionfailure": "Wydaje się, że wystąpił błąd z Twoją sesją zalogowania;\nto działanie zostało anulowane, aby uniknąć przechwycenia sesji.\nPrześlij formularz jeszcze raz.",
        "changecontentmodel": "Edycja modelu zawartości strony",
        "changecontentmodel-legend": "Zmienić model zawartości",
        "changecontentmodel-title-label": "Tytuł strony",
index 9f03ec0..9644648 100644 (file)
        "newpageletter": "N",
        "boteditletter": "t",
        "number_of_watching_users_pageview": "[tnùa sot-euj da {{PLURAL:$1|n'utent|$1 utent}}]",
-       "rc_categories": "Limité a le categorìe (che a jë scriva separand-je antra 'd lor con un \"|\"):",
-       "rc_categories_any": "Un-a qualsëssìa ëd cole selessionà",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} apress ij cambi",
        "newsectionsummary": "/* $1 */ session neuva",
        "rc-enhanced-expand": "Mostré ij detaj",
index afc7d6b..985ec41 100644 (file)
        "oct": "اکتوبر",
        "nov": "نومبر",
        "dec": "دسمبر",
-       "january-date": "جنوری $1",
+       "january-date": "جنوری",
        "february-date": "فروری $1",
        "march-date": "مارچ $1",
        "april-date": "اپریل $1",
        "history-title": "\"$1\" دا ریکارڈ",
        "difference-title": "\"$1\" دیاں دہرائیاں وچ وکھراپا",
        "difference-multipage": "(صفیاں چ فرق)",
-       "lineno": "لیک $1:",
+       "lineno": "لیک 1:",
        "compareselectedversions": "چنے صفحے آپنے سامنے کرو",
        "showhideselectedversions": "وکھاؤ/لکاؤ چنیاں دہرائیاں",
        "editundo": "واپس",
        "newpageletter": "نواں",
        "boteditletter": "بوٹ",
        "number_of_watching_users_pageview": "[ $1 ویکھ رہیا اے{{PLURAL:$1|ورتن والا|والے}}]",
-       "rc_categories": "گٹھاں دی حد (وکھرے کرو \"|\")",
-       "rc_categories_any": "کوئی",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹاں}} تبدیلی مگروں",
        "newsectionsummary": "/* $1 */ نواں پاسہ",
        "rc-enhanced-expand": "تفضیل وکھاؤ (جاوا سکرپٹ چائیدا اے)",
        "autosumm-replace": "\"$1\" نال مواد بدلو",
        "autoredircomment": "صفے نوں [[$1]] ول ریڈائرکٹ کرو",
        "autosumm-new": "\"$1\" نال صفہ بنایا گیا۔",
+       "autosumm-newblank": "خالی صفحہ بنایا",
        "lag-warn-normal": "$1 توں نویاں تبدیلیاں {{PLURAL:$1|سکنٹ}}",
        "lag-warn-high": "تیز ڈیٹاسرور لاگ ، $1 توں نویاں تبدیلیاں {{PLURAL:$1|سکنٹ|سکنٹ}} ہوسکدا اے ایس لسٹ ناں دسے جان۔",
        "watchlistedit-normal-title": " اکھ تھلے رکھی ہوئی نو تبدیل کرو",
index bd423a5..c28659a 100644 (file)
        "minoreditletter": "μ",
        "newpageletter": "Ν",
        "boteditletter": "b",
-       "rc_categories_any": "Κάθαν",
        "rc-enhanced-expand": "Δείξον λεπτομέρειας (θελ' JavaScript)",
        "rc-enhanced-hide": "Κρύψον λεπτομέρειας",
        "recentchangeslinked": "Σχετικά αλλαγάς",
index a24b37d..f1e170f 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|nadirīnts tērpautajs|nadirīntei tērpautajai}}]",
-       "rc_categories": "Arāikinais prei kategōrijan (izsklaitinnais sen \"|\")",
-       "rc_categories_any": "Wisāi",
        "newsectionsummary": "/* $1 */ naunā sekciōni",
        "rc-enhanced-expand": "Waidinnais malkans (izkīnina JavaScript)",
        "rc-enhanced-hide": "Kliptinais malkans",
index ab90f28..a6c4a99 100644 (file)
        "boteditletter": "ر",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1  {{PLURAL:$1|کتونکی کارن|کتونکي کارنان}}]",
-       "rc_categories": "د وېشنيزو تر بريده (په \"|\" بېلول)",
-       "rc_categories_any": "له ټاکل شويو هر يو",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته",
        "newsectionsummary": "/* $1 */ نوې برخه",
index 3820aa8..d75932d 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 usuário|$1 usuários}} vigiando]",
-       "rc_categories": "Limitar às categorias (separar com \"|\"):",
-       "rc_categories_any": "Qualquer um dos escolhidos",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após alterações",
        "newsectionsummary": "/* $1 */ nova seção",
        "rc-enhanced-expand": "Exibir detalhes",
        "rollback-success": "Edições revertidas por {{GENDER:$3|$1}};\nalterado para a última revisão por {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
-       "sessionfailure": "Foram detetados problemas com a sua sessão;\nEsta ação foi cancelada como medida de proteção contra a intercepção de sessões.\nExperimente usar o botão \"Voltar\" e atualizar a página de onde veio e tente novamente.",
+       "sessionfailure": "Parece haver um problema com sua sessão de login;\nEsta ação foi cancelada como uma precaução contra o seqüestro de sessão.\nPor favor, reenvie o formulário.",
        "changecontentmodel": "Alterar o modelo de conteúdo de uma página",
        "changecontentmodel-legend": "Alterar o modelo de conteúdo",
        "changecontentmodel-title-label": "Título da página",
        "thumbnail_dest_directory": "Não foi possível criar o diretório de destino",
        "thumbnail_image-type": "Tipo de imagem não suportado",
        "thumbnail_gd-library": "Configuração da biblioteca GD incompleta: função $1 não encontrada",
+       "thumbnail_image-size-zero": "O tamanho do arquivo de imagem parece ser zero.",
        "thumbnail_image-missing": "Arquivo aparentemente inexistente: $1",
        "thumbnail_image-failure-limit": "Houveram muitas tentativas falhas recentemente ($1 ou mais) de criação desta miniatura. Por favor, tente novamente mais tarde.",
        "import": "Importar páginas",
        "watchlistedit-clear-titles": "Títulos:",
        "watchlistedit-clear-submit": "Limpar a lista de páginas vigiadas (Esta ação é permanente!)",
        "watchlistedit-clear-done": "Sua lista de páginas vigiadas foi limpa.",
+       "watchlistedit-clear-jobqueue": "A sua lista de páginas vigiadas está a ser esvaziada. Esta operação pode ser demorada.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
        "watchlistedit-too-many": "Há muitas páginas para exibir aqui.",
        "watchlisttools-clear": "Limpar a lista de páginas vigiadas",
index 15d950f..8a34f80 100644 (file)
        "action-block": "impedir este utilizador de editar",
        "action-protect": "alterar os níveis de proteção desta página",
        "action-rollback": "reverter rapidamente as edições do último utilizador que editou uma dada página",
-       "action-import": "importar páginas a partir de outra wiki",
+       "action-import": "importar páginas de outra wiki",
        "action-importupload": "importar páginas por meio do envio de um ficheiro",
        "action-patrol": "marcar as edições de outros utilizadores como patrulhadas",
        "action-autopatrol": "marcar como patrulhadas as suas próprias edições",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 utilizador|$1 utilizadores}} a vigiar]",
-       "rc_categories": "Limitar às categorias (separar com \"|\"):",
-       "rc_categories_any": "Qualquer dos escolhidos",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após mudança",
        "newsectionsummary": "/* $1 */ nova secção",
        "rc-enhanced-expand": "Mostrar detalhes",
        "rollback-success": "Foram revertidas as edições de {{GENDER:$3|$1}}; reposta a última edição de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
-       "sessionfailure": "Foram detetados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a intercetação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
+       "sessionfailure": "Foram detetados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a intercetação de sessões.\nReenvie o formulário, por favor.",
        "changecontentmodel": "Alterar modelo de conteúdo de uma página",
        "changecontentmodel-legend": "Editar modelo de contéudo",
        "changecontentmodel-title-label": "Título da página",
        "thumbnail_dest_directory": "Não foi possível criar o diretório de destino",
        "thumbnail_image-type": "Tipo de imagem não suportado",
        "thumbnail_gd-library": "Configuração da biblioteca GD incompleta: função $1 em falta",
+       "thumbnail_image-size-zero": "O tamanho do ficheiro de imagem parece ser zero.",
        "thumbnail_image-missing": "Ficheiro em falta: $1",
        "thumbnail_image-failure-limit": "Ocorreram demasiadas tentativas recentes ($1 ou mais) de criação desta miniatura. Tente novamente mais tarde, por favor.",
        "import": "Importar páginas",
        "watchlistedit-clear-titles": "Páginas:",
        "watchlistedit-clear-submit": "Limpar páginas vigiadas (isto é permanente!)",
        "watchlistedit-clear-done": "A sua lista de páginas vigiadas foi limpa.",
+       "watchlistedit-clear-jobqueue": "A sua lista de páginas vigiadas está a ser esvaziada. Esta operação pode ser demorada.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 página foi removida|$1 páginas foram removidas}}:",
        "watchlistedit-too-many": "Existem demasiadas páginas para apresentar.",
        "watchlisttools-clear": "Limpar lista de páginas vigiadas",
index f3cbb7b..f75d9bd 100644 (file)
                        "Pginer",
                        "Wladek92",
                        "Gombang",
-                       "Trizek (WMF)"
+                       "Trizek (WMF)",
+                       "Acamicamacaraca",
+                       "Avatar6"
                ]
        },
        "sidebar": "{{notranslate}}",
        "rcfilters-view-tags-help-icon-tooltip": "Tooltip for the help button that leads user to Special:Tags page",
        "rcfilters-liveupdates-button": "Label for the button to enable or disable live updates on [[Special:RecentChanges]]",
        "rcfilters-liveupdates-button-title-on": "Title for the button to enable or disable live updates on [[Special:RecentChanges]] when the feature is ON.",
-       "rcfilters-liveupdates-button-title-off": "Title for the button to enable or disable live updates on [[Special:RecentChanges]] when the feature is OFF.",
+       "rcfilters-liveupdates-button-title-off": "Title for the button to enable or disable live updates on [[Special:RecentChanges]].",
        "rcfilters-watchlist-markseen-button": "Label for the button to mark all changes as seen on [[Special:Watchlist]] when using the structured filters interface.",
        "rcfilters-watchlist-edit-watchlist-button": "Label for the button to edit the watched pages on [[Special:Watchlist]] when using the structured filters interface.\n\nCf. {{msg-mw|watchlisttools-edit}}.",
        "rcfilters-watchlist-showupdated": "Message at the top of [[Special:Watchlist]] when the Structured filters are enabled that describes what unseen changes look like.\n\nCf. {{msg-mw|wlheader-showupdated}}",
        "unpatrolledletter": "{{optional}}\n\nUsed in {{msg-mw|Recentchanges-label-legend}}, meaning \"unpatrolled\".",
        "number_of_watching_users_RCview": "{{notranslate}}\nParameters:\n* $1 - number of users who are watching",
        "number_of_watching_users_pageview": "Used if <code>$wgPageShowWatchingUsers</code> is true.\n* $1 - number of watching user(s)",
-       "rc_categories": "A label of an input box. Appears on Special:RecentChanges if filtering recent changes by category is enabled (that is, $wgAllowCategorizedRecentChanges is set to true).",
-       "rc_categories_any": "Appears ''after'' the input box the label of which is {{msg-mw|rc_categories}}, which appears on [[Special:RecentChanges]], if <code>$wgAllowCategorizedRecentChanges</code> is true. \"Chosen\" refers to categories.",
        "rc-change-size": "{{optional}}\nDoes not work under $wgMiserMode ([[mwr:48986|r48986]]).\n\nParameters:\n* $1 - size of diff",
        "rc-change-size-new": "Tooltip when hovering a change list diff size. Parameters:\n* $1 - the resulting new size (in bytes)",
        "newsectionsummary": "Default summary when adding a new section to a page. Parameters:\n* $1 - section title",
        "thumbnail_dest_directory": "Used as thumbnail error message.\n\nSee also:\n* {{msg-mw|Thumbnail error}}\n* {{msg-mw|Thumbnail-temp-create}}\n* {{msg-mw|Thumbnail-dest-create}}\n* {{msg-mw|Thumbnail invalid params}}",
        "thumbnail_image-type": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}",
        "thumbnail_gd-library": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}.\n*$1 is a function name of the GD library",
+       "thumbnail_image-size-zero": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}.\n*$1 is the path incl. filename of the image with zero size",
        "thumbnail_image-missing": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}.\n*$1 is the path incl. filename of the missing image",
        "thumbnail_image-failure-limit": "Used as <code>$1</code> in {{msg-mw|Thumbnail error}}.\n\nParameters:\n* $1 - the maximum allowed number of failed attempts",
        "import": "The title of the special page [[Special:Import]];",
        "signature-anon": "{{notranslate}}\nUsed as signature for anonymous user. Parameters:\n* $1 - username (IP address?)\n* $2 - nickname (IP address?)\nSee also:\n* {{msg-mw|Signature}} - signature for registered user",
        "timezone-utc": "{{optional}}",
        "timezone-local": "Label to indicate that a time is in the user's local timezone.\n{{Identical|Local}}",
-       "duplicate-defaultsort": "See definition of [[w:Sorting|sort key]] on Wikipedia. Parameters:\n* $1 - old default sort key\n* $2 - new default sort key",
+       "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
        "duplicate-displaytitle": "Warning shown when a page has its display title set multiple times. Parameters:\n* $1 - old display title\n* $2 - new display title",
        "restricted-displaytitle": "Warning shown when a display title is ignored because it is not equivalent to its actual title. Parameters:\n* $1 - the ignored display title",
        "invalid-indicator-name": "Warning shown when the [https://www.mediawiki.org/wiki/Help:Page_status_indicators &lt;indicator name=\"''unique-identifier''\">''content''&lt;/indicator>] parser tag is used incorrectly.",
index ab0277a..edf5b8f 100644 (file)
        "newpageletter": "M",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[$1 watiqachkaq {{PLURAL:$1|ruraq|ruraqkuna}}]",
-       "rc_categories": "Kay katiguriyakunaman saywachay (\"|\" nisqawan rakisqa)",
-       "rc_categories_any": "Imallapas",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} hukchasqa kaptinña",
        "newsectionsummary": "Musuq raki: /* $1 */",
        "rc-enhanced-expand": "Imaymanachakunata rikuchiy",
index 30cb14a..fa48180 100644 (file)
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilisader|utilisaders}} observeschan quest artitgel]",
-       "rc_categories": "Be paginas ord las categorias (seperar cun \"|\")",
-       "rc_categories_any": "Tuts",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} suenter la midada",
        "newsectionsummary": "Nov chapitel /* $1 */",
        "rc-enhanced-expand": "Mussar detagls",
index e4f3e9f..2386dc4 100644 (file)
        "rcfilters-filter-editsbyself-label": "Modificările tale",
        "rcfilters-filter-editsbyself-description": "Contribuțiile tale.",
        "rcfilters-filter-editsbyother-label": "Contribuțiile altora",
-       "rcfilters-filter-editsbyother-description": "Toate modificările mai puțin ale tale.",
+       "rcfilters-filter-editsbyother-description": "Toate modificările cu excepția celor proprii.",
        "rcfilters-filtergroup-userExpLevel": "Nivelul de experiență a utilizatorilor",
        "rcfilters-filter-user-experience-level-registered-label": "Înregistrat",
        "rcfilters-filter-user-experience-level-registered-description": "Editorii conectați.",
        "rcfilters-filter-minor-description": "Modificări pe care autorul le-a marcat ca fiind minore.",
        "rcfilters-filter-major-label": "Modificări non-minore",
        "rcfilters-filter-major-description": "Modificări care nu sunt etichetate ca minore.",
-       "rcfilters-filtergroup-watchlist": "Pagini urmărite de dv.",
-       "rcfilters-filter-watchlist-watched-label": "Listă de urmărire",
-       "rcfilters-filter-watchlist-watched-description": "Modificări are paginilor urmărite de dv.",
-       "rcfilters-filter-watchlist-watchednew-label": "Modificari ale listei urmărite de dv.",
+       "rcfilters-filtergroup-watchlist": "Pagini urmărite de dvs.",
+       "rcfilters-filter-watchlist-watched-label": "În lista de pagini urmărite",
+       "rcfilters-filter-watchlist-watched-description": "Modificări ale paginilor urmărite de dvs.",
+       "rcfilters-filter-watchlist-watchednew-label": "Modificări noi ale paginilor urmărite de dvs.",
        "rcfilters-filter-watchlist-watchednew-description": "Modificările paginilor urmărite care nu au fost vizitate de la efectuarea schimbărilor.",
        "rcfilters-filter-watchlist-notwatched-label": "Care nu sunt pe lista urmărită de dv.",
        "rcfilters-filter-watchlist-notwatched-description": "Totul, cu excepția modificărilor aduse paginilor urmărite de dvs.",
        "rcfilters-filter-pageedits-label": "Editări ale paginii",
        "rcfilters-filter-pageedits-description": "Editări ale conținutului wiki, discuții, descrieri de categorii…",
        "rcfilters-filter-newpages-label": "Creare de pagini",
-       "rcfilters-filter-newpages-description": "Modificări care creează pagini noi.",
-       "rcfilters-filter-categorization-label": "Modificări de categorie",
+       "rcfilters-filter-newpages-description": "Modificări care au dus la crearea de pagini noi.",
+       "rcfilters-filter-categorization-label": "Modificări de categorii",
        "rcfilters-filter-categorization-description": "Înregistrări ale paginilor adăugate sau eliminate din categorii.",
        "rcfilters-filter-logactions-label": "Acțiuni logate",
        "rcfilters-filter-logactions-description": "Acțiuni administrative, creare de conturi, ștergere de pagini, încărcări…",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilizator|utilizatori|de utilizatori}} care urmăresc]",
-       "rc_categories": "Limitează la categoriile (separate prin „|”):",
-       "rc_categories_any": "Oricare dintre cele alese",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|octet|octeți|de octeți}} după modificare",
        "newsectionsummary": "/* $1 */ secțiune nouă",
index 1c77450..640c040 100644 (file)
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utende|utinde}} ca condrollene]",
-       "rc_categories": "Limite de le categorije (separate cu \"|\")",
-       "rc_categories_any": "Qualsiasi de le scacchiate",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} apprisse 'u cangiamende",
        "newsectionsummary": "/* $1 */ seziona nove",
index d7c8990..e4f7dd8 100644 (file)
                        "Staspotanin2",
                        "Edible Melon",
                        "Adam-Yourist",
-                       "MaksimPinigin"
+                       "MaksimPinigin",
+                       "Smigles"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "diff-empty": "(нет различий)",
        "diff-multi-sameuser": "(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показано $1 промежуточных версий}} этого же участника)",
        "diff-multi-otherusers": "(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показано $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})",
-       "diff-multi-manyusers": "({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточные версии, сделанные|не показано $1 промежуточных версий, сделанных}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})",
        "diff-paragraph-moved-tonew": "Параграф был перемещён. Нажмите, чтобы перейти к новому местоположению.",
        "diff-paragraph-moved-toold": "Пункт был перемещен. Нажмите, чтобы перейти к старому местоположению.",
        "difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "boteditletter": "б",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдающий участник|наблюдающих участника|наблюдающих участников}}]",
-       "rc_categories": "Только из категорий (разделитель «|»):",
-       "rc_categories_any": "Любая из выбранных",
        "rc-change-size-new": "Размер после изменения: $1 {{PLURAL:$1|байт|байта|байт}}",
        "newsectionsummary": "/* $1 */ новая тема",
        "rc-enhanced-expand": "Показать подробности",
        "rollback-success": "Откачены правки {{GENDER:$3|$1}}; возврат к версии {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Откачены правки $1; возврат к последней версии $2. [$3 Показать изменения]",
        "sessionfailure-title": "Ошибка сеанса",
-       "sessionfailure": "Ð\9fоÑ\85оже, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ Ð¿Ñ\80облемÑ\8b Ñ\81 Ñ\82екÑ\83Ñ\89им Ñ\81еанÑ\81ом Ñ\80абоÑ\82Ñ\8b;\nÑ\8dÑ\82о Ð´ÐµÐ¹Ñ\81Ñ\82вие Ð±Ñ\8bло Ð¾Ñ\82менено Ð² Ñ\86елÑ\8fÑ\85 Ð¿Ñ\80едоÑ\82вÑ\80аÑ\89ениÑ\8f Â«Ð·Ð°Ñ\85ваÑ\82а Ñ\81еанÑ\81а».\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð½Ð°Ð¶Ð¼Ð¸Ñ\82е ÐºÐ½Ð¾Ð¿ÐºÑ\83 Â«Ð\9dазад» Ð¸ Ð¿ÐµÑ\80езагÑ\80Ñ\83зиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ñ\81 ÐºÐ¾Ñ\82оÑ\80ой Ð²Ñ\8b Ð¿Ñ\80иÑ\88ли.",
+       "sessionfailure": "Ð\9fоÑ\85оже, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ Ð¿Ñ\80облемÑ\8b Ñ\81 Ñ\82екÑ\83Ñ\89им Ñ\81еанÑ\81ом Ñ\80абоÑ\82Ñ\8b;\nÑ\8dÑ\82о Ð´ÐµÐ¹Ñ\81Ñ\82вие Ð±Ñ\8bло Ð¾Ñ\82менено Ð² Ñ\86елÑ\8fÑ\85 Ð¿Ñ\80едоÑ\82вÑ\80аÑ\89ениÑ\8f Â«Ð·Ð°Ñ\85ваÑ\82а Ñ\81еанÑ\81а».\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð¿ÐµÑ\80еоÑ\82пÑ\80авÑ\8cÑ\82е Ñ\84оÑ\80мÑ\83.",
        "changecontentmodel": "Редактирование контентной модели страницы",
        "changecontentmodel-legend": "Изменить модель содержимого",
        "changecontentmodel-title-label": "Заголовок страницы",
        "newimages-newbies": "Показать только вклад, сделанный с новых учётных записей",
        "newimages-showbots": "Показать загрузки ботов",
        "newimages-hidepatrolled": "Скрыть отпатрулированные загрузки",
-       "newimages-mediatype": "Ð\9cедиа Ñ\82ип:",
+       "newimages-mediatype": "Тип Ð¼ÐµÐ´Ð¸Ð°Ñ\84айла:",
        "noimages": "Изображения отсутствуют.",
        "gallery-slideshow-toggle": "Переключить миниатюры",
        "ilsubmit": "Найти",
        "watchlistedit-clear-titles": "Заголовки:",
        "watchlistedit-clear-submit": "Очистить список наблюдения (это необратимо!)",
        "watchlistedit-clear-done": "Ваш список наблюдения очищен.",
+       "watchlistedit-clear-jobqueue": "Ваш список наблюдения очищается. Это может занять некоторое время!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Была удалена|Были удалены|Было удалено}} $1 {{PLURAL:$1|запись|записи|записей}}:",
        "watchlistedit-too-many": "Слишком много страниц для того, чтобы показать их здесь.",
        "watchlisttools-clear": "Очистить список наблюдения",
        "specialpages-group-other": "Другие служебные страницы",
        "specialpages-group-login": "Представиться / Зарегистрироваться",
        "specialpages-group-changes": "Свежие правки и журналы",
-       "specialpages-group-media": "Отчёты о медиа-материалах и загрузка",
+       "specialpages-group-media": "Отчёты о медиаматериалах и загрузка",
        "specialpages-group-users": "Участники и права",
        "specialpages-group-highuse": "Интенсивно используемые страницы",
        "specialpages-group-pages": "Списки страниц",
        "tags-edit-add": "Добавить эти метки:",
        "tags-edit-remove": "Удалить эти метки:",
        "tags-edit-remove-all-tags": "(удалить все метки)",
-       "tags-edit-chosen-placeholder": "Выберите один или несколько тэгов",
+       "tags-edit-chosen-placeholder": "Выберите один или несколько тегов",
        "tags-edit-chosen-no-results": "Соответствующие метки не найдены",
        "tags-edit-reason": "Причина:",
        "tags-edit-revision-submit": "Применить изменения к {{PLURAL:$1|этой версии|$1 версиям}}",
        "default-skin-not-found-no-skins": "Упс! Тема оформления по умолчанию для вашей вики <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\nУ вас нет установленных тем оформления.\n\n; Если вы только что установили или обновили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. MediaWiki версии 1.24 и новее не содержат темы оформления в основном репозитории. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* скачав [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений; вы можете скопировать папку <code>skins/</code> из него;\n:* скачав архивы отдельных тем оформления с [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins использовав Git для загрузки тем оформления].\n: Это не должно навредить вашему репозиторию Git, если вы разработчик MediaWiki. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] с информацией о том, как включить темы оформления и выбрать тему по умолчанию.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (включено)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>отключено</strong>)",
-       "mediastatistics": "Ð\9cедиа-Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ика",
+       "mediastatistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика Ð¼ÐµÐ´Ð¸а",
        "mediastatistics-summary": "Статистические данные о типах загруженных файлов. Она включает информацию только о последних версиях файлов. Более старые или удалённые версии файлов не учитываются.",
        "mediastatistics-nfiles": "$1 ($2%)",
        "mediastatistics-nbytes": "$1 {{PLURAL:$1|байт|байта|байт}} ($2; $3%)",
index 712c93e..2eb7f44 100644 (file)
        "newpageletter": "Н",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|слїдуючій хоснователь|слїдуючі хоснователї|слїдуючіх хоснователїв}}]",
-       "rc_categories": "Лем з катеґорій (роздїлёвач «|»)",
-       "rc_categories_any": "Будь-якый",
        "rc-change-size-new": "$1 {{PLURAL:$1|байтt|байты|байтів}} по змінї",
        "newsectionsummary": "/* $1 */ нова секція",
        "rc-enhanced-expand": "Вказати детайлы",
index 666f91a..0c2f265 100644 (file)
        "newpageletter": "(नवीनम्)",
        "boteditletter": "(बोट्)",
        "number_of_watching_users_pageview": "[$1 अवलोकयति {{PLURAL:$1|सदस्यः|सदस्याः}}]",
-       "rc_categories": "वर्गान् नियतीकरोतु ।",
-       "rc_categories_any": "कश्चित्",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} परिवर्तनपश्चात् ।",
        "newsectionsummary": "/* $1 */ नवीनविभागः",
        "rc-enhanced-expand": "विवरणानि दृश्यन्ताम्",
index 55494e2..5820e6e 100644 (file)
        "newpageletter": "С",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 кэтиир {{PLURAL:$1|кыттааччы|кыттааччылар}}]",
-       "rc_categories": "Бу эрэ категориялартан (араарар бэлиэ \"|\")",
-       "rc_categories_any": "Талыллыбыттан хайата баҕарар",
        "rc-change-size-new": "Уларытыы кээмэйэ: $1 баайт",
        "newsectionsummary": "/* $1 */ саҥа сиэксийэ",
        "rc-enhanced-expand": "Сиһилии көрдөр",
index d5cb44a..22178a0 100644 (file)
        "december-date": "ᱰᱤᱥᱮᱢᱵᱚᱨ $1",
        "pagecategories": "{{PLURAL:$1|ᱛᱷᱚᱠ|ᱛᱷᱚᱠᱠᱩ}}",
        "category_header": "ᱛᱷᱚᱠ ᱨᱮᱱ ᱥᱟᱦᱴᱟᱞᱩ \"$1\"",
-       "subcategories": "Huḍiń rokom sokomko",
-       "category-media-header": "\"$1\" babot reaḱ rokom sokomte emen meḍiya rẽtko",
+       "subcategories": "ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠᱠᱩ",
+       "category-media-header": "\"$1\" ᱵᱟᱵᱚᱛ ᱨᱮᱭᱟᱜ ᱢᱤᱰᱤᱭᱟ ᱛᱷᱚᱠ",
        "category-empty": "<em>ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮ ᱱᱮᱛᱚᱜ ᱩᱱᱩᱫᱩᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱥᱮ ᱢᱤᱰᱤᱭᱟ ᱵᱟᱱᱩᱜ-ᱟ᱾</em>",
        "hidden-categories": "{{PLURAL:$1|ᱫᱟᱱᱟᱝ ᱛᱷᱚᱠ|ᱫᱟᱱᱟᱝ ᱛᱷᱚᱠᱠᱩ}}",
        "hidden-category-category": "Uku akan rokom sokom ko",
-       "category-subcat-count": "{{PLURAL:$2| keṭagorire eken tayom hudińkeṭagori menaḱa. |Noa keṭagorire tayom menaḱa {{PLURAL:$1 hudińkeṭagoriko}}, jotokote $2}}",
+       "category-subcat-count": "{{PLURAL:$2| ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮ ᱱᱚᱣᱟᱠᱩ ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠ ᱠᱩ ᱢᱮᱱᱟᱜ-ᱟ|ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ {{PLURAL:$1|ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠᱠᱩ}}, ᱡᱚᱛᱚᱠᱚᱛᱮ $2}}",
        "category-subcat-count-limited": "Noa rokom sokomre latar reaḱ {{PLURAL:$1 gan kạṭic rokom sokom $1gan kạtic rokom sokom menaḱa}}",
        "category-article-count": "{{PLURAL:$2| ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮᱫᱚ ᱮᱠᱮᱱ ᱛᱟᱭᱚᱢᱛᱮᱱᱟᱜ ᱥᱟᱦᱴᱟ ᱢᱮᱱᱟᱜ-ᱟ᱾| ᱛᱟᱭᱚᱢ {{PLURAL:$2| ᱥᱟᱦᱴᱟ ᱫᱚ |$1 ᱥᱟᱦᱴᱟᱠᱚ ᱠᱟᱱᱟ}} ᱱᱤᱭᱟᱹ ᱛᱷᱚᱠᱨᱮ, ᱥᱟᱱᱟᱢᱠᱚᱛᱮ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ $2 ᱾}}",
        "category-article-count-limited": "Noa {{PLURAL:$1 sakam sakamko}} rokom sokomre menaḱa.",
        "category-file-count": "{{PLURAL:$2|ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮᱭᱟᱜ ᱩᱱᱩᱫᱩᱜ ᱫᱚ ᱮᱠᱮᱱ ᱯᱟᱸᱡᱟᱸ ᱨᱮᱫ ᱜᱮ᱾| ᱱᱚᱣᱟ ᱯᱟᱸᱡᱟᱸ \n{{PLURAL:$1|ᱨᱮᱫ ᱫᱚ|$1 ᱨᱮᱫ ᱫᱚᱠᱚ}} ᱱᱤᱭᱟᱹ ᱛᱷᱚᱠᱨᱮ $2 ᱡᱚᱛᱚᱜᱮ᱾}}",
        "category-file-count-limited": "Latar reaḱ {{PLURAL:$1 rẽt rẽtko}} noa rokom sokomre menaḱa.",
-       "listingcontinuesabbrev": "Calaḱa",
+       "listingcontinuesabbrev": "ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ",
        "index-category": "ᱩᱱᱩᱫᱩᱜ-ᱟᱱ ᱥᱟᱦᱴᱟᱠᱚ",
        "noindex-category": "ᱩᱱᱩᱫᱩᱜ ᱵᱟᱹᱱᱩᱜ-ᱟᱱ ᱥᱟᱦᱴᱟᱠᱚ",
        "broken-file-category": "ᱨᱟᱹᱯᱩᱫ ᱨᱮᱫ ᱡᱚᱱᱚᱲᱠᱩ ᱥᱟᱞᱟᱫ ᱥᱟᱦᱴᱟᱠᱚ",
-       "about": "Lạgitte, Lạgti",
+       "about": "ᱞᱟᱹᱜᱤᱛ",
        "article": "ᱩᱱᱩᱫᱩᱜ ᱥᱟᱦᱴᱟ",
        "newwindow": "(ᱱᱟᱣᱟ ᱡᱟᱱᱞᱟᱨᱮ ᱡᱷᱤᱡ ᱢᱮ)",
        "cancel": "ᱵᱟᱫᱽ",
        "variants": "ᱮᱴᱟᱜᱠᱳ",
        "navigation-heading": "ᱟᱪᱩᱨᱵᱟᱲᱟ ᱢᱮᱱᱩ",
        "errorpagetitle": "vul",
-       "returnto": "$1 te ruar-rok' me",
+       "returnto": "$1 ᱛᱮ ᱨᱩᱭᱟᱹᱲᱚᱜ ᱢᱮ",
        "tagline": " {{SITENAME}} ᱠᱷᱚᱱ",
        "help": "ᱜᱚᱸᱲᱚᱸ",
        "search": "ᱥᱮᱸᱫᱽᱨᱟ",
        "otherlanguages": "ᱮᱴᱟᱜ ᱯᱟᱹᱨᱥᱤ ᱛᱮ",
        "redirectedfrom": "($1 ᱠᱷᱚᱱ ᱟᱹᱪᱩᱨ ᱦᱮᱡᱠᱟᱱᱟ)",
        "redirectpagesub": "ᱵᱟᱝ ᱥᱚᱡᱽᱦᱮ ᱥᱟᱦᱴᱟ",
-       "redirectto": "Ar hõ udugoḱakana:",
+       "redirectto": "ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ:",
        "lastmodifiedat": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱢᱩᱪᱟᱹᱫ ᱫᱷᱟᱣ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ  $1 ᱢᱟᱹᱦᱤᱛ,  $2 ᱚᱠᱛᱚᱨᱮ",
        "viewcount": "Noa sakamdo {{PLURAL:$1 dhom $1 dhom}} udug hoena.",
        "protectedpage": "Rukhíạ sakamko",
        "disclaimers": "ᱫᱟᱹᱵᱤ ᱵᱟᱱᱩᱜᱠᱳ",
        "disclaimerpage": "Project: ᱥᱟᱫᱷᱟᱨᱚᱱ ᱫᱟᱹᱵᱤ ᱵᱟᱱᱩᱜᱠᱩ",
        "edithelp": "ᱥᱟᱯᱲᱟᱣ ᱜᱚᱸᱲᱚᱸ",
-       "helppage-top-gethelp": "á±\9cá±\9aá±²á±\9a",
+       "helppage-top-gethelp": "á±\9cá±\9aᱸᱲá±\9aᱸ",
        "mainpage": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ",
        "mainpage-description": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ",
        "policy-url": "Project:Ritiniti",
        "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
        "ok": "Ṭhik gea",
        "retrievedfrom": "\"$1\" ᱠᱷᱚᱱ ᱧᱟᱢ ᱟᱹᱜᱩᱭ",
-       "youhavenewmessages": "Amaḱ do $1 ($2) menaḱa",
+       "youhavenewmessages": "{{PLURAL:$3|ᱟᱢᱟᱜ ᱢᱮᱱᱟᱜ-ᱟ}} $1 ($2)᱾",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|ᱟᱢ ᱫᱚ}} $1 ᱠᱷᱚᱱ {{PLURAL:$3|ᱟᱨᱢᱤᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ|$3 ᱵᱷᱮᱵᱷᱟᱨᱩᱭᱟᱹ}} ($2) ᱾",
        "newmessageslinkplural": "{{PLURAL:$1|ᱢᱤᱫ ᱱᱟᱶᱟ ᱢᱮᱥᱮᱡᱽ|999=ᱱᱟᱶᱟ ᱢᱮᱥᱮᱡᱽᱠᱚ}}",
        "newmessagesdifflinkplural": "ᱢᱩᱪᱟᱹᱫ {{PLURAL:$1|ᱵᱚᱫᱚᱞ|999=ᱵᱚᱫᱚᱞᱠᱚ}}",
        "youhavenewmessagesmulti": "ᱟᱢᱟᱜ ᱱᱟᱣᱟ ᱠᱷᱚᱵᱟᱨᱠᱚ ᱫᱚ $1 ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ",
        "editsection": "ᱥᱟᱯᱲᱟᱣ",
        "editold": "ᱥᱟᱯᱲᱟᱣ",
-       "viewsourceold": "Ńamoḱ jayga",
+       "viewsourceold": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞ",
        "editlink": "ᱥᱟᱯᱲᱟᱣ",
        "viewsourcelink": "ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨ ᱧᱮᱞᱢᱮ",
        "editsectionhint": "ᱥᱟᱯᱲᱟᱣ ᱡᱟᱭᱜᱟ: $1",
        "site-rss-feed": "$1 RSS feed",
        "site-atom-feed": " $1 ᱡᱚᱢ ᱚᱪᱚ",
        "page-rss-feed": "\"$1\" RSS feed",
-       "page-atom-feed": "\"$1\" khon khudri jom",
+       "page-atom-feed": " $1 ᱡᱚᱢ ᱚᱪᱚ",
        "red-link-title": "$1 (ᱱᱤᱭᱟᱹ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ)",
        "sort-descending": "Ulṭạo horop lekate sajao",
        "sort-ascending": "Horop lekate sajao",
        "nstab-special": "ᱚᱥᱚᱠᱟᱭᱛᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ",
        "nstab-project": "ᱯᱨᱚᱡᱮᱠᱴ ᱥᱟᱦᱴᱟ",
        "nstab-image": "ᱨᱮᱫ",
-       "nstab-mediawiki": "Mesag",
+       "nstab-mediawiki": "ᱠᱷᱚᱵᱚᱨ",
        "nstab-template": "ᱪᱷᱟᱸᱪ",
        "nstab-help": "ᱜᱚᱸᱲᱚ ᱥᱟᱦᱴᱟ",
        "nstab-category": "ᱛᱷᱚᱠ",
        "badarticleerror": "Noa sakamre kạmiko do baṅ puraolena.",
        "cannotdelete": "$1 sakam se rẽt do baṅ get giḍilena.\nPasec eṭaḱ hoṛ noa do lahareko get giḍi akada.",
        "cannotdelete-title": "\"$1\" Sakam do baṅ get giḍiḱkana",
-       "badtitle": "barich' bishó́́́́y",
+       "badtitle": "ᱵᱟᱹᱨᱤᱡ ᱴᱟᱭᱴᱮᱞ",
        "badtitletext": "ᱟᱢᱮᱢ ᱱᱮᱦᱚᱨᱟᱠᱟᱱ ᱥᱟᱦᱴᱟ ᱧᱤᱛᱩᱢ ᱫᱚ ᱵᱟᱝ ᱴᱷᱤᱠᱟ, ᱠᱷᱟᱹᱞᱤ ᱥᱮ ᱵᱷᱩᱞᱜᱮ ᱵᱷᱤᱛᱨᱤ ᱯᱟᱹᱨᱥᱤᱛᱮ ᱥᱮ ᱩᱭᱠᱤ ᱴᱟᱭᱴᱮᱞ ᱛᱮ ᱡᱚᱱᱚᱲ ᱜᱮᱭᱟ᱾\nᱱᱚᱣᱟᱨᱮ ᱫᱚ ᱢᱤᱫ ᱥᱮ ᱟᱭᱢᱟ ᱩᱱᱩᱫᱩᱜ ᱢᱮᱱᱟᱜ ᱚᱠᱟ ᱫᱚ ᱧᱤᱛᱩᱢᱨᱮ ᱵᱟᱝ ᱵᱮᱵᱦᱟᱨᱚᱜ᱾",
        "querypage-no-updates": "Noa sakam reaḱ nahaḱ halot bondo gea. Nonḍe doho akana ḍaṭako do baṅ saphaḱa.",
        "viewsource": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞ",
-       "viewsource-title": "$1 renaḱ ńamoḱ ṭhại ńelmẽ",
+       "viewsource-title": "$1 ᱨᱮᱱᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞᱢᱮ",
        "actionthrottled": "Kạmi reaḱ dhara bại",
        "protectedpagetext": "Noa sakam do ol toṅge lạgit́te do bańcao gea.",
        "viewsourcetext": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱢ ᱧᱮᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨᱮᱢ ᱠᱚᱯᱤ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾",
        "yourpasswordagain": "Arhõ oku namber olme",
        "createacct-yourpasswordagain": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱴᱷᱟᱹᱣᱠᱟᱹᱭ ᱢᱮ",
        "createacct-yourpasswordagain-ph": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱟᱫᱮᱨᱢᱮ ᱫᱚᱲᱦᱟ",
-       "userlogin-remembermypassword": "Bolo thirege dohokạńme",
+       "userlogin-remembermypassword": "ᱵᱚᱞᱚ ᱛᱷᱤᱨᱜᱮ ᱫᱚᱦᱚᱠᱟᱹᱧᱢᱮ",
        "yourdomainname": "Amaḱ ḍomen:",
        "externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.",
        "login": "ᱵᱚᱞᱚᱜ ᱢᱮ",
        "nav-login-createaccount": "Boloḱ́ duạr / ekaunt tearme",
-       "logout": "Bahre oḍoń",
-       "userlogout": "Bahre oḍoń",
-       "notloggedin": "Bhitri baṅ bolokana",
+       "logout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ",
+       "userlogout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ",
+       "notloggedin": "ᱵᱟᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ",
        "userlogin-noaccount": "ᱠᱷᱟᱛᱟ ᱵᱟᱹᱱᱩᱜ ᱛᱟᱢᱟ?",
        "userlogin-joinproject": "ᱠᱷᱚᱸᱡᱟ {{SITENAME}}",
-       "createaccount": "Ṭhai benaome",
+       "createaccount": "á± á±·á±\9fá±\9bá±\9f á±\9bᱮᱭá±\9fᱨᱢᱮ",
        "userlogin-resetpassword-link": "ᱟᱢᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱦᱤᱲᱤᱧ ᱠᱮᱫᱟᱢ?",
-       "userlogin-helplink2": "Bolon khạtir go̠ṛo̠",
+       "userlogin-helplink2": "ᱵᱚᱞᱚᱜ ᱠᱷᱟᱹᱛᱤᱨ ᱜᱚᱸᱲᱚᱸ",
        "userlogin-createanother": "ᱮᱴᱟᱜ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ",
        "createacct-emailrequired": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ",
        "createacct-emailoptional": "Email ᱴᱷᱤᱠᱱᱟ (ᱵᱟᱹᱲᱛᱤᱛᱮ)",
        "login-abort-generic": "Amaḱ bhitri boloḱ do baṅ hoylena - batena.",
        "loginlanguagelabel": "ᱯᱟᱹᱨᱥᱤ: $1",
        "pt-login": "ᱵᱚᱞᱚᱜ ᱫᱩᱭᱟᱹᱨ",
-       "pt-login-button": "Bolon",
+       "pt-login-button": "ᱵᱚᱞᱚᱜ ᱢᱮ",
        "pt-createaccount": "ᱴᱷᱟᱭ ᱵᱮᱱᱟᱣᱢᱮ",
        "pt-userlogout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ",
        "user-mail-no-addy": "Jahan e-mail ṭhikana bạgi kate e-mail kul kurumuṭu hoena.",
        "passwordreset-disabled": "Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.",
        "passwordreset-username": "Beoharicaḱ ńutum:",
        "passwordreset-domain": "Ḍomen:",
-       "passwordreset-email": "E-mail ṭhikạna:",
+       "passwordreset-email": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ:",
        "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko",
-       "passwordreset-emailelement": "Beoharićaḱ ńutum: \n$1\n\nMit́ ghạṛi lạgit uku nambar: \n$2",
+       "passwordreset-emailelement": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ: \n$1\n\nᱢᱤᱫ ᱜᱷᱟᱹᱲᱤ ᱞᱟᱹᱜᱤᱛ ᱫᱟᱱᱟᱝ ᱱᱟᱵᱟᱫᱽ: \n$2",
        "passwordreset-emailsentemail": "Mitṭen disạ ruaṛ e-mail do kulena.",
        "changeemail": "email ᱴᱷᱤᱠᱱᱟ ᱵᱚᱫᱚᱞ ᱢᱮ ᱥᱮ ᱚᱪᱚᱜᱽ ᱢᱮ",
        "changeemail-header": "Ekaunṭ e-mail ṭhikạna do bodolme",
        "changeemail-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.",
-       "changeemail-oldemail": "Nitaḱ e-mail ṭhikạna:",
+       "changeemail-oldemail": "ᱱᱮᱛᱚᱜ-ᱟᱜ email ᱴᱷᱤᱠᱟᱹᱱᱟ",
        "changeemail-newemail": "ᱱᱟᱣᱟ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ:",
-       "changeemail-none": "(Okaṭaḱ hõ baṅ)",
+       "changeemail-none": "(ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱱᱩᱜ-ᱟ)",
        "changeemail-password": "ᱟᱢᱟᱜ {{SITENAME}} ᱩᱠᱩ ᱮᱞᱥᱚᱝ:",
-       "changeemail-submit": "E-mail bodolme",
+       "changeemail-submit": "E-mail ᱵᱚᱫᱚᱞᱢᱮ",
        "bold_sample": "ᱢᱚᱴᱟ ᱚᱞ",
        "bold_tip": "ᱢᱚᱴᱟ ᱚᱞ",
        "italic_sample": "ᱜᱷᱟᱸᱡᱮᱲ ᱚᱞ",
        "italic_tip": "ᱜᱷᱟᱸᱡᱮᱲ ᱚᱞ",
-       "link_sample": "Joṛaotet́ reaḱ bohoḱ",
+       "link_sample": "ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ",
        "link_tip": "ᱵᱷᱤᱛᱨᱤ ᱡᱚᱱᱚᱲ",
-       "extlink_sample": "http://www.nạmuna.makaṛgạṭi ạmạli",
+       "extlink_sample": "http://www.example.com ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ",
        "extlink_tip": "ᱵᱟᱨᱦᱮ ᱨᱮᱱᱟᱜ ᱡᱚᱱᱚᱲ (ᱫᱤᱥᱟᱹᱭᱢᱮ http://prefix)",
        "headline_sample": "ᱵᱚᱦᱚᱜ ᱨᱮᱱᱟᱜ ᱚᱞ",
-       "headline_tip": "level 2 guḍkatha",
-       "nowiki_sample": "Begor format olko bhoraome",
-       "nowiki_tip": "wiki formatting bạgiyaḱme",
+       "headline_tip": "ᱞᱮᱵᱷᱮᱞ ᱒ ᱦᱮᱰᱞᱟᱭᱤᱱ",
+       "nowiki_sample": "ᱵᱮᱜᱚᱨ ᱯᱷᱚᱨᱢᱮᱴ ᱚᱞᱠᱩ ᱵᱷᱚᱨᱟᱣᱢᱮ",
+       "nowiki_tip": "ᱣᱤᱠᱤ ᱯᱷᱚᱨᱢᱟᱴᱤᱝ ᱵᱟᱹᱜᱤᱭᱢᱮ",
        "image_tip": "ᱛᱚᱞᱟᱠᱟᱱ ᱨᱮᱫ",
        "media_tip": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ",
-       "sig_tip": "Amaḱ suhi sãote okte",
-       "hr_tip": "Barabạri dag",
-       "summary": "Guṭ katha",
+       "sig_tip": "ᱟᱢᱟᱜ ᱥᱩᱦᱤ ᱥᱟᱶᱛᱮ ᱚᱠᱛᱚ ᱪᱷᱟᱯ",
+       "hr_tip": "ᱵᱟᱨᱟᱵᱟᱹᱨᱤ ᱫᱟᱜᱽ",
+       "summary": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ:",
        "subject": "ᱥᱟᱛᱟᱢ:",
        "minoredit": "ᱱᱚᱣᱟ ᱫᱚ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱱᱟ",
        "watchthis": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ",
        "savechanges": "ᱵᱚᱫᱚᱞᱠᱚ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ",
        "publishpage": "ᱥᱟᱦᱴᱟ ᱯᱟᱨᱥᱟᱞ ᱢᱮ",
        "publishchanges": "ᱵᱚᱫᱚᱞᱠᱚ ᱯᱟᱨᱥᱟᱞ ᱢᱮ",
-       "preview": "Ńel, Unuduḱ",
-       "showpreview": "Unuduḱ",
+       "preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
+       "showpreview": "ᱧᱮᱞᱡᱚᱝ ᱩᱫᱩᱜᱽᱢᱮ",
        "showdiff": "ᱵᱚᱫᱚᱞᱠᱩ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "anoneditwarning": "<strong>ᱦᱩᱥᱤᱭᱟᱹᱨ:</strong> ᱟᱢ ᱵᱟᱢ ᱵᱚᱞᱚᱣᱟᱠᱟᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ ᱡᱟᱦᱟᱸᱱᱟᱜ ᱥᱟᱯᱲᱟᱣᱟᱢ ᱟᱢᱟᱜ IP ᱵᱩᱴᱟᱹ ᱥᱚᱫᱚᱨ ᱛᱟᱦᱮᱸᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ [$1 ᱵᱚᱞᱚᱱᱟᱢ]</strong> ᱟᱨᱵᱟᱝ <strong>[$2 ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱟᱢ]</strong>, ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱩᱫᱩᱜᱚᱜ-ᱟ ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ, ᱥᱟᱶᱛᱮ ᱮᱴᱟᱜ ᱥᱩᱵᱤᱫᱷᱟ ᱠᱚ ᱾",
        "anonpreviewwarning": "\"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa.\"",
        "missingcommenttext": "ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱠᱟᱛᱷᱟ ᱵᱚᱞᱚᱭ ᱢᱮ᱾",
        "summary-preview": "Guṭ katha unuduḱ:",
        "subject-preview": "Babot/Guṭkatha unuduḱ:",
-       "blockedtitle": "Beoharić doe eset ocoakana.",
+       "blockedtitle": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱫᱚ ᱮᱥᱮᱛ ᱚᱪᱚᱟᱠᱟᱱᱟ",
        "blockedtext": "<strong>ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ ᱟᱨᱵᱟᱝ IP ᱵᱩᱴᱟᱹ ᱫᱚ ᱵᱚᱸᱫᱽ ᱟᱠᱟᱱᱟ ᱾ </strong>\n\nᱱᱚᱶᱟ ᱵᱚᱸᱫᱽ ᱫᱚ $1 ᱫᱟᱨᱟᱭᱛᱮ ᱦᱩᱭᱟᱠᱱᱟ ᱾\nᱱᱚᱶᱟ ᱨᱮᱱᱟᱜ ᱚᱡᱮ ᱫᱚ ᱮᱢᱮᱱᱟ <em>$2</em>.\n\n* ᱵᱚᱸᱫᱽ ᱮᱦᱚᱵ: $8\n* ᱵᱚᱸᱫᱽ ᱢᱩᱪᱟᱹᱫ: $6\n* ᱟᱥᱟᱦᱟᱱ ᱵᱚᱸᱫᱽᱠᱚ: $7\n\nᱟᱢ $1 ᱮᱢ ᱥᱟᱹᱜᱟᱹᱭ ᱫᱟᱲᱮᱭᱟᱭᱟ ᱵᱟᱝᱠᱷᱟᱱ ᱮᱴᱟᱜ [[{{MediaWiki:Grouppage-sysop}}|ᱟᱰᱢᱤᱱᱤᱥᱴᱨᱮᱴᱚᱨ]] ᱵᱚᱸᱫᱽ ᱵᱟᱵᱚᱫᱽ ᱛᱮ ᱜᱟᱞᱚᱪ ᱞᱟᱹᱜᱤᱫ ᱾\nᱟᱢ ᱵᱟᱢ ᱵᱮᱵᱷᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ \"email this user\" ᱥᱩᱵᱤᱫᱷᱟ ᱡᱚᱛᱷᱟᱛ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱛᱟᱢ ᱵᱟᱝ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱟᱨ ᱱᱚᱶᱟ ᱫᱚ ᱪᱤᱱᱦᱟᱹᱣ-ᱟ [[Special:Preferences|ᱠᱷᱟᱛᱟ ᱧᱮᱞᱚᱚᱜ]] ᱠᱷᱚᱱ ᱟᱨ ᱟᱢ ᱫᱚ ᱵᱟᱢ ᱵᱚᱸᱫᱽ ᱟᱠᱟᱱᱟ ᱱᱚᱶᱟ ᱵᱮᱵᱷᱟᱨ ᱠᱷᱚᱱ ᱾\nᱟᱢᱟᱜ ᱱᱤᱛᱚᱜᱟᱜ IP ᱵᱩᱴᱟᱹ ᱫᱚ $3, ᱟᱨ ᱵᱚᱸᱫᱽ ID ᱫᱚ #$5  \nᱫᱟᱭᱟᱠᱟᱛᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ ᱪᱮᱛᱟᱱᱟᱜ ᱠᱟᱛᱷᱟᱠᱚ ᱡᱚᱛᱚ ᱞᱮᱠᱟᱱ ᱠᱩᱠᱞᱤ ᱨᱮ ᱾",
-       "blockednoreason": "jahan babot baṅ em akana",
+       "blockednoreason": "ᱡᱟᱸᱦᱟᱸᱱ ᱚᱡᱮ ᱵᱟᱝ ᱮᱢᱠᱟᱱᱟ",
        "whitelistedittext": "Sakamre sompadon lạgit́te $1 em hoyoḱa.",
        "nosuchsectiontitle": "Pahaṭa bȧn ńamlena",
-       "loginreqtitle": "Boloḱ jạruṛa",
+       "loginreqtitle": "ᱵᱚᱞᱚᱜ ᱡᱟᱹᱨᱩᱲᱟ",
        "loginreqlink": "ᱵᱚᱞᱚᱜ ᱢᱮ",
        "loginreqpagetext": "Eṭagaḱ sakamko ńel lạgit́te do am $1 hoyoḱ jạruṛtama.",
        "accmailtitle": "Uku nambar do kulena.",
        "accmailtext": "[[User talk:$1 $1]] lạgit́te aćte benaoen uku nambar do $2 kul hoena.\nBhitri bolo kateḱ noa nãwã ekaunṭ lạgit uku nambar \"[[Special:ChangePassword Change password]]\" sakam khonem bodol daṛyakya.",
-       "newarticle": "(Nãwa)",
+       "newarticle": "(ᱱᱟᱣᱟᱱᱟᱜ)",
        "newarticletext": "ᱟᱢ ᱚᱠᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱡᱚᱱᱟᱲᱮᱢ ᱯᱟᱸᱡᱟᱸ ᱟᱹᱜᱩᱭᱫᱟ ᱚᱱᱚ ᱫᱚ ᱵᱟᱱᱩᱜ-ᱟ᱾\nᱚᱱᱟ ᱥᱟᱦᱴᱟ ᱛᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱛ ᱛᱮ, ᱞᱟᱛᱟᱨ ᱵᱟᱠᱥᱚ ᱵᱷᱤᱛᱨᱤᱨᱮ ᱚᱞ ᱮᱦᱚᱵ ᱢᱮ (ᱟᱨᱦᱚᱸ ᱡᱟᱹᱥᱛᱤ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱛᱴᱮ [$1 ᱜᱚᱸᱲᱚᱸ ᱥᱟᱦᱴᱟ] ᱯᱟᱸᱡᱚᱸᱭᱢᱮ)᱾\nᱟᱢ ᱵᱷᱩᱞᱛᱮ ᱱᱚᱸᱰᱮᱢ ᱦᱮᱡ ᱟᱠᱟᱱ ᱠᱷᱟᱡ, ᱟᱢᱟᱜ ᱵᱨᱟᱣᱡᱟᱨ ᱨᱮᱱᱟᱜ '''ᱛᱟᱭᱚᱢ''' ᱵᱟᱴᱚᱱ ᱞᱤᱱᱢᱮ᱾",
        "anontalkpagetext": "----\n\n<em>ᱱᱚᱶᱟ ᱫᱚ ᱜᱟᱞᱚᱪ ᱥᱟᱦᱴᱟ ᱠᱟᱱᱟ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱫᱚ ᱠᱷᱟᱛᱟ ᱵᱟᱭ ᱛᱮᱭᱟᱨ ᱟᱠᱟᱫᱟ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ, ᱟᱨᱵᱟᱝ ᱡᱟᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱫᱟ ᱱᱚᱶᱟ ᱾</em>\nᱚᱱᱟᱛᱮ ᱟᱞᱮ ᱮᱞᱮᱞ IP ᱞᱮ ᱵᱮᱵᱷᱟᱨᱮᱜ-ᱟ ᱩᱱᱤ ᱪᱤᱱᱦᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱾\nᱚᱱᱠᱟᱱ IP ᱵᱩᱴᱟᱹ ᱫᱚ ᱦᱟᱹᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱛᱤᱢᱤᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱟᱨᱟᱭᱛᱮ ᱾\nᱡᱩᱫᱤ ᱟᱢ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱟᱱᱟᱢ ᱟᱨ ᱵᱷᱟᱹᱵᱤᱭᱮᱜ-ᱟᱢ ᱵᱟᱝ ᱡᱚᱲᱟᱣᱟᱱ ᱠᱟᱛᱷᱟ ᱟᱢᱮ ᱩᱫᱩᱜᱢᱮ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ  [[Special:CreateAccount|ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ]] ᱟᱨᱵᱟᱝ [[Special:UserLogin|ᱞᱚᱜᱤᱱ]] ᱢᱮ ᱫᱟᱨᱟᱭ ᱵᱷᱮᱣᱱᱟ ᱠᱚ ᱥᱟᱦᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱮᱴᱟᱜ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱥᱟᱶ ᱾",
        "noarticletext": "ᱱᱮᱛᱚᱜ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱪᱮᱫᱜᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\nᱮᱴᱟᱜ ᱥᱟᱦᱴᱟᱨᱮᱢ [[Special:Search/{{PAGENAME}}|search for this page title]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
        "noarticletext-nopermission": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱱᱤᱛᱚᱜ ᱪᱮᱫᱜᱮ ᱚᱞ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\n\nᱟᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱨᱮᱱᱟᱜ ᱧᱤᱛᱩᱢᱮᱢ ᱥᱮᱸᱫᱽᱨᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ]] ᱮᱴᱟᱜ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮᱦᱚᱸ,\nᱟᱨᱵᱟᱝ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" ńutuman jahãe beoharićaḱ ekaunṭ do baṅ resṭri hoeakana. Daya kate biḍạo katet́ ńelmẽ noa sakam do benoa/sompadonem menet́ kana se baṅ.",
-       "userpage-userdoesnotexist-view": "Beoharićaḱ \"$1\" ekaunṭ do baṅ resṭire akana.",
+       "userpage-userdoesnotexist-view": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ \"$1\" ᱮᱠᱟᱣᱱᱴ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱟᱠᱟᱱᱟ᱾",
        "blocked-notice-logextract": "Nui beoharić do nitoḱe esetgea.\nRefarens lạgit́te nahaḱ boloḱ do latare em hoena:",
        "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
-       "updated": "(Halot ruaṛ)",
+       "updated": "(ᱦᱟᱞᱚᱛ ᱜᱮᱭᱟ)",
        "note": "'''Noṭ:'''",
-       "previewnote": "'''kheyalmẽ, noa do eken ńeloḱ lạgit.'''\nAmaḱ bodolaḱ kodo nit habićte bań rukhíạakana!",
+       "previewnote": "'''ᱠᱷᱮᱭᱟᱞᱢᱮ, ᱱᱚᱣᱟ ᱫᱚ ᱮᱠᱮᱱ ᱧᱮᱞᱚᱜ ᱞᱟᱹᱜᱤᱛ᱾'''\nᱟᱢᱟᱜ ᱵᱚᱫᱚᱞ ᱠᱚᱫᱚ ᱱᱤᱛ ᱫᱷᱟᱹᱵᱤᱡ ᱵᱟᱝ ᱨᱩᱠᱷᱤᱭᱟᱹᱣᱠᱟᱱᱟ!",
        "continue-editing": "ᱥᱟᱯᱲᱟᱣ ᱡᱟᱜᱟ ᱪᱟᱞᱟᱜ ᱢᱮ",
-       "editing": "Joṛao do purạena: $1",
+       "editing": "ᱥᱟᱯᱲᱟᱣ ᱪᱟᱞᱟᱜᱠᱟᱱᱟ $1",
        "creating": "$1 ᱛᱮᱭᱟᱨᱚᱜᱠᱟᱱᱟ",
        "editingsection": "ᱥᱟᱯᱲᱟᱣᱢᱮ $1 (ᱦᱟᱹᱴᱤᱧ)",
-       "editingcomment": "Sompadon akadae $1 (Nãwa pahaṭa)",
-       "editconflict": "Sompadon reaḱ bene bạiri: $1",
-       "yourtext": "Amaḱ ol",
+       "editingcomment": "ᱥᱟᱯᱲᱟᱣᱢᱮ $1 (ᱱᱟᱣᱟ ᱦᱟᱹᱴᱤᱧ)",
+       "editconflict": "ᱥᱟᱯᱲᱟᱣ ᱵᱟᱹᱭᱨᱤ: $1",
+       "yourtext": "ᱟᱢᱟᱜ ᱚᱞ",
        "storedversion": "ᱡᱚᱜᱟᱣᱠᱟᱱ ᱥᱩᱫᱷᱨᱟᱹᱣ",
-       "yourdiff": "Farak",
+       "yourdiff": "ᱯᱷᱟᱨᱟᱠ",
        "templatesused": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱵᱮᱵᱷᱟᱨᱟᱠᱟᱱ {{PLURAL:$1|ᱪᱷᱟᱸᱪ|ᱪᱷᱟᱸᱪᱠᱚ}} :",
        "templatesusedpreview": "{{PLURAL:$1|ᱪᱷᱟᱸᱪ|ᱪᱷᱟᱸᱪᱠᱚ}} ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱱᱟ ᱱᱟᱶᱟ ᱧᱮᱱᱮᱞᱨᱮ:",
        "template-protected": "(ᱨᱩᱠᱷᱤᱭᱟᱹ)",
-       "template-semiprotected": "(Kạṭic-rukhiyạ)",
+       "template-semiprotected": "(ᱦᱩᱰᱤᱧ ᱨᱩᱠᱷᱤᱭᱟᱹ)",
        "hiddencategories": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ {{PLURAL:$1 1 ᱩᱠᱩ ᱛᱷᱚᱠ|$1 ᱩᱠᱩ ᱛᱷᱚᱠᱠᱩ}} ᱜᱟᱶᱛᱟᱨᱮᱱᱜᱮ:",
        "nocreate-loggedin": "ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱛᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱱᱩᱜ-ᱟ᱾",
        "sectioneditnotsupported-title": "Pahaṭa sompadona do bae hataoeda",
        "sectioneditnotsupported-text": "Noa sompadona sakamre pahaṭa sompadona do bae hataoeda",
        "permissionserrors": "ᱟᱹᱭᱫᱟᱹᱨᱤ ᱦᱩᱲᱟᱹᱜ",
        "permissionserrorstext": "Noa kạmi amaḱ ạidạri do banuḱa, {{PLURAL:$1 gan karon reaḱ gan karon reaḱ}} lạgit:",
-       "permissionserrorstext-withaction": "Amaḱ $2 kạmire ạydạri do bạnuḱa, Ona reaḱ {{PLURAL:$1 Karon/ Karonko}}:",
+       "permissionserrorstext-withaction": "ᱟᱢᱟᱜ $2 ᱠᱟᱹᱢᱤᱨᱮ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱱᱩᱜ-ᱟ, ᱚᱱᱟ ᱨᱮᱭᱟᱜ {{PLURAL:$1 ᱠᱟᱨᱚᱱ/ ᱠᱟᱨᱚᱱᱠᱚ}}:",
        "recreate-moveddeleted-warn": "'''ᱥᱚᱱᱛᱚᱨᱚᱜᱢᱮ: ᱟᱢ ᱫᱚ ᱟᱨᱦᱚᱸ ᱫᱚᱲᱦᱟᱛᱮ ᱥᱟᱦᱴᱟᱢ ᱛᱮᱭᱟᱨᱫᱟ ᱡᱟᱸᱦᱟ ᱫᱚ ᱞᱟᱦᱟᱨᱮᱜᱮ ᱜᱮᱫ ᱜᱤᱰᱤᱭᱟᱠᱟᱱᱟ᱾\nᱟᱢ ᱫᱚ ᱜᱩᱱᱟᱹᱱᱢᱮ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱹᱢᱤ ᱪᱟᱹᱞᱩ ᱜᱟᱱᱚᱜ-ᱟ ᱥᱮ ᱵᱟᱝ᱾\nᱱᱚᱣᱟ ᱜᱮᱫ ᱜᱤᱰᱤ ᱟᱨ ᱛᱟᱞᱟ ᱚᱪᱚᱜ ᱥᱟᱦᱴᱟ ᱱᱚᱸᱰᱮ ᱮᱢ ᱦᱩᱭᱱᱟ ᱫᱷᱚᱠ ᱞᱟᱹᱜᱤᱛᱛᱮ᱾",
        "moveddeleted-notice": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱜᱮᱫ ᱜᱤᱰᱤ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾\nᱜᱮᱫ ᱥᱮ ᱵᱟᱸᱪᱟᱣ ᱥᱮ ᱚᱪᱚᱜ ᱜᱤᱰᱤᱭᱟᱠᱟᱱ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱥᱟᱹᱠᱷᱤ ᱞᱮᱠᱟᱛᱮ ᱞᱟᱛᱟᱨᱨᱮ ᱮᱢ ᱦᱩᱭᱱᱟ᱾",
        "log-fulllog": "Joto cạbi udugmẽ",
        "edit-hook-aborted": "Huk hotete joto sompadonko bạgi hoeakana.\nNoa reaḱ jahan katha do bạnuḱa.",
        "edit-gone-missing": "ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱟᱝ ᱦᱟᱞᱚᱛ ᱨᱩᱭᱟᱹᱲᱞᱮᱱᱟ᱾\nᱯᱟᱥᱮᱡᱽ ᱫᱚ ᱚᱪᱚᱜ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾",
-       "edit-conflict": "Sompadon reṭepeṭe.",
+       "edit-conflict": "ᱥᱟᱯᱲᱟᱣ ᱵᱟᱹᱭᱨᱤ᱾",
        "edit-no-change": "Amaḱ sompadon do baṅ hataolena, Cedaḱ je olre jahan bodol bạnuḱa.",
        "postedit-confirmation-created": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱛᱮᱭᱟᱨᱠᱟᱱᱟ᱾",
        "postedit-confirmation-restored": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱟᱹᱜᱩ ᱨᱩᱣᱟᱹᱲ ᱦᱩᱭᱠᱟᱱᱟ᱾",
        "edit-already-exists": "ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱵᱟᱝ ᱛᱮᱭᱟᱨ ᱞᱮᱱᱟ᱾\nᱱᱚᱣᱟ ᱫᱚ ᱞᱟᱦᱟ ᱠᱷᱚᱱ ᱢᱮᱱᱟᱜ ᱜᱮᱭᱟ᱾",
-       "defaultmessagetext": "Sedae olko",
+       "defaultmessagetext": "ᱯᱩᱭᱞᱩ ᱚᱞᱠᱟᱱ ᱠᱷᱚᱵᱚᱨ",
        "content-model-wikitext": "ᱣᱤᱠᱤ-ᱚᱞ",
        "content-model-text": "ᱥᱚᱢᱟᱱ ᱚᱞ",
        "post-expand-template-inclusion-warning": "\"Sontoroḱme\" Noa format do lạṭu geya.\nThoṛa format do noare banuḱana.",
        "nextrevision": "ᱱᱟᱣᱟᱛᱮ ᱧᱮᱞ ᱨᱩᱣᱟᱹᱲ →",
        "currentrevisionlink": "ᱱᱮᱛᱟᱨ ᱧᱮᱞ",
        "cur": "ᱱᱮᱛᱚᱜ",
-       "next": "Laha seć",
+       "next": "ᱛᱟᱭᱚᱢ ᱨᱮᱱᱟᱜ",
        "last": "ᱞᱟᱦᱟ ᱛᱮᱱᱟᱜ",
-       "page_first": "Pahilaḱ",
-       "page_last": "Mucạt́aḱ",
+       "page_first": "ᱯᱟᱹᱦᱤᱞ",
+       "page_last": "ᱢᱩᱪᱟᱹᱫ",
        "histlegend": "ᱮᱴᱟᱜ ᱵᱟᱪᱷᱟᱣ: ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞᱠᱚ ᱛᱩᱞᱟᱹᱣ ᱢᱮᱱᱠᱷᱟᱱ, ᱨᱮᱰᱤᱭᱳ ᱵᱟᱠᱥᱚᱨᱮ ᱪᱤᱱ ᱮᱢ ᱠᱟᱛᱮ ᱵᱚᱞᱚᱜ ᱥᱮ ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ ᱵᱟᱴᱚᱱ ᱞᱤᱱᱢᱮ᱾<br />\nᱩᱱᱩᱫᱩᱜ: '''({{int:cur}})''' = ᱱᱮᱛᱟᱨ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱥᱟᱶᱛᱮ ᱥᱚᱝ, '''({{int:last}})''' = ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ ᱱᱟᱣᱟ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱥᱟᱶᱛᱮ ᱥᱚᱝ, '''{{int:minoreditletter}}''' = ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ᱾",
        "history-fieldset-title": "ᱧᱮᱞ ᱟᱹᱨᱩ ᱞᱟᱹᱜᱤᱫ ᱥᱮᱸᱫᱽᱨᱟ",
        "history-show-deleted": "khạli get giḍiyaḱ koge",
        "histfirst": "ᱢᱟᱨᱮᱱᱟᱜ",
        "histlast": "ᱱᱟᱣᱟᱱᱟᱜ",
-       "historysize": "({{PLURAL:$1 1 bayeṭ $1 bayeṭko}})",
-       "historyempty": "(banuḱa)",
+       "historysize": "({{PLURAL:$1 1 ᱵᱟᱭᱤᱴ $1 ᱵᱟᱭᱤᱴᱠᱩ}})",
+       "historyempty": "(ᱠᱷᱟᱹᱞᱤ)",
        "history-feed-title": "ᱥᱩᱫᱷᱨᱟᱹᱣ ᱱᱟᱜᱟᱢ",
        "history-feed-description": "ᱩᱭᱠᱤᱨᱮ ᱱᱤᱭᱟᱹ ᱥᱟᱦᱴᱟ ᱵᱚᱫᱚᱞ ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ",
-       "history-feed-item-nocomment": "re",
-       "rev-deleted-comment": "(Sompadon reaḱ guṭ katha do ocoǵ hoena)",
-       "rev-deleted-user": "(laṛcaṛić ńutum ocoḱena)",
+       "history-feed-item-nocomment": "$1 ᱨᱮ $2",
+       "rev-deleted-comment": "(ᱥᱟᱯᱲᱟᱣ ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ ᱚᱪᱟᱜᱠᱟᱱᱟ)",
+       "rev-deleted-user": "(ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱚᱪᱚᱜᱠᱟᱱᱟ)",
        "rev-deleted-event": "(Log kạmi do ocog hoena)",
        "rev-deleted-user-contribs": "[Beoharićaḱ ńutum se IP ṭhikạna do ocog hoena - kạmi khon sompadon do uku hoe akana]",
-       "rev-delundel": "Juḍawaḱko ńel",
-       "rev-showdeleted": "Uduḱme",
+       "rev-delundel": "ᱧᱮᱧᱮᱞᱟᱜ ᱵᱚᱫᱚᱞ",
+       "rev-showdeleted": "ᱥᱚᱫᱚᱨ",
        "revisiondelete": "ᱜᱮᱫ ᱜᱤᱰᱤ/ᱵᱟᱝ ᱜᱮᱫ ᱜᱤᱰᱤ ᱥᱩᱫᱷᱨᱟᱹᱣᱠᱚ",
-       "revdelete-show-file-submit": "Hẽ",
+       "revdelete-show-file-submit": "ᱦᱮᱸ",
        "revdelete-hide-text": "Nãwã aroe olko ukuemẽ",
-       "revdelete-hide-image": "Rẽt reaḱ babotko ukue mẽ",
+       "revdelete-hide-image": "ᱨᱮᱫ ᱥᱟᱛᱚᱢᱠᱩ ᱩᱠᱩᱭᱢᱮ",
        "revdelete-hide-name": "Kạmi ar bejha ukue mẽ",
        "revdelete-hide-comment": "Sompadon gut katha ukue mẽ",
        "revdelete-hide-user": "Sompadonićaḱ beohar ńutum/IP ṭhikạna ukuemẽ",
-       "revdelete-radio-same": "(alom bodola)",
+       "revdelete-radio-same": "(ᱟᱞᱚᱢ ᱵᱚᱫᱚᱞᱟ)",
        "revdelete-radio-set": "ᱩᱠᱩ",
        "revdelete-radio-unset": "ᱧᱮᱞ ᱜᱟᱱᱚᱜ",
-       "revdelete-log": "Babot:",
-       "revdel-restore": "Judạ lekate ńel",
+       "revdelete-log": "ᱚᱡᱮ:",
+       "revdel-restore": "ᱧᱮᱧᱮᱞᱟᱜ ᱵᱚᱫᱚᱞ",
        "pagehist": "ᱥᱟᱦᱴᱟ ᱱᱟᱜᱟᱢ",
-       "deletedhist": "Get giḍi jạṛ",
-       "revdelete-reasonotherlist": "Eṭaḱak karon",
+       "deletedhist": "ᱜᱮᱫ ᱜᱤᱰᱤᱭᱟᱠᱟᱱ ᱱᱟᱜᱟᱢ",
+       "revdelete-reasonotherlist": "ᱮᱴᱟᱜ ᱚᱡᱮ",
        "mergehistory-from": "ᱯᱷᱮᱰᱟᱛ ᱥᱟᱦᱴᱟᱺ",
        "mergehistory-reason": "ᱚᱡᱮ:",
        "mergelog": "ᱞᱚᱜᱽ ᱢᱮᱥᱟ",
-       "revertmerge": "bań mit́",
+       "revertmerge": "ᱵᱟᱝ ᱢᱤᱛ",
        "history-title": "\"$1\" ᱨᱮᱱᱟᱜ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱱᱟᱜᱟᱢ",
        "difference-title": "\"$1\" ᱨᱮᱱᱟᱜ ᱫᱚᱦᱲᱟᱭᱮᱱ ᱛᱟᱞᱟᱨᱮ ᱯᱷᱟᱨᱟᱠ",
        "lineno": "ᱫᱷᱟᱹᱲ $1:",
        "diff-multi-otherusers": "({{PLURAL:$1|ᱢᱤᱫ ᱛᱟᱞᱟ-ᱢᱟᱞᱟ ᱫᱚᱦᱲᱟ|$1 ᱛᱟᱞᱟ-ᱢᱟᱞᱟ ᱫᱚᱦᱲᱟᱠᱚ}} {{PLURAL:$2|ᱢᱤᱫ ᱮᱴᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ|$2 ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹᱠᱚ}} ᱵᱟᱠᱚ ᱧᱮᱞᱚᱜ-ᱟ)",
        "searchresults": "ᱥᱮᱸᱫᱽᱨᱟ ᱚᱨᱡᱚᱠᱳ",
        "searchresults-title": "\"$1\"  ᱨᱮᱱᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱯᱷᱚᱞ",
-       "prevn": "Laha reaḱ {{PLURAL:$1|$1}}",
-       "nextn": "Táyom teaḱ {{PLURAL:$1|$1}}",
+       "prevn": "ᱞᱟᱦᱟᱛᱮᱱᱟᱜ {{PLURAL:$1|$1}}",
+       "nextn": "ᱛᱟᱭᱚᱢᱛᱮᱱᱟᱜ {{PLURAL:$1|$1}}",
        "prev-page": "ᱯᱟᱪᱮ ᱥᱟᱦᱴᱟ",
        "next-page": "ᱫᱟᱨᱟᱭ ᱥᱟᱦᱴᱟ",
        "prevn-title": "ᱞᱟᱦᱟᱛᱮᱱᱟᱜ $1 {{PLURAL:$1|ᱚᱨᱡᱚ|ᱚᱨᱡᱚᱠᱚ}}",
-       "nextn-title": "Tayom $1 {{PLURAL:$1|result|results}}",
+       "nextn-title": "ᱛᱟᱭᱚᱢᱛᱮᱱᱟᱜ $1 {{PLURAL:$1|ᱚᱨᱡᱚ|ᱚᱨᱡᱚᱠᱚ}}",
        "shown-title": "ᱥᱟᱦᱴᱟ $1 {{PLURAL:$1|ᱚᱨᱡᱚ|ᱚᱨᱡᱚᱠᱳ}} ᱩᱰᱩᱜᱽᱢᱮ",
-       "viewprevnext": "Ńelme ($1 {{int:pipe-separator}} $2) ($3)",
+       "viewprevnext": "ᱧᱮᱞᱢᱮ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>ᱥᱟᱦᱴᱟ ᱧᱤᱛᱩᱢ ᱫᱚ \"[[:$1]]\" ᱱᱤᱭᱟᱹ ᱩᱭᱠᱤᱨᱮ᱾</strong> {{PLURAL:$2|0=|ᱟᱨᱦᱚᱸ ᱧᱮᱞᱢᱮ ᱮᱴᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱟᱨᱡᱚ ᱠᱚᱨᱮ᱾}}",
        "searchmenu-new": "<strong>ᱥᱟᱦᱴᱟ ᱛᱮᱭᱟᱨ ᱢᱮ \"[[:$1]]\" ᱱᱚᱶᱟ ᱣᱤᱠᱤ ᱨᱮ!</strong> {{PLURAL:$2|0=|ᱟᱢᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱛᱮ ᱧᱟᱢᱮᱱ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ|ᱧᱟᱢᱮᱱ ᱥᱮᱸᱫᱽᱨᱟ ᱚᱨᱡᱚ ᱠᱚ ᱦᱚᱸ ᱧᱮᱞᱢᱮ}}",
        "searchprofile-articles": "ᱩᱱᱩᱫᱩᱜ ᱥᱟᱦᱴᱟᱠᱚ",
-       "searchprofile-images": "Multimedia",
+       "searchprofile-images": "ᱢᱟᱞᱴᱤᱢᱤᱰᱤᱭᱟ",
        "searchprofile-everything": "ᱡᱚᱛᱚᱜᱮ",
-       "searchprofile-advanced": "Sompadon",
+       "searchprofile-advanced": "ᱢᱟᱲᱟᱝ",
        "searchprofile-articles-tooltip": "$1 ᱨᱮ ᱥᱮᱸᱫᱽᱨᱟᱭᱢᱮ",
        "searchprofile-images-tooltip": "ᱨᱮᱫᱠᱩ ᱥᱮᱸᱫᱽᱨᱟ",
        "searchprofile-everything-tooltip": "ᱡᱚᱛᱚ ᱥᱟᱛᱚᱢ ᱥᱟᱦᱴᱟᱨᱮ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ (ᱨᱚᱲ ᱥᱟᱦᱴᱟ ᱠᱚᱦᱚᱸ)",
        "searchprofile-advanced-tooltip": "ᱵᱮᱱᱟᱣ ᱧᱤᱛᱩᱢ ᱛᱮ ᱥᱮᱸᱫᱽᱨᱟ",
        "search-result-size": "$1 ({{PLURAL:$2|1 ᱟᱹᱲᱟᱹ|$2 ᱟᱹᱲᱟᱹᱠᱳ}})",
-       "search-result-category-size": "{{PLURAL:$1 1 gãoren $1 gãota renko}} ({{PLURAL:$2 1 kạṭic rokom sokom $ 2 goṭen}}, {{PLURAL:$3 1 rẽt $3 rẽtko}})",
+       "search-result-category-size": "{{PLURAL:$1|1 ᱥᱚᱦᱮᱫ|$1 ᱥᱚᱦᱮᱫᱠᱩ}} ({{PLURAL:$2|1 ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠ|$ 2 ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠᱠᱩ}}, {{PLURAL:$3|1 ᱨᱮᱫ|$3 ᱨᱮᱫᱠᱩ}})",
        "search-redirect": "(ᱥᱚᱡᱷᱮ ᱦᱤᱡᱩᱜ-ᱟ $1 ᱠᱷᱚᱱ)",
-       "search-section": "(Pahaṭa $1)",
+       "search-section": "(ᱛᱷᱟᱠ $1)",
        "search-file-match": "(ᱢᱤᱫᱩᱜᱟᱜ ᱨᱮᱫ ᱩᱱᱩᱫᱩᱜ)",
        "search-suggest": "ᱪᱮᱫ ᱮᱢ ᱢᱮᱱ ᱚᱪᱚᱭᱮᱫᱟ: $1",
        "search-interwiki-caption": "ᱦᱚᱯᱚᱱ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱷᱚᱱ ᱚᱨᱡᱚ",
        "search-interwiki-default": "$1 folko:",
-       "search-interwiki-more": "(Arhõ)",
+       "search-interwiki-more": "(ᱵᱟᱹᱲᱛᱤ)",
        "search-interwiki-more-results": "ᱵᱟᱹᱲᱛᱤ ᱚᱨᱡᱚᱠᱚ",
        "search-relatedarticle": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ",
-       "searchrelated": "songenko",
+       "searchrelated": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱᱠᱩ",
        "searchall": "ᱡᱚᱛᱚ",
        "search-showingresults": "{{PLURAL:$4|ᱚᱨᱡᱚ <strong>$1</strong> ᱨᱮᱱᱟᱜ <strong>$3</strong>|ᱚᱨᱡᱚᱠᱚ <strong>$1 - $2</strong> ᱨᱮᱱᱟᱜ <strong>$3</strong>}}",
-       "search-nonefound": "Kupuli leka roṛruạṛ bạnuḱa",
+       "search-nonefound": "ᱠᱩᱠᱞᱤ ᱥᱟᱶᱛᱮ ᱯᱷᱚᱞ ᱵᱟᱝ ᱢᱤᱞᱟᱹᱮ ᱞᱮᱱᱟ᱾",
        "powersearch-ns": "ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱨᱮ ᱥᱮᱸᱫᱽᱨᱟ",
-       "powersearch-togglelabel": "Sendra",
-       "powersearch-toggleall": "Sanamaḱ",
-       "powersearch-togglenone": "Okaṭaḱ hõ baṅ",
+       "powersearch-togglelabel": "ᱠᱷᱚᱸᱡᱽ:",
+       "powersearch-toggleall": "ᱡᱚᱛᱚ",
+       "powersearch-togglenone": "ᱚᱠᱟᱴᱟᱜ ᱦᱚᱸ ᱵᱟᱝ",
        "preferences": "ᱠᱩᱥᱤᱠᱚ",
        "mypreferences": "ᱠᱩᱥᱤᱠᱚ",
        "prefs-edits": "ᱥᱟᱯᱲᱟᱣᱟᱜ ᱮᱞ:",
-       "prefs-skin": "Harta",
-       "skin-preview": "Ńel, Unuduḱ",
-       "datedefault": "Pạsind banuḱa",
+       "prefs-skin": "ᱦᱟᱨᱛᱟ",
+       "skin-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
+       "datedefault": "ᱠᱩᱥᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ",
        "prefs-user-pages": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ",
-       "prefs-resetpass": "Uku nombor bodolme",
+       "prefs-resetpass": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ",
        "prefs-changeemail": "E-mail ṭhikạna bodolme",
-       "prefs-setemail": "E-mail ṭhikana benaome",
-       "saveprefs": "Rukhiyạymẽ",
-       "searchresultshead": "Sendra",
-       "timezoneregion-africa": "Aphrika",
-       "timezoneregion-america": "Amirika",
-       "timezoneregion-asia": "Esiya",
-       "timezoneregion-australia": "Ausṭralia",
+       "prefs-setemail": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱡᱚᱲᱟᱣᱢᱮ",
+       "saveprefs": "ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ",
+       "searchresultshead": "ᱥᱮᱸᱫᱽᱨᱟ",
+       "timezoneregion-africa": "ᱟᱯᱷᱨᱤᱠᱟ",
+       "timezoneregion-america": "ᱟᱢᱮᱨᱤᱠᱟ",
+       "timezoneregion-asia": "ᱮᱥᱤᱭᱟ",
+       "timezoneregion-australia": "ᱚᱥᱴᱨᱮᱞᱤᱭᱟ",
        "prefs-searchoptions": "ᱥᱮᱸᱫᱽᱨᱟ",
-       "prefs-files": "Rẽtko",
+       "prefs-files": "ᱨᱮᱫᱠᱚ",
        "youremail": "E-mail:",
        "username": "Beoharićaḱ ńutum:",
-       "yourrealname": "Sạri ńutum",
+       "yourrealname": "ᱟᱥᱚᱞ ᱧᱩᱛᱩᱢ:",
        "yourlanguage": "ᱯᱟᱹᱨᱥᱤ:",
        "yournick": "ᱱᱟᱶᱟ ᱥᱩᱦᱤ:",
        "gender-male": "Baba hoṛ",
        "prefs-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
        "userrights": "Beoharićaḱ laṛcaṛ ektiạrko",
        "userrights-lookup-user": "Beoharkoaḱ gãotako laṛcaṛ",
-       "userrights-user-editname": "Beoharićaḱ ńutum emmẽ",
+       "userrights-user-editname": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱤᱛᱩᱢ ᱵᱚᱞᱚᱭ ᱢᱮ:",
        "editusergroup": "Beoharićaḱ gãotako toṅgeymẽ",
        "userrights-editusergroup": "Beoharićaḱ gãotako toṅgeymẽ",
        "saveusergroups": "Beoharićaḱ gãotako rukhiyaymẽ",
        "group-sysop": "ᱟᱰᱢᱤᱱᱤᱥᱴᱨᱮᱴᱚᱨ",
        "grouppage-bot": "{{ns:project}}:ᱵᱚᱴᱠᱚ",
        "grouppage-sysop": "{{ns:project}}:ᱯᱟᱨᱜᱟᱱᱟᱠᱚ",
-       "right-read": "Sakamko paṛhaomẽ",
-       "right-edit": "Sakamko toṅge",
+       "right-read": "ᱥᱟᱦᱴᱟᱠᱩ ᱯᱟᱲᱦᱟᱣᱢᱮ",
+       "right-edit": "ᱥᱟᱦᱴᱟᱠᱩ ᱥᱟᱯᱲᱟᱣ",
        "right-createpage": "Sakamko benoamẽ (Okako do galmarao sakamko baṅkan)",
        "right-createtalk": "Galmarao sakamko benaomẽ",
        "right-createaccount": "ᱱᱟᱶᱟ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ",
-       "right-move": "Sakamko ocogmẽ",
+       "right-move": "ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱦᱟᱭᱢᱮ",
        "right-move-subpages": "ᱥᱟᱦᱴᱟ ᱥᱟᱦᱟᱦᱟᱭᱢᱮ ᱥᱟᱶᱛᱮᱱ ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱶ",
-       "right-movefile": "Rẽtko ocogmẽ",
+       "right-movefile": "ᱨᱮᱫᱠᱚ ᱚᱪᱚᱜᱽ ᱢᱮ",
        "right-upload": "Rẽtko rakabmẽ",
        "right-writeapi": "ᱚᱞ API ᱨᱮᱱᱟᱜ ᱵᱮᱵᱷᱟᱨ",
-       "right-delete": "Sakamko get giḍiymẽ",
+       "right-delete": "ᱥᱟᱦᱴᱟᱠᱚ ᱜᱮᱫᱽ ᱢᱮ",
        "right-browsearchive": "ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ ᱜᱮᱫ ᱟᱠᱟᱱᱟ ᱥᱟᱦᱴᱟᱠᱚ",
-       "newuserlogpage": "Laṛcaṛićaḱ tear cạbi",
+       "newuserlogpage": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱛᱮᱭᱟᱨ ᱪᱟᱹᱵᱤ",
        "rightslog": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱟᱹᱭᱫᱟᱹᱨ ᱞᱚᱜᱽ",
        "action-edit": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣᱢᱮ",
        "action-createaccount": "ᱱᱚᱶᱟ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ ᱵᱮᱱᱟᱣ",
        "action-browsearchive": "ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ ᱜᱮᱫ ᱟᱠᱟᱱᱟ ᱥᱟᱦᱴᱟᱠᱚ",
        "action-undelete": "ᱵᱟᱝ ᱜᱮᱫᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ",
        "action-suppressrevision": "ᱧᱮᱞᱟᱹᱨᱩ ᱟᱨ ᱛᱷᱟᱯᱚᱱᱟᱹᱨᱩ ᱫᱟᱱᱟᱝ ᱧᱮᱞᱟᱹᱨᱩᱠᱚ",
-       "nchanges": "$1 {{PLURAL:$1 bodol bodolko}}",
+       "nchanges": "$1 {{PLURAL:$1|ᱟᱹᱨᱩ|ᱟᱹᱨᱩᱠᱚ}}",
        "enhancedrc-history": "ᱱᱟᱜᱟᱢ",
        "recentchanges": "ᱨᱚᱠᱟ ᱵᱚᱫᱚᱞᱠᱚ",
-       "recentchanges-legend": "Nahaḱ bodol teaḱko",
+       "recentchanges-legend": "ᱱᱟᱣᱟᱱᱟ ᱵᱚᱫᱚᱞ ᱛᱮᱭᱟᱜᱠᱚ",
        "recentchanges-summary": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱩᱭᱠᱤ ᱨᱮᱭᱟᱜ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞᱠᱚ ᱯᱟᱸᱡᱟᱸᱭᱢᱮ᱾",
        "recentchanges-noresult": "ᱮᱢᱞᱮᱱ ᱥᱚᱢᱚᱭ ᱵᱷᱤᱛᱤᱨ ᱨᱮ ᱵᱚᱫᱚᱞᱟᱜ ᱠᱚ ᱵᱟᱭ ᱢᱤᱫᱩᱜ ᱠᱟᱱᱟ ᱾",
        "recentchanges-feed-description": "ᱱᱚᱣᱟ feed ᱨᱮ ᱩᱭᱠᱤ ᱨᱮᱭᱟᱜ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞᱠᱚ ᱯᱟᱸᱡᱟᱸᱭᱢᱮ᱾",
        "recentchanges-label-newpage": "ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱢᱤᱫᱴᱮᱱ ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟᱭ ᱛᱮᱭᱟᱨᱠᱮᱫᱟ",
        "recentchanges-label-minor": "ᱱᱚᱣᱟ ᱫᱚ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱱᱟ",
        "recentchanges-label-bot": "ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱵᱚᱴ ᱮ ᱠᱚᱨᱟᱣᱠᱟᱫᱟ",
-       "recentchanges-label-unpatrolled": "Noa sompadon do ńit́ hạbić baṅ ńel ńamakana",
+       "recentchanges-label-unpatrolled": "ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱱᱤᱛ ᱫᱷᱟᱹᱵᱤᱡ ᱵᱟᱝ ᱧᱮᱞ ᱧᱟᱢ ᱟᱠᱟᱱᱟ",
        "recentchanges-label-plusminus": "ᱥᱟᱦᱴᱟ ᱫᱚ  ᱵᱚᱫᱚᱞᱮᱱᱟ ᱱᱤᱱᱟᱹᱜ ᱮᱞ ᱵᱟᱭᱤᱴᱥ ᱛᱮ",
        "recentchanges-legend-heading": "<strong>ᱞᱤᱡᱮᱸᱰ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ᱟᱨᱦᱚᱸ ᱧᱮᱞᱢᱮ [[Special:NewPages|ᱱᱟᱶᱟ ᱥᱟᱦᱴᱟ ᱞᱤᱥᱴᱤ]])",
        "rcshowhidebots": "ᱵᱚᱴᱠᱚ $1",
        "rcshowhidebots-show": "ᱧᱮᱞ",
        "rcshowhidebots-hide": "ᱫᱟᱱᱟᱝ",
-       "rcshowhideliu": "Regisṭari beoharićko $1",
+       "rcshowhideliu": "ᱵᱚᱞᱚᱣᱠᱟᱱ ᱵᱮᱵᱟᱦᱟᱨᱤᱠᱩ $1",
        "rcshowhideliu-show": "ᱧᱮᱞ",
        "rcshowhideliu-hide": "ᱫᱟᱱᱟᱝ",
        "rcshowhideanons": "$1 ᱧᱤᱛᱩᱢ ᱵᱟᱱᱩᱜ ᱵᱮᱵᱦᱟᱨᱤᱪ",
        "rcshowhideanons-show": "ᱧᱮᱞ",
        "rcshowhideanons-hide": "ᱫᱟᱱᱟᱝ",
-       "rcshowhidepatr": "$1 Biḍạen sompadonko",
+       "rcshowhidepatr": "$1 ᱵᱤᱰᱟᱭᱮᱱ ᱥᱟᱯᱲᱟᱣᱠᱩ",
        "rcshowhidepatr-show": "ᱥᱚᱫᱚᱨ",
        "rcshowhidepatr-hide": "ᱫᱟᱱᱟᱝ",
        "rcshowhidemine": "$1 ᱤᱧᱟᱜ ᱥᱟᱯᱲᱟᱣᱠᱩ",
        "rcshowhidecategorization": "$1 ᱥᱟᱦᱴᱟ ᱛᱷᱚᱠ",
        "rcshowhidecategorization-show": "ᱧᱮᱞ",
        "rcshowhidecategorization-hide": "ᱫᱟᱱᱟᱝ",
-       "rclinks": "$2 din lahare $1 bodol unuduḱme",
+       "rclinks": "$2 ᱫᱤᱱ ᱞᱟᱦᱟᱨᱮ $1 ᱵᱚᱫᱚᱞ ᱩᱫᱩᱜᱽᱢᱮ",
        "diff": "ᱡᱩᱫᱟᱹ",
        "hist": "ᱱᱟᱜᱟᱢ",
        "hide": "ᱫᱟᱱᱟᱝ",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|ᱵᱟᱭᱤᱴ|ᱵᱟᱭᱤᱴᱥ}} ᱵᱚᱫᱚᱞ ᱛᱟᱭᱚᱢ",
        "rc-enhanced-expand": "Purạote uduḱ",
-       "rc-enhanced-hide": "Purạo cuku",
+       "rc-enhanced-hide": "ᱡᱚᱛᱚᱭᱟᱜ ᱩᱠᱩᱭᱢᱮ",
        "rc-old-title": "ᱚᱥᱚᱞᱨᱮ ᱛᱮᱭᱟᱨᱟᱠᱟᱱᱟ \"$1\" ᱞᱮᱠᱟᱛᱮ",
        "recentchangeslinked": "ᱥᱟᱶᱛᱮᱱᱟᱜ ᱵᱚᱫᱚᱞᱠᱚ",
        "recentchangeslinked-feed": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ ᱵᱚᱫᱚᱞᱠᱚ",
        "recentchangeslinked-toolbox": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ ᱵᱚᱫᱚᱞᱠᱚ",
-       "recentchangeslinked-title": "Bodolaḱko do \"$1\" sãote joṛao geya",
-       "recentchangeslinked-summary": "ᱱᱚᱣᱟ ᱫᱚ ᱚᱱᱟ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱟ ᱱᱮᱵᱮᱛᱟᱨᱜᱮ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱟᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱚ category ᱦᱟᱛᱟᱣ ᱟᱠᱟᱱ ᱥᱟᱠᱟᱢ ᱠᱷᱚᱱ᱾\n\n[[Special:Watchlist|your watchlist]] ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ ᱫᱚ'''bold''' .",
+       "recentchangeslinked-title": "ᱵᱚᱫᱚᱞᱟᱜ ᱠᱚᱫᱚ \"$1\" ᱥᱟᱶᱛᱮ ᱡᱚᱲᱟᱣ ᱜᱮᱭᱟ",
+       "recentchangeslinked-summary": "ᱱᱚᱣᱟ ᱫᱚ ᱚᱱᱟ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱟ ᱱᱮᱵᱮᱛᱟᱨᱜᱮ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱟᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱚ category ᱦᱟᱛᱟᱣ ᱟᱠᱟᱱ ᱥᱟᱠᱟᱢ ᱠᱷᱚᱱ᱾\n\n[[Special:Watchlist|your watchlist]] ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ ᱫᱚ '''bold''' .",
        "recentchangeslinked-page": "ᱥᱟᱦᱴᱟ ᱧᱤᱛᱩᱢ :",
        "recentchangeslinked-to": "ᱡᱚᱱᱚᱲ ᱥᱟᱦᱴᱟᱨᱮ ᱧᱮᱞ ᱚᱪᱚᱭ ᱢᱮ ᱮᱢᱟᱜ ᱥᱟᱦᱴᱟ ᱵᱟᱹᱜᱤ ᱠᱟᱛᱮ",
        "upload": "ᱨᱮᱫ ᱞᱟᱫᱮᱢᱮ",
-       "uploadbtn": "Rẽt rakabmẽ",
-       "uploadlogpage": "Chạbi do uthạome",
-       "filename": "Rẽt ńutum",
-       "filedesc": "Guṭ katha",
-       "fileuploadsummary": "Guṭ katha",
+       "uploadbtn": "ᱨᱮᱫ ᱞᱟᱫᱮ",
+       "uploadlogpage": "ᱨᱟᱠᱟᱵ ᱛᱟᱹᱞᱠᱟᱹ",
+       "filename": "ᱨᱮᱫ ᱧᱩᱛᱩᱢ",
+       "filedesc": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ",
+       "fileuploadsummary": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ:",
        "filestatus": "ᱟᱫᱚᱞ ᱚᱵᱚᱥᱛᱟ:",
-       "savefile": "Rẽt rukhiyaymẽ",
+       "savefile": "ᱨᱮᱫ ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ",
        "upload-source": "ᱯᱷᱮᱰᱟᱛ ᱨᱮᱫ",
        "sourcefilename": "ᱯᱷᱮᱰᱟᱛ ᱨᱮᱫᱧᱩᱢ:",
        "sourceurl": "ᱯᱷᱮᱰᱟᱛ URL:",
-       "upload-description": "Rẽt reaḱ jạṛ",
-       "watchthisupload": "Noa rẽt ńelmẽ",
-       "upload-file-error": "Bhitri reaḱ bhul",
+       "upload-description": "ᱨᱮᱫ ᱵᱤᱵᱚᱨᱚᱱᱤ",
+       "watchthisupload": "ᱱᱚᱣᱟ ᱨᱮᱫ ᱧᱮᱞᱢᱮ",
+       "upload-file-error": "ᱵᱷᱤᱛᱨᱤ ᱵᱷᱩᱞ",
        "upload-dialog-title": "ᱨᱮᱫ ᱞᱟᱫᱮ",
        "upload-dialog-button-cancel": "ᱵᱟᱫᱽ",
        "upload-dialog-button-back": "ᱛᱟᱭᱚᱢ",
        "upload-form-label-usage-filename": "ᱨᱮᱫ ᱧᱩᱛᱩᱢ",
        "upload-form-label-own-work": "ᱱᱚᱶᱟ ᱫᱚ ᱤᱧᱟᱜ ᱠᱟᱹᱢᱤᱭᱟᱜ",
        "upload-form-label-infoform-date": "ᱢᱟᱹᱦᱤᱛ",
-       "license": "Laisence benao",
-       "license-header": "Laisense benao",
+       "license": "ᱞᱟᱭᱥᱮᱱᱥ ᱛᱮᱭᱟᱨ:",
+       "license-header": "ᱞᱟᱭᱥᱮᱱᱥ ᱛᱮᱭᱟᱨ",
        "imgfile": "ᱨᱮᱫ",
        "listfiles": "ᱨᱮᱫ ᱛᱟᱹᱞᱠᱟᱹ",
-       "listfiles_date": "Tạrikh",
-       "listfiles_name": "Ńutum",
-       "listfiles_user": "Beoharić, Laṛcaṛic",
+       "listfiles_date": "ᱢᱟᱹᱦᱤᱛ",
+       "listfiles_name": "ᱧᱩᱛᱩᱢ",
+       "listfiles_user": "ᱵᱮᱵᱦᱟᱨᱤᱡ",
        "file-anchor-link": "ᱨᱮᱫ",
        "filehist": "ᱨᱮᱫ ᱨᱮᱭᱟᱜ ᱱᱟᱜᱟᱢ",
        "filehist-help": "ᱚᱠᱛᱚ ᱨᱮ ᱞᱤᱱ ᱢᱮ/ᱚᱠᱛᱚ ᱨᱮ ᱨᱮᱫ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱛ ᱞᱤᱱ ᱢᱮ",
-       "filehist-deleteall": "Joto get giḍi",
-       "filehist-deleteone": "Get giḍi",
-       "filehist-revert": "Lahaleka",
+       "filehist-deleteall": "ᱡᱚᱛᱚ ᱜᱮᱫ ᱜᱤᱰᱤᱭᱢᱮ",
+       "filehist-deleteone": "ᱜᱮᱫ ᱜᱤᱰᱤ",
+       "filehist-revert": "ᱨᱩᱣᱟᱹᱲ ᱟᱹᱜᱩ",
        "filehist-current": "ᱱᱤᱛᱚᱜ",
        "filehist-datetime": "ᱛᱟᱹᱨᱤᱠᱷ/ᱚᱠᱛᱚ",
-       "filehist-thumb": "Ṭip",
+       "filehist-thumb": "ᱴᱤᱯ",
        "filehist-thumbtext": "Thumbnail for version as of $1",
        "filehist-nothumb": "ᱵᱟᱹᱱᱩᱜ-ᱟ ᱴᱤᱯ-ᱨᱟᱢᱟ",
        "filehist-user": "ᱵᱮᱵᱦᱟᱨᱤᱡᱽ",
        "upload-disallowed-here": "ᱟᱢᱫᱚ ᱱᱚᱣᱟ ᱨᱮᱫ ᱪᱮᱛᱟᱱ ᱵᱟᱢ ᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾",
        "mimesearch": "MIME ᱥᱮᱸᱫᱽᱨᱟ",
        "randompage": "ᱡᱚᱲᱟᱣ ᱥᱟᱦᱴᱟ",
-       "statistics": "Halot",
-       "statistics-pages": "Sakamko",
+       "statistics": "ᱦᱟᱞᱚᱛ",
+       "statistics-pages": "ᱥᱟᱦᱴᱟᱠᱚ",
        "double-redirect-fixer": "ᱢᱚᱸᱦᱟᱰᱟ ᱴᱷᱟᱹᱣᱠᱟᱹᱭᱤᱡ",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
-       "nmembers": "$1 {{PLURAL:$1 Gaõtaren Gaõtarenko}}",
+       "nmembers": "$1 {{PLURAL:$1|ᱥᱚᱦᱮᱫ|ᱥᱚᱦᱮᱫᱠᱩ}}",
        "prefixindex": "ᱡᱚᱛᱚ ᱥᱟᱦᱴᱟᱠᱚ prefix ᱥᱟᱶ",
-       "shortpages": "Huḍiń sakamko",
-       "longpages": "Jiliń sakamko",
+       "shortpages": "ᱦᱩᱰᱤᱧ ᱥᱟᱦᱴᱟᱠᱚ",
+       "longpages": "ᱞᱟᱹᱴᱩ ᱥᱟᱦᱴᱟᱠᱚ",
        "listusers": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱛᱟᱹᱞᱠᱟᱹ",
        "listusers-creationsort": "ᱛᱮᱭᱟᱨᱟᱠᱟᱱ ᱢᱟᱹᱦᱤᱛ ᱞᱮᱠᱟᱛᱮ ᱯᱟᱱᱛᱮ",
-       "usercreated": "{{JẠT: $3 | benawakan}} $1 tarikre $2 okte",
+       "usercreated": "{{ᱡᱟᱱᱟᱝ:$3|ᱵᱮᱱᱟᱣᱠᱟᱱ}} $1 ᱢᱟᱹᱦᱤᱛᱨᱮ $2 ᱚᱠᱛᱚᱨᱮ",
        "newpages": "ᱱᱟᱶᱟ ᱥᱟᱦᱴᱟᱠᱳ",
-       "newpages-username": "Beoharićaḱ ńutum:",
-       "ancientpages": "Mare sakamko",
+       "newpages-username": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱩᱛᱩᱢᱺ",
+       "ancientpages": "ᱢᱟᱨᱮ ᱥᱟᱦᱴᱟᱠᱚ",
        "move": "ᱚᱪᱚᱜ",
        "movethispage": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱦᱟᱭᱢᱮ",
        "pager-newer-n": "{{PLURAL:$1|1 ᱱᱟᱣᱟᱱᱟᱜ | ᱱᱟᱣᱟᱱᱟᱜ $1}}",
-       "pager-older-n": "{{PLURAL:$1 arhõ mare 1ṭen arhõ mare $1ṭen}}",
+       "pager-older-n": "{{PLURAL:$1|ᱢᱟᱨᱮᱭᱟᱜ 1|ᱢᱟᱨᱮᱭᱟᱜ $1}}",
        "booksources": "ᱯᱚᱛᱚᱵ ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨᱠᱟ",
        "booksources-search-legend": "ᱯᱚᱛᱚᱵ ᱨᱮᱭᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨ ᱞᱟᱹᱜᱤᱛ ᱥᱮᱸᱫᱽᱨᱟ",
        "booksources-search": "ᱥᱮᱸᱫᱽᱨᱟ",
        "specialloguserlabel": "ᱠᱟᱹᱢᱤᱭᱟᱹ:",
        "speciallogtitlelabel": "ᱡᱚᱥ (ᱧᱩᱛᱩᱢ ᱟᱨᱵᱟᱝ {{ns:user}}:ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱩᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ):",
-       "log": "Cạbiko",
+       "log": "ᱪᱟᱹᱵᱤᱠᱩ",
        "all-logs-page": "ᱡᱚᱛᱚ ᱫᱤᱥᱣᱟᱹ ᱞᱚᱜᱽ ᱠᱚ",
        "alllogstext": "ᱢᱮᱥᱟᱠᱟᱛᱮ ᱩᱫᱩᱜᱽᱢᱮ ᱡᱚᱛᱚ ᱢᱮᱱᱟᱜ {{SITENAME}} ᱞᱚᱜᱽᱠᱚ ᱾\nᱧᱮᱞᱚᱜ ᱠᱚᱢ ᱠᱟᱹᱡ ᱫᱟᱲᱮᱭᱟᱠᱚᱣᱟ ᱞᱚᱜᱽ ᱞᱮᱠᱟᱱ, ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ (case-sensitive), ᱟᱨᱵᱟᱝ ᱯᱨᱚᱵᱷᱟᱵᱟᱱ ᱥᱟᱦᱴᱟ (also case-sensitive) ᱠᱚ ᱵᱟᱪᱷᱚᱱ ᱠᱟᱛᱮ ᱾",
        "logempty": "ᱞᱚᱜᱽ ᱨᱮ ᱚᱱᱟᱞᱮᱠᱟᱱ ᱡᱤᱱᱤᱥ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱾",
        "allpages-hide-redirects": "ᱢᱚᱦᱰᱟᱦᱟᱜᱠᱚ ᱫᱟᱱᱟᱝ",
        "categories": "ᱛᱷᱚᱠᱠᱚ",
        "linksearch-ok": "ᱥᱮᱸᱫᱽᱨᱟ",
-       "linksearch-line": "$2 khon $1 re joṛao hoeakana",
-       "listusers-submit": "Udugmẽ",
-       "listusers-blocked": "(Esetgea)",
-       "listgrouprights-group": "Gaõta",
-       "listgrouprights-rights": "Ạidạriko",
+       "linksearch-line": "$2 ᱠᱷᱚᱱ $1 ᱨᱮ ᱡᱚᱱᱚᱲ ᱟᱠᱟᱱ",
+       "listusers-submit": "ᱧᱮᱞ",
+       "listusers-blocked": "(ᱮᱥᱮᱫ ᱜᱮᱭᱟ)",
+       "listgrouprights-group": "ᱜᱟᱶᱛᱟ",
+       "listgrouprights-rights": "á±\9fᱹᱭᱫá±\9fᱹᱨᱤᱠá±\9a",
        "listgrouprights-helppage": "Goṛo:Gaõta ạidạri",
-       "listgrouprights-members": "Saõtenkoaḱ tạlika",
+       "listgrouprights-members": "(ᱥᱚᱦᱮᱫᱠᱩᱣᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ)",
        "listgrouprights-addgroup-all": "Joto gaõtare ko soṅgekom",
        "listgrouprights-removegroup-all": "Joto gaõtaren ko ocoḱgiḍikom",
-       "emailuser": "Nui beoharić e-mail emayme",
+       "emailuser": "ᱱᱩᱭ ᱵᱮᱵᱦᱟᱨᱤᱡ e-mail ᱮᱢᱟᱭᱢᱮ",
        "noemailtitle": "E-mail ṭhikạna do banuḱa",
-       "emailusername": "Beoharićaḱ ńutum:",
-       "emailusernamesubmit": "Em",
-       "emailfrom": "Kulić:",
-       "emailto": "Ńamić:",
-       "emailmessage": "Mesag",
-       "emailsend": "Kulmẽ",
+       "emailusername": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱩᱛᱩᱢᱺ",
+       "emailusernamesubmit": "ᱮᱢ",
+       "emailfrom": "ᱠᱩᱞᱤᱪ:",
+       "emailto": "ᱱᱟᱹᱢᱤᱪ:",
+       "emailmessage": "ᱠᱷᱚᱵᱚᱨ:",
+       "emailsend": "ᱠᱩᱞᱢᱮ",
        "usermessage-editor": "ᱥᱤᱥᱴᱚᱢ ᱨᱟᱭᱵᱟᱨ",
        "watchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ",
        "mywatchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ",
        "watchlistfor2": "$1 ($2) ᱞᱟᱹᱜᱤᱛ",
        "watch": "ᱧᱮᱞ",
-       "unwatch": "bang nelok' a",
+       "unwatch": "ᱵᱟᱱᱝ ᱧᱮᱞᱠᱟᱱ",
        "watchlist-details": "ᱵᱟᱝ ᱯᱩᱨᱟᱹᱣ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ{{PLURAL:$1 ᱥᱟᱦᱴᱟ $1 ᱥᱟᱦᱴᱟ}} ᱢᱮᱱᱟᱜ-ᱟ (ᱨᱚᱲ ᱥᱟᱦᱴᱟ ᱠᱚᱦᱚᱸ)",
        "wlheader-showupdated": "ᱟᱢᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱞᱚᱝᱨᱮ ᱡᱟᱸᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱠᱚᱢ ᱵᱚᱫᱚᱞ ᱞᱮᱫᱟ ᱚᱱᱟᱠᱩ ᱧᱮᱞᱚᱜ-ᱟ <strong>bold</strong>.",
        "wlnote": "ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ {{PLURAL:$1|ᱫᱚ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞ ᱠᱟᱱᱟ|ᱠᱚ ᱫᱚ ᱢᱩᱪᱟᱹᱫ <strong>$1</strong> ᱵᱚᱫᱚᱞᱠᱟᱱᱟ}} ᱢᱩᱪᱟᱹᱫ ᱨᱮ {{PLURAL:$2|ᱴᱟᱲᱟᱝ|<strong>$2</strong> ᱴᱟᱲᱟᱝ}},  $3, $4 ᱞᱮᱠᱟᱛᱮ ᱾",
        "wlshowlast": "ᱢᱩᱪᱟᱹᱛ ᱩᱫᱩᱜᱢᱮ $1 ᱴᱟᱲᱟᱝ $2 ᱢᱟᱦᱟᱸ",
-       "watchlist-options": "Ńelok tạlika reak sonketko",
-       "watching": "Ńeloḱ kana...",
+       "watchlist-options": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱨᱮᱭᱟᱜ ᱥᱚᱝᱠᱮᱛᱠᱩ",
+       "watching": "ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ...",
        "enotif_reset": "ᱱᱤᱱᱦᱟᱹᱭᱢᱮ ᱡᱚᱛᱚ ᱥᱟᱦᱴᱟ ᱦᱤᱨᱤᱭᱟᱠᱟᱱᱟ",
        "changed": "Bodolena",
        "deletepage": "ᱥᱟᱦᱴᱟ ᱜᱮᱫᱽ ᱢᱮ",
-       "delete-legend": "Get giḍi",
+       "delete-legend": "ᱜᱮᱫ ᱜᱤᱰᱤ",
        "actioncomplete": "kami Chabae-ena",
        "actionfailed": "Kami bang hoe-lena",
-       "dellogpage": "Mãrao log",
+       "dellogpage": "ᱢᱩᱪᱷᱟᱹᱣ ᱪᱟᱹᱵᱤ",
        "rollbacklink": "ᱜᱷᱩᱨᱞᱟᱹᱣ ᱟᱹᱪᱩᱨ",
        "rollbacklinkcount": "ᱜᱚᱰᱟᱣ ᱨᱩᱣᱟᱹᱲ $1 {{PLURAL:$1|ᱥᱟᱯᱲᱟᱣ|ᱥᱟᱯᱲᱟᱣᱠᱚ}}",
        "changecontentmodel-reason-label": "ᱚᱡᱮ:",
        "changecontentmodel-submit": "ᱵᱚᱫᱚᱞ",
-       "protectlogpage": "Rukhiyạy tala cạbi",
-       "protectedarticle": "Rukhiyạgeya \"[[$1]]\"",
+       "protectlogpage": "ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱛᱟᱞᱟ ᱪᱟᱹᱵᱤ",
+       "protectedarticle": "ᱨᱩᱠᱷᱤᱭᱟᱹᱜᱮᱭᱟ \"[[$1]]\"",
        "modifiedarticleprotection": "\"[[$1]]\" ᱞᱟᱹᱜᱤᱫ ᱨᱩᱠᱷᱭᱟᱹ ᱟᱲᱮ ᱵᱚᱫᱚᱞᱮᱱᱟ",
-       "protectcomment": "karon",
+       "protectcomment": "ᱚᱡᱮ:",
        "protectexpiry": "Cabaḱ",
        "protect-default": "ᱡᱚᱛᱚ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹᱠᱚ ᱫᱟᱣ ᱮᱢ",
        "restriction-edit": "ᱥᱟᱯᱲᱟᱣ",
        "restriction-move": "ᱚᱪᱚᱜ",
-       "restriction-create": "Tearmẽ, Benaomẽ",
-       "undeletelink": "Ńel/doho ruạṛ",
-       "undeleteviewlink": "Ńel",
+       "restriction-create": "ᱛᱮᱭᱟᱨ",
+       "undeletelink": "ᱧᱮᱞ/ᱫᱚᱦᱚ ᱨᱩᱣᱟᱹᱲ",
+       "undeleteviewlink": "ᱧᱮᱞ",
        "undelete-search-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "namespace": "ᱧᱤᱛᱩᱢ ᱡᱟᱜᱟ",
-       "invert": "Seć bachao",
+       "invert": "ᱥᱮᱪ ᱵᱟᱪᱷᱟᱣ",
        "tooltip-invert": "ᱱᱚᱶᱟ ᱵᱟᱠᱥᱟ ᱴᱤᱠ ᱢᱮ ᱥᱟᱦᱴᱟ ᱠᱷᱚᱱ ᱵᱚᱫᱚᱞᱟᱜᱠᱚ ᱫᱟᱱᱟᱝ ᱞᱟᱹᱜᱤᱫ  ᱵᱟᱛᱷᱚᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱥᱟᱶᱛᱮ (ᱟᱨ ᱡᱚᱯᱚᱲᱟᱣᱟᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱡᱩᱫᱤ ᱴᱤᱠ ᱟᱠᱟᱱᱟ)",
        "namespace_association": "ᱥᱚᱦᱚᱫᱤᱭᱟᱹ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ",
        "tooltip-namespace_association": "ᱱᱚᱶᱟ ᱵᱟᱠᱥᱟ ᱴᱤᱠ ᱢᱮ ᱨᱚᱯᱚᱲ ᱵᱟᱝᱠᱷᱟᱱ ᱥᱟᱛᱟᱢ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱵᱟᱪᱷᱚᱱ ᱟᱠᱟᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱥᱟᱶ ᱡᱚᱯᱚᱲᱟᱣ ᱟᱠᱟᱱᱟᱜ",
        "blanknamespace": "(ᱢᱩᱬᱩᱛ)",
-       "contributions": "{{GENDER:$1|Beoharićaḱ }} Kạmiko",
-       "contributions-title": "$1 Beoharićaḱ kạmiko",
+       "contributions": "{{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ}} ᱮᱱᱮᱢᱠᱩ",
+       "contributions-title": "$1 ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱮᱱᱮᱢᱠᱩ",
        "mycontris": "ᱮᱱᱮᱢᱠᱩ",
        "anoncontribs": "ᱮᱱᱮᱢᱠᱩ",
        "contribsub2": "{{GENDER:$3|$1}} ($2) ᱞᱟᱹᱜᱤᱫ ᱛᱮ",
        "nocontribs": "ᱱᱚᱶᱟ ᱮᱢᱟᱜ ᱥᱟᱶ ᱡᱚᱲᱟᱣᱟᱱ ᱵᱚᱫᱚᱞᱠᱚ ᱵᱟᱭ ᱧᱟᱢᱞᱮᱱᱟ |",
        "uctop": "(ᱱᱤᱛᱚᱜ)",
-       "month": "Cando khon (ar etohopreaḱ)",
-       "year": "Nia serma reak' pahil khoch'",
+       "month": "ᱪᱟᱸᱫᱚ ᱠᱷᱚᱱ (ᱟᱨ ᱞᱟᱦᱟᱨᱮᱭᱟᱜ)",
+       "year": "ᱱᱚᱣᱟ ᱥᱮᱨᱢᱟ ᱠᱷᱚᱡ (ᱟᱨ ᱞᱟᱦᱟᱨᱮᱭᱟᱜ):",
        "sp-contributions-newbies": "ᱱᱟᱣᱟ ᱦᱤᱥᱟᱵ ᱨᱮᱱᱟᱜ ᱮᱱᱮᱢᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ",
-       "sp-contributions-blocklog": "Tala eset",
-       "sp-contributions-uploads": "Rakaṕme",
-       "sp-contributions-logs": "Tala",
+       "sp-contributions-blocklog": "ᱠᱩᱞᱩᱯ ᱮᱥᱮᱫ",
+       "sp-contributions-uploads": "ᱞᱟᱫᱮᱠᱩ",
+       "sp-contributions-logs": "ᱛᱟᱞᱟᱠᱩ",
        "sp-contributions-talk": "ᱨᱚᱲ",
-       "sp-contributions-search": "Kạmiko emoḱ lạgitte sendrayme",
-       "sp-contributions-username": "IP á¹­hikạna se laá¹\9bcaá¹\9b\87aḱ nÌ\95utum",
+       "sp-contributions-search": "ᱮᱱᱮᱢᱠᱩ ᱞᱟᱹᱜᱤᱛ ᱥᱮᱸᱫᱨᱟ",
+       "sp-contributions-username": "IP á±´á±·á±¤á± á±\9fᱹᱱá±\9f á±¥á±® á±µá±®á±µá±¦á±\9fᱨᱤᱭá±\9fá±\9c á±§á±©á±\9bᱩᱢ",
        "sp-contributions-toponly": "ᱱᱮᱛᱟᱨ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱠᱚᱨᱮᱭᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱹᱢᱤᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "sp-contributions-newonly": "ᱥᱩᱢᱩᱝ ᱟᱹᱨᱩᱠᱚ ᱥᱚᱫᱚᱨᱢᱮ ᱡᱟᱦᱟᱸ ᱥᱟᱦᱟᱴᱟ ᱫᱚ ᱥᱤᱨᱡᱟᱹᱣᱟᱜ ᱠᱟᱱᱟ",
        "sp-contributions-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "linkshere": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱫᱚ '''[[:$1]]''' ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ :",
        "nolinkshere": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱵᱟᱱᱩᱜ-ᱟ ᱱᱤᱭᱟᱹ <strong>[[:$1]]</strong>.",
        "isredirect": "ᱵᱟᱝ ᱥᱚᱡᱽᱦᱮ ᱥᱟᱦᱴᱟ",
-       "istemplate": "Ar mit́ teć sãote joṛao",
+       "istemplate": "ᱥᱮᱞᱮᱫ",
        "isimage": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ",
        "whatlinkshere-prev": "{{PLURAL:$1|ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ |ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ$1}}",
        "whatlinkshere-next": "{{PLURAL:$1 |ᱛᱟᱭᱚᱢ |ᱛᱟᱭᱚᱢ $1}}",
        "whatlinkshere-links": "← ᱡᱚᱱᱚᱲᱠᱚ",
-       "whatlinkshere-hideredirs": "$1 arhõ unuduḱ",
-       "whatlinkshere-hidetrans": "Selet́ $1",
+       "whatlinkshere-hideredirs": "$1 ᱟᱨᱦᱚᱸ ᱩᱱᱩᱫᱩᱜ",
+       "whatlinkshere-hidetrans": "ᱥᱮᱞᱮᱫ $1",
        "whatlinkshere-hidelinks": "$1 ᱡᱚᱱᱚᱲᱠᱚ",
        "whatlinkshere-hideimages": "$1 ᱨᱮᱫ ᱡᱳᱱᱳᱲᱠᱚ",
        "whatlinkshere-filters": "ᱪᱷᱟᱹᱱᱤᱠᱩ",
-       "block": "Beoharić esedem",
+       "block": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱮᱥᱮᱫᱮᱢ",
        "blockip": "Beoharić esedem",
-       "ipboptions": "2 Ghonṭa : 2 hours, 1 maha:1 day, 3 maha : 3 days,1 hapta :1 week, 2 hapta : 2 weeks, 1 cando :1 month, 3 cando : 3 months,6 cando :6 months,  1 serma :1 year,  Aemamaha : infinite",
+       "ipboptions": "᱒ ᱜᱷᱚᱱᱴᱟ : 2 hours, ᱑ ᱢᱟᱦᱟᱸ:1 day, ᱓ ᱢᱟᱦᱟᱸ : 3 days,᱑ ᱦᱟᱯᱛᱟ:1 week, ᱒ ᱦᱟᱯᱛᱟ : 2 weeks, ᱑ ᱪᱟᱸᱫᱚ :1 month, ᱓ ᱪᱟᱸᱫᱚ : 3 months, ᱖ ᱪᱟᱸᱫᱚ:6 months, ᱑ ᱥᱮᱨᱢᱟ:1 year, ᱥᱤᱢᱟᱹᱱᱟᱹ ᱪᱷᱟᱲᱟ : infinite",
        "autoblocklist-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
-       "ipblocklist": "Beoharic esetgeyay",
-       "ipblocklist-submit": "Sendra",
+       "ipblocklist": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱮᱥᱮᱫᱜᱮᱭᱟᱭ",
+       "ipblocklist-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "infiniteblock": "ᱚᱦᱤᱥᱟᱹᱵᱽ",
        "emailblock": "E-mail do esetgea",
        "blocklink": "ᱮᱥᱮᱫᱽ",
-       "unblocklink": "bań block",
+       "unblocklink": "ᱵᱟᱝ ᱮᱥᱮᱫ",
        "change-blocklink": "block judạ",
        "contribslink": "ᱮᱱᱮᱢ",
        "emaillink": "E-mail kulmẽ",
-       "blocklogpage": "Tala eset",
-       "blocklogentry": "Eset [[$1]] sãote cabaḱ okte oka do $2 $3",
+       "blocklogpage": "ᱠᱩᱞᱩᱯ ᱮᱥᱮᱫ",
+       "blocklogentry": "ᱮᱥᱮᱫ [[$1]] ᱥᱟᱶᱛᱮ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ ᱚᱠᱟ ᱫᱚ $2 $3",
        "reblock-logentry": "ᱵᱚᱫᱚᱞᱮᱱᱟ ᱵᱚᱸᱫ ᱥᱟᱡᱟᱣᱠᱚ [[$1]] ᱞᱟᱹᱜᱤᱫ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ $2 $3 ᱥᱟᱶ",
-       "block-log-flags-nocreate": "Ekaunṭ benao do bondogeya",
+       "block-log-flags-nocreate": "ᱮᱠᱟᱣᱱᱴ ᱵᱮᱱᱟᱣ ᱵᱚᱱᱫᱷ ᱜᱮᱭᱟ",
        "block-log-flags-noemail": "E-mail do esetgea",
        "block-log-flags-hiddenname": "Beoharićaḱ ńutum do ukugea",
        "proxyblocker": "ᱯᱨᱚᱠᱥᱤ ᱮᱥᱮᱫᱤᱡ",
        "movepagebtn": "ᱥᱟᱦᱴᱟ ᱥᱟᱦᱟᱭᱢᱮ",
        "pagemovedsub": "Ocogoḱ do hoena",
-       "movelogpage": "Tala cạbi ocoḱme",
-       "revertmove": "ruạr agu",
+       "movelogpage": "ᱛᱟᱞᱟ ᱪᱟᱹᱵᱤ ᱚᱪᱚᱜᱽᱢᱮ",
+       "revertmove": "ᱨᱩᱣᱟᱹᱲ ᱟᱹᱜᱩ",
        "export": "ᱟᱹᱜᱩᱭᱮᱱ ᱥᱟᱦᱴᱟᱠᱚ",
-       "export-addcat": "Joṛaomẽ",
-       "export-addns": "Joṛaomẽ",
-       "allmessagesname": "Ńutum",
+       "export-addcat": "ᱥᱮᱞᱮᱫ",
+       "export-addns": "ᱥᱮᱞᱮᱫ",
+       "allmessagesname": "ᱧᱩᱛᱩᱢ",
        "allmessagesdefault": "Bań bhul mesag ol",
-       "allmessages-filter-all": "Sanamaḱ",
-       "allmessages-filter-submit": "Calaḱmẽ",
+       "allmessages-filter-all": "ᱡᱚᱛᱚ",
+       "allmessages-filter-submit": "ᱪᱟᱞᱟᱜ ᱢᱮ",
        "thumbnail-more": "ᱞᱟᱹᱴᱩᱭ ᱢᱮ",
        "thumbnail_error": "Benawakan unuduḱ kạṭuṕ do baṅ ṭhika: $1",
-       "import-upload-filename": "Rẽt ńutum",
+       "import-upload-filename": "ᱨᱮᱫᱧᱩᱛᱩᱢᱺ",
        "importlogpage": "ᱞᱚᱜᱽ ᱟᱹᱜᱩ",
        "tooltip-pt-userpage": "{{GENDER:|ᱟᱢᱟᱜ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ}} ᱥᱟᱦᱴᱟ",
        "tooltip-pt-mytalk": "{{GENDER:|ᱟᱢᱟᱜ}} ᱨᱚᱲ ᱥᱟᱦᱴᱟ",
        "tooltip-pt-preferences": "{{GENDER:|ᱟᱢᱟᱜ}} ᱠᱩᱥᱤᱠᱚ",
        "tooltip-pt-watchlist": "ᱥᱟᱦᱴᱟ ᱛᱟᱹᱞᱠᱟᱹ ᱚᱠᱟᱛᱟᱜᱛᱮ ᱟᱢ ᱫᱚ ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱧᱮᱞᱮᱜ ᱠᱟᱱ",
-       "tooltip-pt-mycontris": "Mit́ṭen lisṭ {{GENDER:|amaḱ}} kạmiko reaḱ",
+       "tooltip-pt-mycontris": "ᱛᱟᱹᱞᱠᱟᱹ {{GENDER:|ᱟᱢᱟᱜ}} ᱮᱱᱮᱢᱠᱚ ᱨᱮᱭᱟᱜ",
        "tooltip-pt-login": "ᱟᱢ ᱫᱚ ᱵᱚᱞᱟᱜ ᱞᱟᱹᱜᱤᱛ ᱩᱫᱽᱜᱟᱣᱤᱧ ᱮᱢᱟᱢᱠᱟᱱᱟ; ᱵᱚᱞᱚᱜ ᱞᱟᱜᱟᱜ-ᱟ ᱚᱝᱠᱟ ᱫᱚ ᱵᱟᱝ",
        "tooltip-pt-logout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ",
        "tooltip-pt-createaccount": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱽᱴᱮᱱ ᱦᱤᱥᱟᱹᱵ ᱡᱷᱤᱪ ᱠᱟᱛᱮ ᱵᱚᱞᱚᱜ ᱞᱟᱹᱜᱤᱛᱤᱧ ᱩᱫᱽᱜᱟᱣᱮᱛ ᱢᱮᱭᱟ; ᱟᱫᱚ ᱡᱟᱹᱨᱩᱲ ᱵᱚᱞᱚᱜ ᱚᱝᱠᱟ ᱫᱚ ᱵᱟᱝ ᱠᱟᱱᱟ",
        "tooltip-ca-nstab-template": "ᱪᱷᱟᱸᱪ ᱧᱮᱞᱢᱮ",
        "tooltip-ca-nstab-help": "ᱜᱚᱸᱲᱚ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ",
        "tooltip-ca-nstab-category": "ᱛᱷᱚᱠ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ",
-       "tooltip-minoredit": "Noa do huḍiń joṛao lekate lekhay me",
-       "tooltip-save": "Bodolaḱko rukhiyayme",
-       "tooltip-preview": "Amaḱ bodolaḱ uduḱme, noa beoharme ạuri rukhiyayre",
-       "tooltip-diff": "Uduḱme okaṭaḱ onolem bodolakada",
+       "tooltip-minoredit": "ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱦᱤᱥᱟᱹᱵᱛᱮ ᱞᱮKᱦᱟᱭᱢᱮ",
+       "tooltip-save": "ᱵᱚᱫᱚᱞᱠᱩ ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ",
+       "tooltip-preview": "ᱟᱢᱟᱜ ᱵᱚᱫᱚᱞᱠᱩ ᱩᱫᱩᱜᱽᱢᱮ, ᱨᱩᱠᱷᱤᱭᱟᱹ ᱞᱟᱦᱟᱨᱮ ᱱᱚᱣᱟ ᱵᱮᱵᱦᱟᱨ ᱢᱮ᱾",
+       "tooltip-diff": "ᱚᱠᱟᱴᱟᱜ ᱮᱢ ᱵᱚᱫᱚᱞᱠᱟᱫᱟ ᱚᱱᱟ ᱩᱫᱩᱜᱽᱢᱮ",
        "tooltip-compareselectedversions": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱵᱟᱨᱭᱟ ᱧᱮᱞᱟᱹᱨᱩ ᱵᱷᱮᱜᱮᱫ ᱧᱮᱞ ᱢᱮ",
        "tooltip-watch": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱟᱢᱟᱜ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱡᱚᱲᱟᱣᱢᱮ",
        "tooltip-rollback": "ᱫᱚᱲᱦᱟᱛᱮ ᱢᱤᱫ ᱫᱷᱟᱣ ᱞᱤᱱ ᱛᱮ contributor ᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱥᱟᱯᱲᱟᱣ \"ᱜᱷᱩᱨᱞᱟᱹ ᱟᱹᱪᱩᱨ\" ᱢᱮ",
-       "tooltip-undo": "Noa joṛao kạmire ulṭao \"bạgiyaḱme\" ar ńeloḱ lekate noa joṛao jhicme. Noa do am guḍ karon joṛaoe ektiyariye emama.",
+       "tooltip-undo": "ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱹᱢᱤᱨᱮ \"ᱩᱞᱴᱟᱹᱣ ᱠᱟᱹᱢᱤ\" ᱟᱨ ᱧᱮᱞᱚᱜ ᱞᱮᱠᱟᱛᱮ ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱡᱷᱤᱡᱽᱢᱮ᱾ ᱱᱚᱣᱟ ᱫᱚ ᱟᱢ ᱢᱩᱬᱩᱛ ᱠᱟᱛᱷᱟᱨᱮ ᱥᱞᱮᱫᱚᱜ ᱨᱮᱱᱟᱜ ᱮᱠᱛᱤᱭᱟᱨ ᱮᱢᱟᱢᱟ᱾",
        "tooltip-preferences-save": "ᱠᱩᱥᱤᱠᱚ ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ",
-       "tooltip-summary": "Khaṭote guṭ katha bhoraome",
-       "others": "Eṭagaḱko",
-       "simpleantispam-label": "Enṭi espam ńel\nDo <strong>not</strong> noa purạome!",
+       "tooltip-summary": "ᱦᱩᱰᱤᱧᱛᱮ ᱢᱩᱬᱩᱛ ᱠᱟᱛᱷᱟ ᱵᱷᱚᱨᱟᱣᱢᱮ",
+       "others": "ᱮᱴᱟᱜᱠᱚ",
+       "simpleantispam-label": "ᱮᱱᱴᱤ ᱮᱥᱯᱮᱢ ᱧᱮᱞ᱾\nDo <strong>not</strong> ᱱᱚᱣᱟ ᱯᱩᱨᱟᱧᱢᱮ!",
        "pageinfo-title": "\"$1\" ᱞᱟᱹᱜᱤᱫ ᱥᱩᱪᱱᱟ",
        "pageinfo-header-basic": "ᱢᱩᱬ ᱥᱩᱪᱱᱟ",
        "pageinfo-header-edits": "ᱥᱟᱯᱲᱟᱣ ᱱᱟᱜᱟᱢ",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|ᱥᱟᱦᱴᱟ|ᱥᱟᱦᱴᱟᱠᱚ}}",
        "file-info-size": "$1 x $2 pixels, file size: $3, MIME type: $4",
        "file-info-size-pages": "$1 × $2 ᱯᱤᱠᱥᱮᱞ, ᱨᱮᱫ ᱥᱚᱝ: $3, MIME ᱞᱮᱠᱟᱱ: $4, $5 {{PLURAL:$5|ᱥᱟᱦᱴᱟ|ᱥᱟᱦᱴᱟᱠᱚ}}",
-       "file-nohires": "Aema resulation nondḍe banuḱa",
-       "svg-long-desc": "SVG rẽt, normalte $1 x $2 pixels, rẽt sayej: $3",
+       "file-nohires": "ᱟᱭᱢᱟ ᱨᱮᱡᱩᱞᱮᱥᱚᱱ ᱵᱟᱱᱩᱜ-ᱟ᱾",
+       "svg-long-desc": "SVG ᱨᱮᱫ, ᱱᱚᱨᱢᱟᱞᱛᱮ $1 x $2 pixels, ᱨᱮᱫ ᱡᱟᱜᱟ: $3",
        "show-big-image": "ᱟᱥᱚᱞ ᱨᱮᱫ",
-       "show-big-image-preview": "Noa ńeloḱ akar do:$1",
+       "show-big-image-preview": "ᱧᱮᱞᱡᱚᱝ ᱨᱮᱱᱟᱜ ᱟᱠᱟᱨ:$1",
        "show-big-image-other": "ᱮᱢᱟᱱ ᱛᱮᱭᱟᱜ {{PLURAL:$2|resolution|resolutions}}: $1",
        "show-big-image-size": "$1 X $2 Pixels",
-       "ilsubmit": "Sendra",
+       "ilsubmit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "bydate": "ᱢᱟᱹᱦᱤᱛ ᱛᱮ",
        "monday-at": "ᱚᱛᱮᱢᱟᱦᱟᱸ $1 ᱨᱮ",
        "tuesday-at": "ᱵᱟᱞᱮᱢᱟᱦᱟᱸ $1 ᱨᱮ",
        "metadata": "ᱢᱮᱴᱟ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ",
        "metadata-help": "ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱫᱚ ᱵᱟᱹᱲᱛᱤ ᱠᱟᱛᱷᱟᱠᱚ ᱢᱮᱱᱟᱜ-ᱟ, ᱯᱟᱥᱮᱡ ᱱᱚᱣᱟ ᱫᱚ ᱰᱤᱡᱤᱴᱟᱞ ᱠᱮᱢᱨᱟ ᱥᱮ ᱮᱥᱠᱮᱱᱟᱨ ᱵᱮᱵᱦᱟᱨ ᱠᱟᱛᱮ ᱰᱤᱡᱤᱴᱟᱞ ᱟᱠᱟᱫᱟᱠᱚ᱾ ᱡᱩᱫᱤ ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱭᱟᱜ ᱵᱩᱱᱤᱭᱟᱹᱫ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱥᱩᱫᱷᱨᱟᱣ ᱞᱮᱱᱠᱷᱟᱱ, ᱯᱟᱥᱮᱡ ᱥᱟᱱᱟᱢᱠᱚ ᱛᱷᱚᱲᱟ ᱵᱟᱝᱠᱩ ᱥᱚᱫᱚᱨᱚᱜ-ᱟ ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱫᱚ᱾",
        "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-       "exif-imagewidth": "Ganḍe",
-       "exif-imagelength": "Usul",
+       "exif-imagewidth": "ᱜᱟᱸᱰᱮ",
+       "exif-imagelength": "ᱩᱥᱩᱞ",
        "exif-orientation": "ᱥᱟᱢᱟᱝ",
        "exif-xresolution": "ᱜᱤᱛᱤᱡ ᱛᱮ",
        "exif-yresolution": "ᱛᱤᱝᱜᱩ ᱛᱮ",
        "exif-datetime": "ᱨᱮᱫ ᱵᱚᱫᱚᱞ ᱛᱟᱹᱨᱤᱠᱷ ᱟᱨ ᱚᱠᱛᱚ",
-       "exif-make": "Kemera tearić",
-       "exif-model": "Kemera model",
-       "exif-software": "Beoharen Software",
-       "exif-artist": "Onoliạ",
-       "exif-exifversion": "Exif bharson",
-       "exif-colorspace": "Roṅcoṅ dhạrti",
+       "exif-make": "ᱠᱮᱢᱮᱨᱟ ᱵᱮᱱᱟᱣᱤᱪ",
+       "exif-model": "ᱠᱮᱢᱮᱨᱟ ᱢᱚᱰᱮᱞ",
+       "exif-software": "ᱵᱮᱵᱦᱟᱨᱟᱠᱟᱱ ᱥᱚᱯᱷᱴᱚᱭᱟᱨ",
+       "exif-artist": "ᱚᱱᱚᱞᱤᱭᱟᱹ",
+       "exif-exifversion": "Exif ᱵᱷᱟᱨᱥᱚᱱ",
+       "exif-colorspace": "ᱨᱚᱝᱪᱚᱝ ᱡᱟᱜᱟ",
        "exif-datetimeoriginal": "ᱰᱟᱴᱟ ᱛᱮᱭᱟᱨ ᱨᱮᱱᱟᱜ ᱢᱟᱹᱦᱤᱛ ᱟᱨ ᱚᱠᱛᱚ",
        "exif-datetimedigitized": "ᱰᱤᱡᱤᱴᱟᱭᱡᱤᱝᱟᱜ ᱢᱟᱹᱦᱤᱛ ᱟᱨ ᱚᱠᱛᱚ",
        "exif-subsectime": "ᱢᱟᱹᱦᱤᱛ ᱚᱠᱛᱚ ᱴᱤᱯᱤᱡ",
        "imgmultigo": "ᱥᱮᱱᱚᱜ!",
        "imgmultigoto": "ᱥᱮᱱᱚᱜ ᱢᱮ ᱥᱟᱦᱴᱟ $1",
        "watchlisttools-clear": "ᱠᱩᱥᱤᱭᱟᱜ ᱞᱤᱥᱴᱤ ᱥᱟᱯᱷᱟ",
-       "watchlisttools-view": "Jońgṛao bodolaḱko ńel",
-       "watchlisttools-edit": "Ńelok tạlika ńel ar joṛao",
-       "watchlisttools-raw": "Baṇ purạo akan ńelok tạlika purạomẽ",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|galmarao]])",
+       "watchlisttools-view": "ᱡᱚᱝᱲᱟᱣ ᱵᱚᱫᱚᱞᱠᱩ ᱧᱮᱞ",
+       "watchlisttools-edit": "ᱧᱮᱞᱢᱮ ᱟᱨ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣᱢᱮ",
+       "watchlisttools-raw": "ᱵᱟᱝ ᱯᱩᱨᱟᱣ ᱟᱠᱟᱱ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣᱢᱮ",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ᱜᱟᱞᱢᱟᱨᱟᱣ]])",
        "duplicate-defaultsort": "'''Sontoroḱmẽ:''' ḍifolṭ sajao reaḱ cạbi: $2 lahare ḍifolṭ sajao reaḱ sakam: ''$1'' e bae luturaḱ kana.",
        "redirect": "ᱨᱮᱫ, ᱵᱮᱵᱷᱟᱨᱩᱭᱟᱹ, ᱥᱟᱦᱴᱟ, ᱧᱮᱞ-ᱟᱹᱨᱩ, ᱵᱟᱝᱠᱷᱟᱱ ᱞᱚᱜᱽ ID ᱫᱟᱨᱟᱭᱛᱮ ᱢᱚᱦᱰᱟ",
        "redirect-summary": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱢᱚᱦᱰᱟ ᱟ ᱢᱤᱫ ᱨᱮᱫ (ᱮᱢᱟᱠᱟᱱ ᱨᱮᱫᱧᱩᱛᱩᱢ) ᱴᱷᱮᱱ, ᱢᱤᱫ ᱥᱟᱦᱴᱟ (ᱮᱢᱮᱱ ᱟᱹᱨᱩᱣᱟᱜ ID ᱟᱨᱵᱟᱝ ᱥᱟᱦᱴᱟ ID),  ᱢᱤᱫ ᱵᱮᱵᱷᱟᱨᱩᱭᱟᱹ ᱥᱟᱦᱴᱟ (ᱮᱢᱮᱱ ᱮᱞᱩᱠ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ID ), ᱟᱨᱵᱟᱝ ᱢᱤᱫ ᱞᱚᱜᱽ ᱵᱚᱞᱚ (ᱮᱢᱮᱱ ᱞᱚᱜᱽ ID) ᱾ ᱵᱮᱵᱷᱟᱨᱟᱠᱟᱱ: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], ᱟᱨᱵᱟᱝ [[{{#Special:Redirect}}/logid/186]]",
        "fileduplicatesearch-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "specialpages": "ᱵᱤᱥᱮᱥ ᱥᱟᱦᱴᱟᱠᱚ",
        "external_image_whitelist": "#Noa sakam do cet leka menaḱa oṅkage dohoemẽ\n#Sanam okte re jạhiren kuṭrạ latar re (khạli hạtiń //talare) bạisạomẽ\n#Noako do bahre reaḱ (hotlinked) chubi reaḱ URL saõte milạo hoyoḱa\n#Okako milạḱa, onako do chubi lekate udugoḱa, baṅkhan do khali chubi joṛao udugoḱa\n#Noa layen reaḱ ehoṕre # menaḱa ona layenko menko hisapte beohar hoyoḱka\n#Noa do kas-baṅ rimjhạoaḱge\n#Noa dag cetanre regex kuṭrạ bạsạomẽ. Noa layen cetleka menaḱa oṅkage dohoemẽ</pre>",
-       "tag-filter": "[[Special:Tags|Tag]] saphay:",
+       "tag-filter": "[[Special:Tags|Tag]] ᱪᱷᱟᱹᱠᱱᱤ:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ᱥᱟᱛᱚᱢ|ᱥᱟᱛᱚᱢᱠᱩ}}]]: $2)",
        "tags-active-yes": "ᱦᱮᱸ",
        "tags-active-no": "ᱵᱟᱝ",
        "logentry-patrol-patrol-auto": "$1 ᱟᱡᱛᱮᱜᱮ {{GENDER:$2|ᱪᱤᱱᱦᱟᱹᱭᱮᱱᱟ}} $4 ᱧᱮᱞᱟᱹᱨᱩ $3 ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱾",
        "logentry-newusers-create": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ $1 ᱫᱚ {{GENDER:$2|ᱛᱮᱭᱟᱨᱱᱟ}}",
        "logentry-newusers-autocreate": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ $1 ᱫᱚ {{GENDER:$2|ᱛᱮᱭᱟᱨᱮᱱᱟ}} ᱟᱡᱛᱮᱜᱮ",
-       "logentry-upload-upload": "$1 {{GENDER:$2|rakaṕ akadae}} $3",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ᱨᱟᱠᱟᱵᱠᱟᱱ}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ᱞᱟᱫᱮᱭᱮᱱᱟ}} ᱢᱤᱫ ᱱᱟᱶᱟ ᱵᱷᱟᱨᱥᱚᱱ $3 ᱨᱮᱱᱟᱜ",
        "searchsuggest-search": "ᱥᱮᱸᱫᱽᱨᱟ {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|ᱢᱟᱦᱟᱸ|ᱢᱟᱸᱦᱟᱸ}}",
index ac93b67..6f3fefc 100644 (file)
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
-       "rc_categories_any": "Calesisiat",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} a pustis de sa modìfica",
        "newsectionsummary": "/* $1 */ setzione noa",
index ca6b172..d2c3b55 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[taliata di {{PLURAL:$1|nu utenti|$1 utenti}}]",
-       "rc_categories": "Lìmita a li catigurìi (spartuti cu «|»)",
-       "rc_categories_any": "Qualegghiè tra chiddi scigghiuti",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} appressu dû canciamentu",
        "newsectionsummary": "/* $1 */ sizzioni nova",
        "rc-enhanced-expand": "Ammustra li dittagghî",
index c6d54eb..c58040b 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 watchin {{PLURAL:$1|uiser|uisers}}]",
-       "rc_categories": "Leemit tae categories (separate wi \"|\"):",
-       "rc_categories_any": "Ony o the chosen",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter chynge",
        "newsectionsummary": "/* $1 */ new section",
        "rc-enhanced-expand": "Shaw details",
index 5983959..e23d82d 100644 (file)
        "boteditletter": "گ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|واپرائيندڙ|واپرائيندڙن}} کي نظر ۾ رکندي]",
-       "rc_categories_any": "چونڊيلن مان ڪو بہ",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کانپوءِ",
        "newsectionsummary": "/* $1 */ نئون سيڪشن",
        "rc-enhanced-expand": "تفصيل ڏيکاريو",
index 180e320..93a1a40 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[abbaidadda da {{PLURAL:$1|un'utenti|$1 utenti}}]",
-       "rc_categories": "Limita a li categuri (siparaddi da \"|\")",
-       "rc_categories_any": "Cassisia",
        "newsectionsummary": "/* $1 */ noba sezzioni",
        "rc-enhanced-expand": "Musthrà dettagli (dumanda JavaScript)",
        "rc-enhanced-hide": "Cua dettàgli",
index 9f53e48..901b15a 100644 (file)
        "minoreditletter": "u",
        "newpageletter": "O",
        "number_of_watching_users_pageview": "[$1 čuovvujeaddji geavaheaddji]",
-       "rc_categories": "Beare luohkáin (earuheaddji lea ”|”)",
-       "rc_categories_any": "Mii beare",
        "recentchangeslinked": "Dán siiddu varas rievdadusat",
        "recentchangeslinked-feed": "Dán siiddu varas rievdadusat",
        "recentchangeslinked-toolbox": "Dán siiddu varas rievdadusat",
index bfa6b5e..1436537 100644 (file)
        "newpageletter": "H",
        "boteditletter": "R",
        "number_of_watching_users_pageview": "[$1 cait(o/ó)m cáminot]",
-       "rc_categories": "Limitde cayliíb (separatman \"|\" mii)",
-       "rc_categories_any": "Jömde pac",
        "newsectionsummary": "/* $1 */ hunseccion",
        "recentchangeslinked": "Quiix hámíigonix",
        "recentchangeslinked-feed": "Quiix hámíigonix",
index f629d11..da31a63 100644 (file)
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 goo ma {{PLURAL:$1|goykaa|goykey}} guna]",
-       "rc_categories": "Kayandi dumey ga (i fay nda \"|\")",
-       "rc_categories_any": "Affoo kul",
        "rc-change-size": "$1",
        "rc-change-size-new": "{{PLURAL:$1|cebsi}} $1 barmaa banda ga",
        "newsectionsummary": "/* $1 */ dunbu taaga",
index 392a55b..2ebb63a 100644 (file)
        "newpageletter": "N",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keravuojontis nauduotuos|keravuojontīs nauduotuojē|keravuojontiu nauduotuoju}}]",
-       "rc_categories": "Ruodītė tėk tas kateguorėjės (atskirkat nauduojont „|“)",
-       "rc_categories_any": "Bikuokė",
        "rc-change-size-new": "$1 {{PLURAL:$1|baits|baitā|baitu}} pu pakeitėma",
        "newsectionsummary": "/* $1 */ naus skėrsnelis",
        "rc-enhanced-expand": "Ruodītė smolkmenas",
index 3f0065f..ca5597b 100644 (file)
        "newpageletter": "N/Н",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
-       "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
-       "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
        "newsectionsummary": "/* $1 */ nova sekcija",
        "rc-enhanced-expand": "Pokaži detalje",
        "feedback-subject": "Tema:",
        "feedback-submit": "Unesi",
        "feedback-thanks": "Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.",
-       "searchsuggest-search": "Traži",
+       "searchsuggest-search": "Traži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "searchsuggest-containing": "sadrži...",
        "api-error-badtoken": "Unutrašnja greška: token nije ispravan.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
index 38894c0..7d7adf5 100644 (file)
        "boteditletter": "ⴱ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 iżŗi {{PLURAL:$1|amsqdac|imsqdacn}}]",
-       "rc_categories_any": "wanna",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|ⴱⴰⵢⵜ|ⵉⴷ ⴱⴰⵢⵜ}} ⴷⴼⴼⵉⵔ ⵏ ⵓⵙⵏⴼⵍ",
        "newsectionsummary": "/* $1 */ ⵜⵉⴳⵣⵎⵉ ⵜⴰⵎⴰⵢⵏⵓⵜ",
index 74f24b1..7849d68 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 ပႂ်ႉတူၺ်း {{PLURAL:$1|ၽူႈၸႂ်ႉတိုဝ်း|ၽူႈၸႂ်ႉတိုဝ်းၶဝ်}}]",
-       "rc_categories_any": "လိူၵ်ႈသေဢၼ်ဢၼ်",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ဝၢႆးသေလႅၵ်ႈလၢႆႈ",
        "newsectionsummary": "/* $1 */ ၵၼ်ဢၼ်မႂ်ႇ",
        "rc-enhanced-expand": "ၼႄပၼ် ႁူဝ်ယွႆႈမၼ်း",
index b1980a4..0fb539b 100644 (file)
        "newpageletter": "නව",
        "boteditletter": "රොබෝ",
        "number_of_watching_users_pageview": "[ {{PLURAL:$1| එක් පරිශීලකයෙක් මුර-කරයි|පරිශීලකවරුන් $1 ක් මුර-කරති}} ]",
-       "rc_categories": "ප්‍රවර්ගයන්ට සීමා කරන්න (\"|\" මගින් වෙන් කරන්න):",
-       "rc_categories_any": "තෝරාගත් ඕනෑම එකක්",
        "rc-change-size": "$1",
        "rc-change-size-new": "වෙනස් කළ පසු {{PLURAL:$1|බයිට|බයිටයන්}} $1 ක්",
        "newsectionsummary": "/* $1 */ නව ඡේදය",
index 0d74858..e962b50 100644 (file)
        "rcfilters-activefilters": "Aktívne filtre",
        "rcfilters-advancedfilters": "Pokročilé filtre",
        "rcfilters-limit-title": "Zobraziť zmeny",
+       "rcfilters-limit-and-date-label": "{{PLURAL:$1|Jedna úprava|$1 úpravy|$1 úprav}}, $2",
        "rcfilters-days-title": "Posledné dni",
        "rcfilters-hours-title": "Posledné hodiny",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|deň|dni|dní}}",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|sledujúci používateľ|sledujúci používatelia|sledujúcich používateľov}}]",
-       "rc_categories": "Obmedziť na kategórie (oddeľte znakom „|“)",
-       "rc_categories_any": "Akékoľvek z vybraných",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtov}} po zmene",
        "newsectionsummary": "/* $1 */ nová sekcia",
        "rc-enhanced-expand": "Zobraziť podrobnosti",
        "recentchangeslinked-feed": "Súvisiace úpravy",
        "recentchangeslinked-toolbox": "Súvisiace úpravy",
        "recentchangeslinked-title": "Zmeny týkajúce sa „$1”",
-       "recentchangeslinked-summary": "Táto špeciálna stránka obsahuje zoznam posledných úprav stránok, ''na ktoré odkazuje'' zadaná stránka (alebo ktoré patria do zadanej kategórie).\nStránky, ktoré sa nachádzajú vo vašom [[Special:Watchlist|zozname sledovaných]] sú vyznačené '''hrubo'''.",
+       "recentchangeslinked-summary": "Vložte názov článku, aby ste videli zmeny stránok, na ktoré odkazuje alebo ktoré odkazujú na danú stránku (aby ste videli články v kategórii, zadajte Kategória:Názov kategórie).\nStránky, ktoré sa nachádzajú vo vašom [[Special:Watchlist|zozname sledovaných]] sú vyznačené <strong>hrubo</strong>.",
        "recentchangeslinked-page": "Názov stránky:",
        "recentchangeslinked-to": "Zobraziť zmeny na stránkach, ''ktoré odkazujú na'' zadanú stránku",
        "recentchanges-page-added-to-category": "[[:$1]] zaradená do kategórie",
index f76e8dc..991e756 100644 (file)
        "loginreqlink": "لاگ ان",
        "accmailtitle": "پاس ورڈ بھیج ݙتے",
        "newarticle": "(نواں)",
+       "noarticletext": "ہݨ ایں ورقے تے کجھ کائنی لکھیا ہویا۔تساں ٻیاں ورقیاں وچ [[Special:Search/{{PAGENAME}}|ایں ورقے دے عنوان کوں ڳولھ سڳدے ہو]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ لاڳ وچ ڳولھ سڳدے ہو]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ایں ورقے کوں مُنڈھوں بݨا سڳدے ہو]</span>۔",
        "userpage-userdoesnotexist-view": "صارف کھاتہ \"$1\" رجسٹرڈ کائنی۔",
        "updated": "(اپ ڈیٹ تھی ڳیا)",
        "note": "<strong>نوٹ:</strong>",
index 2fd1892..b08b5cf 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[temo {{PLURAL:$1|spremlja|spremljata|spremljajo|spremlja|spremlja}} $1 {{PLURAL:$1|uporabnik|uporabnika|uporabniki|uporabnikov|uporabnikov}}]",
-       "rc_categories": "Omejitev na kategorije (ločite jih z »|«):",
-       "rc_categories_any": "Katera koli od izbranih",
        "rc-change-size-new": "po spremembi: $1 {{PLURAL:$1|zlog|zloga|zlogi|zlogov}}",
        "newsectionsummary": "/* $1 */ nov razdelek",
        "rc-enhanced-expand": "Pokaži podrobnosti",
        "rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.",
        "rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]",
        "sessionfailure-title": "Neuspeh seje",
-       "sessionfailure": "Vaša prijava ni uspela; da bi preprečili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.",
+       "sessionfailure": "Zdi se, da z vašo sejo prijave obstaja težava;\nto dejanje smo preklicali, da bi preprečili morebitno ugrabitev seje. Prosimo, ponovno potrdite obrazec.",
        "changecontentmodel": "Spremeni model vsebine strani",
        "changecontentmodel-legend": "Spremeni model vsebine",
        "changecontentmodel-title-label": "Naslov strani",
        "watchlistedit-clear-titles": "Naslovi:",
        "watchlistedit-clear-submit": "Počisti spisek nadzorov (To je trajno!)",
        "watchlistedit-clear-done": "Vaš spisek nadzorov smo počistili.",
+       "watchlistedit-clear-jobqueue": "Čistimo vaš spisek nadzorov. To lahko traja nekaj časa!",
        "watchlistedit-clear-removed": "Odstranili smo $1 {{PLURAL:$1|naslov|naslova|naslove|naslovov}}:",
        "watchlistedit-too-many": "Obstaja preveč strani, da bi jih tukaj prikazali.",
        "watchlisttools-clear": "Počisti spisek nadzorov",
index e25511c..835e324 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Nutzer]",
-       "rc_categories": "Ock Seyta aus dann Kategorien (getrennt miet „|“):",
-       "rc_categories_any": "Olle",
        "newsectionsummary": "Neuer Obschnitt /* $1 */",
        "rc-enhanced-expand": "Details oazeega (beneetigt JavaScript)",
        "rc-enhanced-hide": "Details verstecka",
index e5f30ea..c043222 100644 (file)
        "minoreditletter": "y",
        "newpageletter": "C",
        "boteditletter": "b",
-       "rc_categories": "Wuxuu u gaar yahay qeybaha  (u kala qeybsan \"|\")",
        "rc-enhanced-expand": "Itus ka hadalka (waxaa loo baahanyahay JavaScript)",
        "rc-enhanced-hide": "Qari ka hadalka",
        "recentchangeslinked": "Isbedelada la'xiriira",
index 1c5e1d4..a679ae4 100644 (file)
@@ -33,7 +33,8 @@
                        "Kosovastar",
                        "Matma Rex",
                        "Arianit",
-                       "Denisa"
+                       "Denisa",
+                       "Fanjiayi"
                ]
        },
        "tog-underline": "Nënvizimi i lidhjes:",
        "tog-showtoolbar": "Shfaq shiritin e veglave të redaktorit",
        "tog-editondblclick": "Redakto faqe në klikim të dyfishtë",
        "tog-editsectiononrightclick": "Aktivizo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit",
-       "tog-watchcreations": "Shto faqet e krijuara dhe skedat e ngarkuara prej meje tek lista e faqeve nën mbikqyrje",
-       "tog-watchdefault": "Shto faqet dhe skedat e redaktuara prej meje tek lista e faqeve nën mbikqyrje",
-       "tog-watchmoves": "Shto faqet dhe skedat e zhvendosura prej meje tek lista e faqeve nën mbikqyrje",
-       "tog-watchdeletion": "Shto faqet dhe skedat e grisura prej meje tek lista e faqeve nën mbikqyrje",
-       "tog-watchuploads": "Shtoni fotografitë e reja që ngarkova në listën mbikëqyrëse",
+       "tog-watchcreations": "Shto faqet e krijuara dhe skedarët e ngarkuar nga unë në listën time të mbikqyrjes",
+       "tog-watchdefault": "Shto faqet dhe skedarët e redaktuar prej meje në listën time të mbikqyrjes",
+       "tog-watchmoves": "Shto faqet dhe skedarët e zhvendosur nga unë, në listën time të mbikqyrjes",
+       "tog-watchdeletion": "Shto faqet dhe skedarët e fshirë nga unë në listën time të mbikqyrjes",
+       "tog-watchuploads": "Shto skedarët e rinj të ngarkuar nga unë në listën time të mbikëqyrjes",
        "tog-watchrollback": "Shto faqet ku unë kam kryer një rikthim tek lista ime mbikqyrëse",
        "tog-minordefault": "Shëno të gjitha redaktimet si të vogla automatikisht",
        "tog-previewontop": "Trego parapamjen para kutisë së redaktimit",
@@ -63,7 +64,7 @@
        "tog-shownumberswatching": "Trego numrin e përdoruesve që vëzhgojnë këtë faqe",
        "tog-oldsig": "Nënshkrimi juaj ekzistues:",
        "tog-fancysig": "Mbaje nënshkrimin si wikitekst (pa lidhje automatike)",
-       "tog-uselivepreview": "Përdor parapamjen e drejtpërdrejtë",
+       "tog-uselivepreview": "Shfaq parapmjet pa ringarkuar faqen",
        "tog-forceeditsummary": "Më njofto kur përmbledhjen e redaktimit e lë bosh",
        "tog-watchlisthideown": "Fshih redaktimet e mia nga lista e faqeve të vëzhguara",
        "tog-watchlisthidebots": "Fshih redaktimet e robotëve nga lista e faqeve të vëzhguara",
        "underline-always": "Gjithmonë",
        "underline-never": "Asnjëherë",
        "underline-default": "Parapërcaktuar nga shfletuesi",
-       "editfont-style": "Zgjidh stilin e gërmave të hapsirës:",
+       "editfont-style": "Zgjidh stilin e germave të hapsirës:",
        "editfont-monospace": "Germa me hapësirë të barabartë",
        "editfont-sansserif": "Germa Sans-serif",
-       "editfont-serif": "Gërma serif",
+       "editfont-serif": "Germa serif",
        "sunday": "E diel",
        "monday": "E hënë",
        "tuesday": "E martë",
        "thursday": "E enjte",
        "friday": "E premte",
        "saturday": "E shtunë",
-       "sun": "Di",
-       "mon": "Hë",
-       "tue": "Ma",
-       "wed": "Më",
+       "sun": "Die",
+       "mon": "Hën",
+       "tue": "Mar",
+       "wed": "Mër",
        "thu": "Enj",
-       "fri": "Pr",
+       "fri": "Pre",
        "sat": "Sht",
        "january": "janar",
        "february": "shkurt",
        "apr": "Pri",
        "may": "Maj",
        "jun": "Qer",
-       "jul": "Korr",
-       "aug": "Gush",
+       "jul": "Kor",
+       "aug": "Gsh",
        "sep": "Sht",
        "oct": "Tet",
        "nov": "Nën",
-       "dec": "Dhje",
+       "dec": "Dhj",
        "january-date": "$1 janar",
        "february-date": "$1 shkurt",
        "march-date": "$1 mars",
        "october-date": "$1 tetor",
        "november-date": "$1 nëntor",
        "december-date": "$1 dhjetor",
-       "period-am": "PD",
+       "period-am": "AM",
        "period-pm": "PD",
        "pagecategories": "{{PLURAL:$1|Kategoria|Kategoritë}}",
        "category_header": "Faqet në kategorinë \"$1\"",
        "category-empty": "<em>Kjo kategori aktualisht nuk përmban asnjë faqe apo media.</em>",
        "hidden-categories": "{{PLURAL:$1|Kategori e fshehur|Kategori të fshehura}}",
        "hidden-category-category": "Kategori të fshehura",
-       "category-subcat-count": "{{PLURAL:$2|Kjo kategori ka vetëm këtë nën-kategori.|Kjo kategori ka {{PLURAL:$1|këtë nën-kategori|$1 këto nën-kategori}}, nga $2 gjithësej.}}",
-       "category-subcat-count-limited": "Kjo kategori ka {{PLURAL:$1|këtë nën-kategori|$1 këto nën-kategori}}.",
-       "category-article-count": "{{PLURAL:$2|Kjo kategori ka vetëm këtë faqe.|Kjo kategori ka {{PLURAL:$1|këtë faqe|$1 faqe}} nga $2 gjithësej.}}",
-       "category-article-count-limited": "{{PLURAL:$1|Kjo faqe është|$1 faqe janë}} në këtë kategori.",
-       "category-file-count": "{{PLURAL:$2|Kjo kategori ka vetëm këtë skedë.|{{PLURAL:$1|Kjo skedë është|$1 skeda janë}} në këtë kategori, nga $2 gjithësej.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Kjo skedë është|$1 skeda janë}} në këtë kategori.",
+       "category-subcat-count": "{{PLURAL:$2|Kjo kategori ka vetëm këtë nënkategori.|Kjo kategori ka {{PLURAL:$1|nënkategori|$1 nënkategori}}, nga gjithsej $2.}}",
+       "category-subcat-count-limited": "Kjo kategori ka {{PLURAL:$1|nënkategori|$1 nënkategori}}.",
+       "category-article-count": "{{PLURAL:$2|Kjo kategori ka vetëm këtë faqe.|Kjo kategori ka {{PLURAL:$1|faqe|$1 faqe}} nga gjithsej $2.}}",
+       "category-article-count-limited": "{{PLURAL:$1|faqe është|$1 faqe janë}} në këtë kategori.",
+       "category-file-count": "{{PLURAL:$2|Kjo kategori ka vetëm këtë skedar.|Kjo kategori ka {{PLURAL:$1|skedar|$1 skedarë}} nga gjithsej $2.}}",
+       "category-file-count-limited": "Në kategorinë aktuale ka {{PLURAL:$1|skedar|$1 skedarë}}.",
        "listingcontinuesabbrev": "vazh.",
        "index-category": "Faqe të indeksuara",
        "noindex-category": "Faqe jo të indeksuara",
        "and": "&#32;dhe",
        "faq": "Pyetje të shpeshta",
        "actions": "Veprimet",
-       "namespaces": "Hapsirat e emrit",
+       "namespaces": "Hapësirat e emrit",
        "variants": "Variantat",
        "navigation-heading": "Menyja e navigimit",
        "errorpagetitle": "Gabim",
-       "returnto": "Kthehuni tek $1",
+       "returnto": "Kthehu tek $1",
        "tagline": "Nga {{SITENAME}}",
        "help": "Ndihmë",
        "search": "Kërko",
        "edit": "Redakto",
        "edit-local": "Redakto përshkrimin lokal",
        "create": "Krijo",
-       "create-local": "Shtonipërshkrimin lokal",
+       "create-local": "Shto përshkrimin lokal",
        "delete": "Fshi",
-       "undelete_short": "Anullo fshirjen {{PLURAL:$1|një redaktim|$1 redaktime}}",
+       "undelete_short": "Anulo fshirjen {{PLURAL:$1|një redaktim|$1 redaktime}}",
        "viewdeleted_short": "Shiko {{PLURAL:$1|një redaktim të fshirë|$1 redaktime të fshira}}",
        "protect": "Mbroje",
        "protect_change": "ndrysho",
        "talkpagelinktext": "Diskuto",
        "specialpage": "Faqe speciale",
        "personaltools": "Mjetet e mia",
-       "talk": "Diskutimet",
+       "talk": "Diskutim",
        "views": "Shikime",
-       "toolbox": "Mjete",
+       "toolbox": "Mjetet",
        "tool-link-userrights": "Ndrysho grupet e {{GENDER:$1|përdoruesit}}",
        "tool-link-userrights-readonly": "Shiko grupet e {{GENDER:$1|përdoruesit}}",
        "tool-link-emailuser": "Dërgo email {{GENDER:$1|user}}",
        "youhavenewmessagesmulti": "Ju keni mesazhe të reja në $1",
        "editsection": "redakto",
        "editold": "redakto",
-       "viewsourceold": "shiko tekstin",
+       "viewsourceold": "shiko burimin",
        "editlink": "redakto",
-       "viewsourcelink": "Shiko tekstin",
-       "editsectionhint": "Redaktoni seksionin: $1",
-       "toc": "Përmbajtje",
+       "viewsourcelink": "shiko burimin",
+       "editsectionhint": "Redakto seksionin: $1",
+       "toc": "Përmbajtja",
        "showtoc": "trego",
        "hidetoc": "fshih",
-       "collapsible-collapse": "Ngushtoje",
-       "collapsible-expand": "Zgjeroje",
+       "collapsible-collapse": "Ngushto",
+       "collapsible-expand": "Zgjero",
        "confirmable-confirm": "A je {{GENDER:$1|i|e}} sigurt?",
-       "confirmable-yes": "PO",
+       "confirmable-yes": "Po",
        "confirmable-no": "Jo",
        "thisisdeleted": "Shiko ose rikthe $1?",
        "viewdeleted": "Do ta shikosh $1?",
        "red-link-title": "$1 (faqja nuk ekziston)",
        "sort-descending": "Radhit në zbritje",
        "sort-ascending": "Radhit në ngjitje",
-       "nstab-main": "Artikulli",
+       "nstab-main": "Faqja",
        "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Faqja e përdoruesit|Faqja e përdorueses}}",
-       "nstab-media": "Medie",
+       "nstab-media": "Faqja e mediave",
        "nstab-special": "Faqe speciale",
        "nstab-project": "Projekti",
-       "nstab-image": "Skedë",
-       "nstab-mediawiki": "Mesazh",
+       "nstab-image": "Skedari",
+       "nstab-mediawiki": "Mesazhi",
        "nstab-template": "Stampa",
        "nstab-help": "Ndihmë",
        "nstab-category": "Kategoria",
        "error": "Gabim",
        "databaseerror": "Gabim në databazë",
        "databaseerror-text": "\nKjo mund të tregojë një gabim në software.",
-       "databaseerror-textcl": " ka ndodhur  një   gabim ne query te bazën të dhënash",
-       "databaseerror-query": "\nPyetje: $ 1",
+       "databaseerror-textcl": "Ka ndodhur një gabim në bazën e të dhënave.",
+       "databaseerror-query": "\nPyetësori: $1",
        "databaseerror-function": "Funksioni: $1",
-       "databaseerror-error": "Gabim: $1",
-       "laggedslavemode": "'''Kujdes:''' Kjo faqe nuk mund të ketë përditësime të kohëve të fundit.",
+       "databaseerror-error": "Gabimi: $1",
+       "transaction-duration-limit-exceeded": "Për të shmangur krijimin e vonesës së lartë të replikimit, ky transaksion u ndërpre, sepse kohëzgjatja e shkrimit ($1) tejkalonte limitin e dytë prej $2.\nNëse je duke ndryshuar shumë artikuj në të njëjtën kohë, në vend të kësaj provo t'i bësh disa operacione të vogla.",
+       "laggedslavemode": "'''Kujdes:''' Kjo faqe nuk mund të ketë përditësimet e fundit.",
        "readonly": "Databaza e kyçur",
        "enterlockreason": "Shëno arsyen e kyçjes, gjithashtu shëno se kur mund të hapet.",
        "readonlytext": "Databaza për momentin është mbyllur për redaktime dhe ndryshime të reja, ndoshta për shkak të rutinës së mirëmbajtjes. Pas përfundimit të mirëmbajtjes databaza do të hapet përsëri.\n\nAdministratori që e mbylli dha këtë arsye: $1",
        "nosuchusershort": "Nuk ka asnjë përdorues me emrin \"$1\".",
        "nouserspecified": "Ju duhet të jepni një nofkë",
        "login-userblocked": "Ky përdorues është bllokuar. Identifikimi nuk lejohet.",
-       "wrongpassword": "Fjalëkalimi që futët nuk është i saktë. Provoni përsëri!",
+       "wrongpassword": "Fjalëkalimi ose emri i përdoruesit që fute nuk është i saktë. Provo përsëri!",
        "wrongpasswordempty": "Fjalëkalimi juaj ishte bosh. Ju lutemi provoni përsëri.",
        "passwordtooshort": "Fjalëkalimi juaj është i pavlefshëm ose tepër i shkurtër. Ai duhet të ketë së paku {{PLURAL:$1|1 shkronjë|$1 shkronja}} dhe duhet të jetë i ndryshëm nga emri i përdoruesit.",
        "passwordtoolong": "Fjalëkalimet nuk mund të jenë më të gjatë se {{PLURAL:$1|1 karakter|$1 karaktere}}.",
        "botpasswords-insert-failed": "Dështoi për të shtuar emrin e botit \"$1\". është shtuar tashmë?",
        "botpasswords-update-failed": "Dështoi për të përditësuar emrin e bot \"$1\". Ishte fshirë?",
        "botpasswords-created-title": "Fjalëkalimi botit u krijua",
-       "botpasswords-created-body": "Fjalëkalimi i botit për botin me emër \"$1\" të përdoruesit \"$2\" u krijua.",
+       "botpasswords-created-body": "Fjalëkalimi i botit për botin me emër \"$1\" të {{GENDER:$2|user}} \"$2\" u krijua.",
        "botpasswords-updated-title": "Fjalëkalimi i botit u freskua",
-       "botpasswords-updated-body": "Fjalëkalimi i botit për botin me emër \"$1\" të përdoruesit \"$2\" u freskua.",
+       "botpasswords-updated-body": "Fjalëkalimi i botit për botin me emër \"$1\" {{GENDER:$2|të përdoruesit}} \"$2\" u përditëdsua.",
        "botpasswords-deleted-title": "Fjalëkalimi i botit u fshih",
-       "botpasswords-deleted-body": "Fjalëkalimi i botit për botin me emër \"$1\" të përdoruesit \"$2\" u fshi.",
+       "botpasswords-deleted-body": "Fjalëkalimi i botit për botin me emër \"$1\"  {{GENDER:$2|të përdoruesit}} \"$2\" u fshi.",
        "botpasswords-no-provider": "BotPasswordsSessionProvider nuk është në dispozicion.",
        "botpasswords-restriction-failed": "Kufizimet e fjalëkalimit të botit pengojnë këtë kyçje.",
        "resetpass_forbidden": "Fjalëkalimet nuk mund të ndryshohen",
        "passwordreset-emailelement": "Emri i përdoruesit: \n$1\n\nFjalëkalimi i përkohshëm: \n$2",
        "passwordreset-emailsentemail": "Nëse kjo është një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
        "passwordreset-emailsentusername": "Nëse një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
+       "passwordreset-nocaller": "Duhet të sigurohet një telefonues",
+       "passwordreset-nosuchcaller": "Telefonuesi nuk ekziston: $1",
        "passwordreset-invalidemail": "Adresë e-mail-i e pavlefshme",
        "passwordreset-nodata": "Nuk është dhënë as emri i përdoruesit e as adresa e emailit",
        "changeemail": "Ndrysho ose hiq postën elektronike",
        "permissionserrorstext": "Nuk keni leje për të bërë këtë veprim për {{PLURAL:$1|këtë arsye|këto arsye}}:",
        "permissionserrorstext-withaction": "Ju nuk keni leje për $2, për {{PLURAL:$1|këtë arsye|këto arsye}}:",
        "recreate-moveddeleted-warn": "'''Kujdes: Po rikrijoni një faqe që është grisur më parë.'''\n\nMendohuni nëse dëshironi të vazhdoni me veprimin tuaj në këtë faqe.\nRegjistri i grisjes për këtë faqe jepet më poshtë:",
-       "moveddeleted-notice": "Kjo faqe është grisur. Të dhënat e grisjes për këtë faqe gjenden më poshtë, për referencë.",
+       "moveddeleted-notice": "Kjo faqe është grisur. Të dhënat, protection e grisjes për këtë faqe gjenden më poshtë, për referencë.",
        "log-fulllog": "Shihe ditaret të plota",
        "edit-hook-aborted": "Redaktimi u ndërpre nga një goditje.\nNuk dha asnjë shpjegim.",
        "edit-gone-missing": "Faqja nuk mund t freskohet.\nDuket se është grisur.",
        "postedit-confirmation-created": "Faqja eshte krijuar",
        "postedit-confirmation-restored": "Faqja eshte kthyer",
        "postedit-confirmation-saved": "Redaktimi juaj eshte ruajtur.",
+       "postedit-confirmation-published": "Redaktimi yt u përditësua.",
        "edit-already-exists": "Faqja nuk mundej të hapet.\nAjo tanimë ekziston.",
        "defaultmessagetext": "Teksti i porosisë së parazgjedhur",
        "invalid-content-data": "Të pavlefshme të dhënave e përmbajtjes",
        "newpageletter": "R",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 duke u mbikqyrur nga {{PLURAL:$1|përdorues|përdorues}}]",
-       "rc_categories": "Kufizimi i kategorive (të ndara me \"|\")",
-       "rc_categories_any": "Ndonjë nga të zgjedhurat",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtë}} pas ndryshimit",
        "newsectionsummary": "/* $1 */ seksion i ri",
        "rc-enhanced-expand": "Trego detajet",
        "recentchangeslinked-feed": "Ndryshime të ndërvarura",
        "recentchangeslinked-toolbox": "Ndryshime të ndërvarura",
        "recentchangeslinked-title": "Ndryshime që kanë lidhje me \"$1\"",
-       "recentchangeslinked-summary": "Kjo është një listë e ndryshimeve së fundmi të faqeve të lidhura nga faqja e dhënë (ose bëjnë pjesë tek kategoria e dhënë).\nFaqet [[Special:Watchlist|nën mbikqyrjen tuaj]] duken të '''theksuara'''.",
+       "recentchangeslinked-summary": "Kjo është një listë e ndryshimeve së fundmi të faqeve të lidhura nga faqja e dhënë (ose bëjnë pjesë tek kategoria e dhënë).\nFaqet [[Special:Watchlist|nën mbikqyrjen tuaj]] duken të <strong>theksuara</strong>.",
        "recentchangeslinked-page": "Emri i faqes:",
        "recentchangeslinked-to": "Trego ndryshimet e faqeve që lidhen tek faqja e dhënë",
        "recentchanges-page-added-to-category": "[[:$1]] shtuar në kategori",
index 1a4a994..12a90f7 100644 (file)
        "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница",
        "tog-hidecategorization": "Сакриј категоризацију страница",
        "tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих",
-       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пни Ð¿Ñ\80иказ Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\81ваке Ð¿Ð¾Ñ\98единаÑ\87не Ñ\81Ñ\82Ñ\80аниÑ\86е у скорашњим изменама и списку надгледања",
+       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пиÑ\88и Ð¸Ð·Ð¼ÐµÐ½Ðµ Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и у скорашњим изменама и списку надгледања",
        "tog-numberheadings": "Аутоматски нумериши поднаслове",
        "tog-showtoolbar": "Прикажи траку с алаткама за уређивање",
        "tog-editondblclick": "Уређивање страница двоструким кликом",
        "tog-editsectiononrightclick": "Уређивање одељака десним кликом на њихове наслове",
-       "tog-watchcreations": "Ð\94одаÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86е ÐºÐ¾Ñ\98е Ð½Ð°Ð¿Ñ\80авим Ð¸ Ð´Ð°Ñ\82оÑ\82еке ÐºÐ¾Ñ\98е Ð¿Ð¾Ñ\88аÑ\99ем у мој списак надгледања",
+       "tog-watchcreations": "Ð\94одаÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86е ÐºÐ¾Ñ\98е Ð½Ð°Ð¿Ñ\80авим Ð¸ Ð´Ð°Ñ\82оÑ\82еке ÐºÐ¾Ñ\98е Ð¾Ñ\82пÑ\80емим у мој списак надгледања",
        "tog-watchdefault": "Додај странице и датотеке које изменим у мој списак надгледања",
        "tog-watchmoves": "Додај странице и датотеке које преместим у мој списак надгледања",
        "tog-watchdeletion": "Додај странице и датотеке које обришем у мој списак надгледања",
        "tog-watchuploads": "Додај датотеке које отпремим у мој списак надгледања",
        "tog-watchrollback": "Додај странице на којима сам вратио измене у мој списак надгледања",
        "tog-minordefault": "Означавај све измене као мање",
-       "tog-previewontop": "Ð\9fÑ\80икажи Ð¿Ñ\80еÑ\82пÑ\80еглед Ð¿Ñ\80е оквира за уређивање",
-       "tog-previewonfirst": "Прикажи преглед на првој измени",
-       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л ÐºÐ°Ð´Ð° Ñ\81е Ð¸Ð·Ð¼ÐµÐ½Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð»Ð¸ Ð´Ð°Ñ\82оÑ\82ека ÐºÐ¾Ñ\98Ñ\83 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ð¼",
-       "tog-enotifusertalkpages": "Пошаљи ми имејл када се моја страница за разговор измени",
-       "tog-enotifminoredits": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л Ð¸ Ð·Ð° Ð¼Ð°Ñ\9aе Ð¸Ð·Ð¼ÐµÐ½Ðµ страница и датотека",
-       "tog-enotifrevealaddr": "Ð\9fÑ\80икажи моју имејл адресу у порукама обавештења",
+       "tog-previewontop": "Ð\9fÑ\80икажи Ð¿Ñ\80еÑ\82пÑ\80еглед Ð¸Ð·Ð½Ð°Ð´ оквира за уређивање",
+       "tog-previewonfirst": "Прикажи претпреглед при првој измени",
+       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л ÐºÐ°Ð´Ð° Ñ\81е Ð¿Ñ\80омени Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð»Ð¸ Ð´Ð°Ñ\82оÑ\82ека Ñ\81а Ð¼Ð¾Ð³ Ñ\81пиÑ\81ка Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа",
+       "tog-enotifusertalkpages": "Пошаљи ми имејл кад се промени моја страница за разговор",
+       "tog-enotifminoredits": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л Ð¸ ÐºÐ¾Ð´ Ð¼Ð°Ñ\9aиÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° страница и датотека",
+       "tog-enotifrevealaddr": "Ð\9eÑ\82кÑ\80иÑ\98 моју имејл адресу у порукама обавештења",
        "tog-shownumberswatching": "Прикажи број корисника који надгледају",
        "tog-oldsig": "Ваш тренутни потпис:",
        "tog-fancysig": "Сматрај потпис као викитекст (без самоповезивања)",
-       "tog-uselivepreview": "Ð\9fÑ\80икажи Ð¿Ñ\80еÑ\82пÑ\80еглед Ð±ÐµÐ· Ð¾Ñ\81вежаваÑ\9aа Ñ\81Ñ\82Ñ\80ане",
+       "tog-uselivepreview": "Ð\9fÑ\80икажи Ð¿Ñ\80еÑ\82пÑ\80еглед Ð±ÐµÐ· Ð¿Ð¾Ð½Ð¾Ð²Ð½Ð¾Ð³ Ñ\83Ñ\87иÑ\82аваÑ\9aа Ñ\81Ñ\82Ñ\80аниÑ\86е",
        "tog-forceeditsummary": "Упозори ме када не унесем опис измене",
        "tog-watchlisthideown": "Сакриј моје измене са списка надгледања",
        "tog-watchlisthidebots": "Сакриј измене ботова са списка надгледања",
        "tog-watchlisthideminor": "Сакриј мање измене са списка надгледања",
        "tog-watchlisthideliu": "Сакриј измене пријављених корисника са списка надгледања",
-       "tog-watchlistreloadautomatically": "Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð¾Ñ\81вежи списак надгледања кад год се филтер измени (потребан JavaScript)",
-       "tog-watchlistunwatchlinks": "Додај везе за директно додавање/уклањање ставки са списка надгледања (потребан ЈаваСкрипт)",
+       "tog-watchlistreloadautomatically": "Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ñ\83Ñ\87иÑ\82аÑ\98 списак надгледања кад год се филтер измени (потребан JavaScript)",
+       "tog-watchlistunwatchlinks": "Додај везе за директно додавање/уклањање ставки са списка надгледања (потребан JavaScript)",
        "tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања",
        "tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања",
        "tog-watchlisthidecategorization": "Сакриј категоризацију страница",
        "tog-showhiddencats": "Прикажи скривене категорије",
        "tog-norollbackdiff": "Не приказуј разлику након извршеног враћања",
        "tog-useeditwarning": "Упозори ме када напуштам страницу са несачуваним изменама",
-       "tog-prefershttps": "Увек ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ñ\81игÑ\83Ñ\80нÑ\83 ÐºÐ¾Ð½ÐµÐºÑ\86иÑ\98Ñ\83 ÐºÐ°Ð´Ð° сам пријављен.",
+       "tog-prefershttps": "Увек ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ñ\81игÑ\83Ñ\80нÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð¾Ðº сам пријављен.",
        "underline-always": "Увек",
        "underline-never": "Никад",
        "underline-default": "Према теми или прегледачу",
-       "editfont-style": "Ð\98зглед Ñ\84онÑ\82а Ñ\83 Ñ\83Ñ\80еÑ\92иваÑ\87ком Ð¾ÐºÐ²Ð¸Ñ\80Ñ\83:",
+       "editfont-style": "СÑ\82ил Ñ\84онÑ\82а Ñ\83 Ð¾ÐºÐ²Ð¸Ñ\80Ñ\83 Ð·Ð° Ñ\83Ñ\80еÑ\92иваÑ\9aе:",
        "editfont-monospace": "Сразмерно широк фонт",
        "editfont-sansserif": "Бесерифни фонт",
        "editfont-serif": "Серифни фонт",
        "oct": "окт",
        "nov": "нов",
        "dec": "дец",
-       "january-date": "$1 јануар",
-       "february-date": "$1 фебруар",
-       "march-date": "$1 март",
-       "april-date": "$1 април",
-       "may-date": "$1 мај",
-       "june-date": "$1 јун",
-       "july-date": "$1 јул",
-       "august-date": "$1 август",
-       "september-date": "$1 септембар",
-       "october-date": "$1 окотобар",
-       "november-date": "$1 новембар",
-       "december-date": "$1 децембар",
+       "january-date": "$1. јануар",
+       "february-date": "$1. фебруар",
+       "march-date": "$1. март",
+       "april-date": "$1. април",
+       "may-date": "$1. мај",
+       "june-date": "$1. јун",
+       "july-date": "$1. јул",
+       "august-date": "$1. август",
+       "september-date": "$1. септембар",
+       "october-date": "$1. окотобар",
+       "november-date": "$1. новембар",
+       "december-date": "$1. децембар",
        "period-am": "преподне",
        "period-pm": "поподне",
        "pagecategories": "{{PLURAL:$1|Категорија|Категорије|Категорија}}",
        "noindex-category": "Непописане странице",
        "broken-file-category": "Странице с неисправним везама до датотека",
        "about": "О нама",
-       "article": "СÑ\82Ñ\80аниÑ\86а Ñ\81а Ñ\81адÑ\80жаÑ\98ем",
+       "article": "Чланак",
        "newwindow": "(отвара се у новом прозору)",
        "cancel": "Откажи",
        "moredotdotdot": "Више…",
        "navigation-heading": "Навигациони мени",
        "errorpagetitle": "Грешка",
        "returnto": "Назад на $1.",
-       "tagline": "Из {{SITENAME}}",
+       "tagline": "Извор: {{SITENAME}}",
        "help": "Помоћ",
        "search": "Претражи",
+       "search-ignored-headings": " #<!-- не мењајте ништа у овом реду --> <pre>\n# Наслови који ће бити занемарени при претрази.\n# Измене су видљиве одмах након што се страница са насловом попише.\n# Можете изнудити поновно пописивање „нултом” изменом.\n# Синтакса је следећа:\n#  * Сваки ред који започиње знаком „#” је коментар.\n#  * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашње везе\nТакође погледајте\n #</pre> <!-- не мењајте ништа у овом реду -->",
        "searchbutton": "Претражи",
        "go": "Иди",
        "searcharticle": "Иди",
        "create": "Направи",
        "create-local": "Додај локални опис",
        "delete": "Обриши",
-       "undelete_short": "Врати {{PLURAL:$1|1=једну обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
+       "undelete_short": "Врати {{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
        "viewdeleted_short": "Погледај {{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
        "protect": "Заштити",
        "protect_change": "промени",
        "talk": "Разговор",
        "views": "Прегледи",
        "toolbox": "Алатке",
-       "tool-link-userrights": "Ð\9fÑ\80омени {{GENDER:$1|корисничке}} групе",
+       "tool-link-userrights": "УÑ\80еди {{GENDER:$1|корисничке}} групе",
        "tool-link-userrights-readonly": "{{GENDER:$1|Корисничке}} групе",
        "tool-link-emailuser": "Пошаљи имејл {{GENDER:$1|кориснику|корисници}}",
        "imagepage": "Погледај страницу датотеке",
        "viewhelppage": "Погледај страницу помоћи",
        "categorypage": "Погледај страницу категорије",
        "viewtalkpage": "Погледај разговор",
-       "otherlanguages": "Ð\9dа Ð´Ñ\80Ñ\83гим Ñ\98езиÑ\86има",
+       "otherlanguages": "Ð\94Ñ\80Ñ\83ги Ñ\98езиÑ\86и",
        "redirectedfrom": "(преусмерено са $1)",
        "redirectpagesub": "Преусмерење",
        "redirectto": "Преусмерава на:",
        "lastmodifiedat": "Ова страница је последњи пут уређена на датум $1 у $2 ч.",
-       "viewcount": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð¿Ñ\80егледана {{PLURAL:$1|Ñ\98еданпÑ\83Ñ\82|$1 Ð¿Ñ\83Ñ\82а|$1 пута}}.",
+       "viewcount": "Ð\9eвоÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\98е Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пÑ\99ено {{PLURAL:$1|Ñ\98еданпÑ\83Ñ\82|$1 пута}}.",
        "protectedpage": "Заштићена страница",
        "jumpto": "Иди на:",
        "jumptonavigation": "навигацију",
        "aboutpage": "Project:О нама",
        "copyright": "Садржај је доступан под лиценцом $1 осим ако је другачије наведено.",
        "copyrightpage": "{{ns:project}}:Ауторска права",
-       "currentevents": "Ð\90кÑ\82Ñ\83елности",
-       "currentevents-url": "Project:Ð\90кÑ\82Ñ\83елности",
+       "currentevents": "Ð\9dовости",
+       "currentevents-url": "Project:Ð\9dовости",
        "disclaimers": "Одрицање одговорности",
        "disclaimerpage": "Project:Одрицање одговорности",
        "edithelp": "Помоћ при уређивању",
        "helppage-top-gethelp": "Помоћ",
-       "mainpage": "Главна страна",
-       "mainpage-description": "Главна страна",
+       "mainpage": "Ð\93лавна Ñ\81Ñ\82Ñ\80аниÑ\86а",
+       "mainpage-description": "Ð\93лавна Ñ\81Ñ\82Ñ\80аниÑ\86а",
        "policy-url": "Project:Правила",
        "portal": "Портал заједнице",
-       "portal-url": "Project:РадиониÑ\86а",
+       "portal-url": "Project:Ð\9fоÑ\80Ñ\82ал Ð·Ð°Ñ\98едниÑ\86е",
        "privacy": "Политика приватности",
        "privacypage": "Project:Политика приватности",
        "badaccess": "Грешке у овлашћењима",
-       "badaccess-group0": "Ð\9dиÑ\98е Ð²ам дозвољено да извршите захтевану радњу.",
+       "badaccess-group0": "Ð\9dиÑ\98е Ð\92ам дозвољено да извршите захтевану радњу.",
        "badaccess-groups": "Радња коју сте захтевали је ограничена само корисницима у {{PLURAL:$2|следећој групи|следећим групама}}: $1.",
-       "versionrequired": "Потребно је издање $1 Медијавикија",
-       "versionrequiredtext": "Потребно је издање $1 Медијавикија да бисте користили ову страницу.\nПогледајте страницу за [[Special:Version|издање]].",
+       "versionrequired": "Потребно је $1 издање Медијавикија",
+       "versionrequiredtext": "Потребно је $1 издање Медијавикија да бисте користили ову страницу.\nПогледајте страницу за [[Special:Version|издање]].",
        "ok": "У реду",
        "pagetitle": "$1 — {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "Преузето из „$1“",
        "youhavenewmessages": "Имате $1 ($2).",
-       "youhavenewmessagesfromusers": "Имате $1 од {{PLURAL:$3|другог корисника|$3 корисника|$3 корисника}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Имате}} $1 од {{PLURAL:$3|другог корисника|$3 корисника}} ($2).",
        "youhavenewmessagesmanyusers": "Имате $1 од много корисника ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|нову поруку|999=нове поруке}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|последња измена|999=последње измене}}",
-       "youhavenewmessagesmulti": "Ð\98маÑ\82е Ð½Ð¾Ð²Ð¸Ñ\85 Ð¿Ð¾Ñ\80Ñ\83ка на $1",
+       "newmessageslinkplural": "{{PLURAL:$1|нову поруку|нове поруке|нових порука}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|последња измена|последње измене|последњих измена}}",
+       "youhavenewmessagesmulti": "Ð\98маÑ\82е Ð½Ð¾Ð²Ðµ Ð¿Ð¾Ñ\80Ñ\83ке на $1",
        "editsection": "уреди",
        "editold": "уреди",
        "viewsourceold": "изворни код",
        "confirmable-confirm": "Да ли {{GENDER:$1|сте}} сигурни?",
        "confirmable-yes": "Да",
        "confirmable-no": "Не",
-       "thisisdeleted": "Ð\9fогледаÑ\82и Ð¸Ð»Ð¸ Ð²Ñ\80аÑ\82ити $1?",
-       "viewdeleted": "Ð\9fогледаÑ\82и $1?",
-       "restorelink": "{{PLURAL:$1|1=обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
+       "thisisdeleted": "Ð\9fогледаÑ\98 Ð¸Ð»Ð¸ Ð²Ñ\80ати $1?",
+       "viewdeleted": "Ð\9fогледаÑ\98 $1?",
+       "restorelink": "{{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
        "feedlinks": "Довод:",
        "feed-invalid": "Неисправна врста довода.",
        "feed-unavailable": "Доводи нису доступни",
        "nstab-template": "Шаблон",
        "nstab-help": "Помоћ",
        "nstab-category": "Категорија",
-       "mainpage-nstab": "Главна страна",
+       "mainpage-nstab": "Ð\93лавна Ñ\81Ñ\82Ñ\80аниÑ\86а",
        "nosuchaction": "Нема такве радње",
        "nosuchactiontext": "Радња наведена у адреси није исправна.\nМожда сте погрешно написали адресу или сте пратили застарелу везу.\nМогуће је и да се ради о грешци у софтверу викија.",
        "nosuchspecialpage": "Нема такве посебне странице",
        "databaseerror-query": "Упит: $1",
        "databaseerror-function": "Функција: $1",
        "databaseerror-error": "Грешка: $1",
-       "laggedslavemode": "<strong>Упозорење:</strong> страница је можда застарела.",
+       "laggedslavemode": "<strong>Упозорење:</strong> могуће је да страница није ажурирана.",
        "readonly": "База података је закључана",
        "enterlockreason": "Унесите разлог за закључавање, укључујући и време откључавања",
        "readonlytext": "База података је тренутно закључана, што значи да је није могуће мењати.\n\nСистемски администратор је навео следеће објашњење: $1",
        "missingarticle-diff": "(разлика: $1, $2)",
        "readonly_lag": "База података је аутоматски закључана да би се секундарни сервери базе података ускладили с главним.",
        "internalerror": "Унутрашња грешка",
-       "internalerror_info": "УнÑ\83Ñ\82Ñ\80аÑ\88Ñ\9aа грешка: $1",
+       "internalerror_info": "Ð\98нÑ\82еÑ\80на грешка: $1",
        "internalerror-fatal-exception": "Фатална грешка типа „$1“",
-       "filecopyerror": "Не могу да умножим датотеку „$1“ у „$2“.",
+       "filecopyerror": "Не могу да копирам датотеку „$1“ у „$2“.",
        "filerenameerror": "Не могу да преименујем датотеку „$1“ у „$2“.",
        "filedeleteerror": "Не могу да обришем датотеку „$1“.",
-       "directorycreateerror": "Не могу да направим фасциклу „$1“.",
+       "directorycreateerror": "Не могу да направим директоријум „$1“.",
        "directoryreadonlyerror": "Директоријум „$1“ је само за читање.",
        "directorynotreadableerror": "Директоријум „$1“ није читљив.",
        "filenotfound": "Не могу да пронађем датотеку „$1“.",
        "unexpected": "Неочекивана вредност: „$1“=„$2“.",
-       "formerror": "Грешка: не могу да пошаљем образац",
+       "formerror": "Грешка: не могу да пошаљем образац.",
        "badarticleerror": "Ова радња се не може извршити на овој страници.",
        "cannotdelete": "Не могу да обришем страницу или датотеку „$1“.\nВероватно ју је неко други обрисао.",
        "cannotdelete-title": "Не могу да обришем страницу „$1“",
        "cannotloginnow-title": "Пријава тренутно није могућа",
        "cannotloginnow-text": "Пријава није могућа када се користи $1.",
        "cannotcreateaccount-title": "Отварање налога није могуће",
+       "cannotcreateaccount-text": "Директно прављење налога није омогућено на овом викију.",
        "yourdomainname": "Домен:",
        "password-change-forbidden": "Не можете да промените лозинку на овом викију.",
        "externaldberror": "Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.",
        "createacct-email-ph": "Унесите Вашу имејл адресу",
        "createacct-another-email-ph": "Унесите имејл адресу",
        "createaccountmail": "Користите привремену, случајно створену лозинку и пошаљите на наведену имејл адресу",
+       "createaccountmail-help": "Може се користити да се некоме направи налог без сазнања лозинке.",
        "createacct-realname": "Право име (необавезно)",
        "createacct-reason": "Разлог",
        "createacct-reason-ph": "Зашто правите још један налог?",
+       "createacct-reason-help": "Порука која се приказује у дневнику стварања корисничких налога",
        "createacct-submit": "Отвори налог",
        "createacct-another-submit": "Отвори налог",
        "createacct-continue-submit": "Наставите отварање налога",
        "botpasswords-label-cancel": "Откажи",
        "botpasswords-label-delete": "Обриши",
        "botpasswords-label-resetpassword": "Ресетуј лозинку",
+       "botpasswords-label-grants": "Применљиве дозволе:",
        "botpasswords-label-grants-column": "Одобрено",
        "botpasswords-bad-appid": "„$1” није исправан назив бота.",
        "botpasswords-insert-failed": "Неуспешно додавање бота \"$1\". Да ли је већ додат?",
        "botpasswords-deleted-title": "Обрисана лозинка бота",
        "botpasswords-deleted-body": "Лозинка за бота „$1” корисника „$2” је обрисана.",
        "botpasswords-no-provider": "BotPasswordsSessionProvider није доступан.",
+       "botpasswords-restriction-failed": "Не можете се пријавити због ограничења лозинки за ботове.",
+       "botpasswords-not-exist": "Корисник „$1“ нема лозинку бота „$2“.",
        "resetpass_forbidden": "Лозинка не може бити промењена",
        "resetpass_forbidden-reason": "Лозинке није могуће променити: $1",
        "resetpass-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "postedit-confirmation-created": "Страница је направљена.",
        "postedit-confirmation-restored": "Страница је враћена.",
        "postedit-confirmation-saved": "Ваша измена је сачувана.",
+       "postedit-confirmation-published": "Ваша измена је објављена.",
        "edit-already-exists": "Не могу да направим страницу.\nИзгледа да она већ постоји.",
        "defaultmessagetext": "Подразумевани текст поруке",
        "content-failed-to-parse": "Не могу да рашчланим садржај типа $2 за модел $1: $3",
        "revdelete-no-file": "Тражена датотека не постоји.",
        "revdelete-show-file-confirm": "Желите ли да видите обрисану измену датотеке „<nowiki>$1</nowiki>“ од $2; $3?",
        "revdelete-show-file-submit": "Да",
-       "revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене}} [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене|Изабраних измена}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Изабрана верзија датотеке|Изабране верзије датотеке}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:",
        "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступни.",
        "recentchangesdays-max": "Највише $1 {{PLURAL:$1|дан|дана}}",
        "recentchangescount": "Број измена за приказ:",
        "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
-       "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваша списак надгледања, зато кључ немојте одавати никоме. \nАко је потребно, кључ [[Special:ResetTokens|можете ресетовати]].",
+       "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваш списак надгледања, зато кључ немојте одавати никоме. \nАко је потребно, кључ [[Special:ResetTokens|можете ресетовати]].",
        "savedprefs": "Ваша подешавања су сачувана.",
        "savedrights": "Корисничке групе за {{GENDER:$1|$1}} су сачуване.",
        "timezonelegend": "Временска зона:",
        "email-blacklist-label": "Онемогући следећим корисницима да ми шаљу имејлове:",
        "prefs-searchoptions": "Претрага",
        "prefs-namespaces": "Именски простори",
-       "default": "подÑ\80азÑ\83мевано",
+       "default": "подÑ\80азÑ\83мевана",
        "prefs-files": "Датотеке",
        "prefs-custom-css": "Прилагођени CSS",
        "prefs-custom-js": "Прилагођени јаваскрипт",
        "grant-group-file-interaction": "Уређивање датотека",
        "grant-group-watchlist-interaction": "Уређивање вашег списка надгледања",
        "grant-group-email": "Пошаљи имејл",
+       "grant-group-high-volume": "Извршавање великог броја радњи",
+       "grant-group-customization": "Прилагођавање и подешавања",
+       "grant-group-administration": "Извршавање административних радњи",
+       "grant-group-private-information": "Приступање Вашим личним подацима",
        "grant-group-other": "Разне активности",
        "grant-blockusers": "Блокирање и деблокирање корисника",
        "grant-createaccount": "Отварање налога",
        "grant-editpage": "Уређивање постојећих страница",
        "grant-editprotected": "Уређивање заштићених страница",
        "grant-highvolume": "Масовно уређивање",
+       "grant-oversight": "Скривање корисника и измена",
        "grant-patrol": "Патролирање измена",
        "grant-privateinfo": "Приступи приватним информацијама",
        "grant-protect": "Закључавање и откључавање страница",
        "grant-basic": "Основна права",
        "grant-viewdeleted": "Преглед обрисаних страница и датотека",
        "grant-viewmywatchlist": "Преглед вашег списак надгледања",
+       "grant-viewrestrictedlogs": "Прегледање ограничених уноса у дневнику",
        "newuserlogpage": "Дневник нових корисника",
        "newuserlogpagetext": "Ово је дневник нових корисника.",
        "rightslog": "Дневник корисничких права",
        "action-writeapi": "писање АПИ-ја",
        "action-delete": "брисање ове странице",
        "action-deleterevision": "брисање измена",
+       "action-deletelogentry": "бирсање уноса у дневницима",
        "action-deletedhistory": "прегледање обрисане историје странице",
+       "action-deletedtext": "преглед обрисаног текста измене",
        "action-browsearchive": "претраживање обрисаних страница",
        "action-undelete": "враћање страница",
        "action-suppressrevision": "прегледање и враћање сакривених измена",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|измена од ваше последње посете}}",
        "enhancedrc-history": "историја",
        "recentchanges": "Скорашње измене",
-       "recentchanges-legend": "Ð\9eпÑ\86иÑ\98е скорашњих измена",
+       "recentchanges-legend": "Ð\9fодеÑ\88аваÑ\9aа скорашњих измена",
        "recentchanges-summary": "Пратите скорашње измене на овој страници.",
-       "recentchanges-noresult": "Нема промена у задатом времену за задате критеријуме.",
+       "recentchanges-noresult": "Нема измена у задатом периоду који одговарају овим критеријумима.",
+       "recentchanges-notargetpage": "Унесите назив странице како бисте видели сродне измене.",
        "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
-       "recentchanges-label-newpage": "Ð\9eвом Ð¸Ð·Ð¼ÐµÐ½Ð¾Ð¼ Ð½Ð°Ð¿Ñ\80авÑ\99ена Ñ\98е Ð½ова страница",
-       "recentchanges-label-minor": "Ð\9eво Ñ\98е Ð¼ања измена",
-       "recentchanges-label-bot": "Ð\9eвÑ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ñ\98е Ð½Ð°Ð¿Ñ\80авио Ð±Ð¾Ñ\82",
+       "recentchanges-label-newpage": "Ð\9dова страница",
+       "recentchanges-label-minor": "Ð\9cања измена",
+       "recentchanges-label-bot": "Ð\91оÑ\82овÑ\81ка Ð¸Ð·Ð¼ÐµÐ½Ð°",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "rcfilters-group-results-by-page": "Групиши резултате по страницама",
        "rcfilters-activefilters": "Активни филтери",
        "rcfilters-advancedfilters": "Напредни филтери",
-       "rcfilters-limit-title": "Ð\9fÑ\80иказаÑ\82и Ð¸Ð·Ð¼ÐµÐ½Ð°",
+       "rcfilters-limit-title": "Ð\98змена Ð·Ð° Ð¿Ñ\80иказ",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|измена|измене}}, $2",
-       "rcfilters-date-popup-title": "Ð\92Ñ\80еменÑ\81ки Ð¾ÐºÐ²Ð¸Ñ\80",
-       "rcfilters-days-title": "Ð\9fÑ\80еÑ\82Ñ\85одниÑ\85 Ð½ÐµÐºÐ¾Ð»Ð¸ÐºÐ¾ Ð´Ð°Ð½Ð°",
-       "rcfilters-hours-title": "Ð\9fÑ\80еÑ\82Ñ\85одниÑ\85 Ð½ÐµÐºÐ¾Ð»Ð¸ÐºÐ¾ сати",
+       "rcfilters-date-popup-title": "Ð\92Ñ\80еменÑ\81ки Ð¿ÐµÑ\80иод",
+       "rcfilters-days-title": "СкоÑ\80аÑ\88Ñ\9aи Ð´Ð°Ð½Ð¸",
+       "rcfilters-hours-title": "СкоÑ\80аÑ\88Ñ\9aе сати",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}",
        "rcfilters-highlighted-filters-list": "Истакнуто: $1",
        "rcfilters-savedqueries-apply-and-setdefault-label": "Направи подразумевани филтер",
        "rcfilters-savedqueries-cancel-label": "Откажи",
        "rcfilters-savedqueries-add-new-title": "Сачувај тренутна подешавања филтера",
-       "rcfilters-savedqueries-already-saved": "Ð\9eви Ñ\84илÑ\82еÑ\80и Ñ\81Ñ\83 Ð²ÐµÑ\9b Ñ\83памÑ\9bени. Измените Ваша подешавања како бисте направили нове сачуване филтере.",
+       "rcfilters-savedqueries-already-saved": "Ð\9eви Ñ\84илÑ\82еÑ\80и Ñ\81Ñ\83 Ð²ÐµÑ\9b Ñ\81аÑ\87Ñ\83вани. Измените Ваша подешавања како бисте направили нове сачуване филтере.",
        "rcfilters-restore-default-filters": "Враћање подразумеваних филтера",
        "rcfilters-clear-all-filters": "Уклони све филтере",
-       "rcfilters-show-new-changes": "Погледајте најновије измене",
-       "rcfilters-search-placeholder": "Филтрирај скорашње измене (употребите мени или потражите име филтра)",
+       "rcfilters-show-new-changes": "Погледај најновије измене",
+       "rcfilters-search-placeholder": "Филтрирај скорашње измене (употребите мени или потражите име филтера)",
        "rcfilters-invalid-filter": "Неисправан филтер",
        "rcfilters-empty-filter": "Нема активних филтера. Сви доприноси су приказани.",
        "rcfilters-filterlist-title": "Филтери",
        "rcfilters-filterlist-whatsthis": "Како ово функционише?",
-       "rcfilters-filterlist-feedbacklink": "Ð\94аÑ\98Ñ\82е Ð¿Ð¾Ð²Ñ\80аÑ\82не Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98е Ð¾ Ð½Ð¾Ð²Ð¸Ð¼ (беÑ\82а) алатима за филтрирање",
+       "rcfilters-filterlist-feedbacklink": "Ð\9fоделиÑ\82е Ð²Ð°Ñ\88е Ð¼Ð¸Ñ\88Ñ\99еÑ\9aе Ð¾ (новим) алатима за филтрирање",
        "rcfilters-highlightbutton-title": "Истакни резултате",
        "rcfilters-highlightmenu-title": "Одабери боју",
        "rcfilters-highlightmenu-help": "Изаберите боју да бисте истакнули ово својство",
        "rcfilters-exclude-button-off": "Изостави означено",
        "rcfilters-exclude-button-on": "Изостави одабрано",
        "rcfilters-view-tags": "Означене измјене",
-       "rcfilters-view-namespaces-tooltip": "Филтер резултата према именском простору",
-       "rcfilters-view-tags-tooltip": "ФилÑ\82Ñ\80иÑ\80аÑ\9aе Ñ\80езÑ\83лÑ\82аÑ\82а према ознаци измјене",
+       "rcfilters-view-namespaces-tooltip": "Филтрирај резултате према именском простору",
+       "rcfilters-view-tags-tooltip": "ФилÑ\82Ñ\80иÑ\80аÑ\98 Ñ\80езÑ\83лÑ\82аÑ\82е према ознаци измјене",
        "rcfilters-view-return-to-default-tooltip": "Повратак на главни мени",
        "rcfilters-view-tags-help-icon-tooltip": "Сазнајте више о означеним измјенама",
        "rcfilters-liveupdates-button": "Ажурирања уживо",
        "rcfilters-watchlist-showupdated": "Измене на страницама које нисте посетили од када је измена извршена су <strong>подебљане</strong>, са испуњеним ознакама.",
        "rcfilters-preference-label": "Сакриј побољшану верзију скорашњих измена",
        "rcfilters-preference-help": "Поништава редизајн интерфејса из 2017. и све алатке додате тада и после.",
+       "rcfilters-filter-showlinkedfrom-label": "Прикажи измене на страницама са којих долазе везе",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Странице са којих долазе везе до</strong> изабране странице",
+       "rcfilters-filter-showlinkedto-label": "Прикажи измене на страницама ка којима воде везе",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Странице ка којима воде везе са</strong> одабране странице",
        "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
        "rclistfromreset": "Ресетуј одабир датума",
        "rclistfrom": "Прикажи нове измене почев од $2, $3",
        "boteditletter": "б",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник надгледа|корисника надгледају|корисника надгледају}}]",
-       "rc_categories": "Ограничи на категорије (раздвоји с усправном цртом):",
-       "rc_categories_any": "Сви изабрани",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајта|бајтова}} после измене",
        "newsectionsummary": "/* $1 */ нови одељак",
        "uploaded-href-unsafe-target-svg": "Пронађен href са несигурним подацима: URI одредиште <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
        "uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
        "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „<nowiki>$1</nowiki>“",
+       "uploadinvalidxml": "Није могуће рашчланити XML отпремљене датотеке.",
        "uploadvirus": "Датотека садржи вирус!\nДетаљи: $1",
        "uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.",
        "upload-source": "Изворна датотека",
        "upload-too-many-redirects": "Адреса садржи превише преусмерења",
        "upload-http-error": "Дошло је до HTTP грешке: $1",
        "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
-       "upload-dialog-title": "Отпремање датотека",
+       "upload-dialog-disabled": "Постављање датотека помоћу овог дијалога је онемогућено на овом викију.",
+       "upload-dialog-title": "Отпреми датотеку",
        "upload-dialog-button-cancel": "Откажи",
        "upload-dialog-button-back": "Назад",
        "upload-dialog-button-done": "Готово",
        "upload-form-label-own-work": "Ово је моје сопствено дело",
        "upload-form-label-infoform-categories": "Категорије",
        "upload-form-label-infoform-date": "Датум",
+       "upload-form-label-not-own-work-local-generic-local": "Такође можете покушати [[Special:Upload|подразумевану страницу за отпремање]].",
        "backend-fail-stream": "Не могу да емитујем датотеку $1.",
        "backend-fail-backup": "Не могу да направим резерву датотеке $1.",
        "backend-fail-notexists": "Датотека $1 не постоји.",
        "uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
        "uploadstash-errclear": "Чишћење датотека није успело.",
        "uploadstash-refresh": "Освежи списак датотека",
+       "uploadstash-thumbnail": "погледај минијатуру",
        "uploadstash-bad-path": "Путања не постоји.",
        "uploadstash-bad-path-invalid": "Путања није исправна.",
        "uploadstash-bad-path-unknown-type": "Непознат тип „$1“.",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Непрепознато име минијатуре.",
+       "uploadstash-bad-path-bad-format": "Кључ „$1“ није у одговарајућем облику.",
+       "uploadstash-file-not-found-no-thumb": "Не могу добити минијатуру.",
+       "uploadstash-file-not-found-no-local-path": "Нема локалне путање за умањену ставку.",
+       "uploadstash-file-not-found-no-object": "Не могу направити локални датотечни објекат за минијатуру.",
+       "uploadstash-file-not-found-no-remote-thumb": "Добављање минијатуре није успело: $1\nАдреса = $2",
+       "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за врсту садржаја.",
+       "uploadstash-file-not-found-not-exists": "Не могу наћи путању или ово није обична датотека.",
+       "uploadstash-wrong-owner": "Ова датотека ($1) не припада тренутном кориснику.",
+       "uploadstash-no-such-key": "Нема таквог кључа ($1). Не могу уклонити.",
+       "uploadstash-no-extension": "Нема траженог додатка.",
+       "uploadstash-zero-length": "Датотека је празна",
        "invalid-chunk-offset": "Неисправна полазна тачка",
        "img-auth-accessdenied": "Приступ је одбијен",
        "img-auth-nopathinfo": "Недостаје PATH_INFO.\nВаш сервер није подешен да прослеђује овакве податке.\nМожда је заснован на CGI-ју који не подржава img_auth.\nПогледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
        "listfiles-delete": "обриши",
        "listfiles-summary": "Ова посебна страница приказује све отпремљене датотеке.",
        "listfiles_search_for": "Назив датотеке:",
-       "listfiles-userdoesnotexist": "Кориснички налог „$1“ није регистрован.",
+       "listfiles-userdoesnotexist": "Кориснички налог „$1“ није отворен.",
        "imgfile": "датотека",
        "listfiles": "Списак датотека",
        "listfiles_thumb": "Минијатура",
        "pageswithprop-legend": "Стране с особином стране",
        "pageswithprop-text": "Ова страна излистава стране које имају одређену особину",
        "pageswithprop-prop": "Име особине:",
-       "pageswithprop-reverse": "СоÑ\80Ñ\82иÑ\80ај у супротном редоследу",
-       "pageswithprop-sortbyvalue": "СоÑ\80Ñ\82иÑ\80ај према својствима",
+       "pageswithprop-reverse": "Ð\9fоÑ\80еÑ\92ај у супротном редоследу",
+       "pageswithprop-sortbyvalue": "Ð\9fоÑ\80еÑ\92ај према својствима",
        "pageswithprop-submit": "Иди",
+       "pageswithprop-prophidden-long": "сакривено дуго текстуално својство ($1)",
+       "pageswithprop-prophidden-binary": "сакривено дуго бинарно својство ($1)",
        "doubleredirects": "Двострука преусмерења",
        "doubleredirectstext": "Ова страница приказује странице које преусмеравају на друга преусмерења.\nСваки ред садржи везе према првом и другом преусмерењу, као и одредишну страницу другог преусмерења која је обично „прави“ чланак на кога прво преусмерење треба да упућује.\n<del>Прецртани</del> уноси су већ решени.",
        "double-redirect-fixed-move": "[[$1]] је премештен.\nАутоматски је ажурирано и сада преусмерава на [[$2]].",
        "listusers": "Списак корисника",
        "listusers-editsonly": "Прикажи само кориснике који су уређивали",
        "listusers-creationsort": "Поређај по датуму стварања",
-       "listusers-desc": "СоÑ\80Ñ\82иÑ\80ај у опадајућем редоследу",
+       "listusers-desc": "Ð\9fоÑ\80еÑ\92ај у опадајућем редоследу",
        "usereditcount": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "usercreated": "{{GENDER:$3|је направио|је направила|је направио}} дана $1 у $2",
        "newpages": "Нове странице",
        "apisandbox-sending-request": "Слање API захтева...",
        "apisandbox-loading-results": "Пријем API резултата...",
        "apisandbox-results-error": "Дошло је до грешке приликом учитавања резултата API упита: $1.",
+       "apisandbox-request-selectformat-label": "Прикажи сахтеване податке као:",
        "apisandbox-request-url-label": "Адреса захтева:",
+       "apisandbox-request-time": "Време за извршавање захтјева: {{PLURAL:$1|$1 милисекунда|$1 милисекунде|$1 милисекунди}}",
+       "apisandbox-results-fixtoken": "Исправи жетон и пошаљи поново",
+       "apisandbox-alert-page": "Поља на страници су неисправна.",
+       "apisandbox-alert-field": "Вредност овог поља је неисправна.",
        "apisandbox-continue": "Настави",
        "apisandbox-continue-clear": "Очисти",
        "apisandbox-multivalue-all-namespaces": "$1 (сви именски простори)",
        "booksources-search": "Претражи",
        "booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:",
        "booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.",
+       "magiclink-tracking-rfc": "Странице с магичним RFC везама",
+       "magiclink-tracking-pmid": "Странице с магичним PMID везама",
        "magiclink-tracking-isbn": "Странице са ISBN магичним везама",
        "specialloguserlabel": "Извршилац:",
        "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
        "activeusers-intro": "Ово је списак корисника који су били активни {{PLURAL:$1|1=претходни дан|у последња $1 дана|у последњих $1 дана}}.",
        "activeusers-count": "$1 {{PLURAL:$1|радња|радње|радњи}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}",
        "activeusers-from": "Прикажи кориснике почев од:",
+       "activeusers-groups": "Прикажи кориснике који су чланови група:",
+       "activeusers-excludegroups": "Изузми кориснике који су чланови група:",
        "activeusers-noresult": "Корисник није пронађен.",
        "activeusers-submit": "Прикажи активне кориснике",
        "listgrouprights": "Права корисничких група",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
        "listgrants": "Дозволе",
+       "listgrants-grant": "Дозвола",
        "listgrants-rights": "Права",
        "trackingcategories": "Медијавики категорије",
        "trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењати уређивањем системских порука у именском простору {{ns:8}}.",
+       "trackingcategories-msg": "Праћење категорије",
        "trackingcategories-name": "Име поруке",
        "trackingcategories-desc": "Које странице се налазе у категорији",
+       "restricted-displaytitle-ignored": "Странице са занемареним насловима за приказ",
        "noindex-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__NOINDEX__</nowiki></code>.",
        "index-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__INDEX__</nowiki></code> и самим тим су индексиране од стране робота.",
        "broken-file-category-desc": "Странице које имају везе до непостојећих датотека.",
        "rollbacklinkcount": "врати $1 {{PLURAL:$1|измену|измене|измена}}",
        "rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}",
        "rollbackfailed": "Неуспешно враћање",
+       "rollback-missingrevision": "Не могу учитати податке о измени.",
        "cantrollback": "Не могу да вратим измену.\nПоследњи аутор је уједно и једини.",
        "alreadyrolled": "Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) није успело; неко други је у међувремену изменио или вратио страницу.\n\nПоследњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Опис измене: <em>$1</em>.",
        "revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
-       "revertpage-nouser": "Ð\92Ñ\80аÑ\9bене Ñ\81Ñ\83 Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\81кÑ\80ивеног ÐºÐ¾Ñ\80иÑ\81ника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
-       "rollback-success": "Ð\92Ñ\80аÑ\9bене Ñ\81Ñ\83 Ð¸Ð·Ð¼ÐµÐ½Ðµ {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86е}} {{GENDER:$3|$1}}\nна последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
+       "revertpage-nouser": "Ð\98змене Ñ\81кÑ\80ивеног ÐºÐ¾Ñ\80иÑ\81ника Ñ\81Ñ\83 Ð²Ñ\80аÑ\9bене на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
+       "rollback-success": "Ð\98змене {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86е}} {{GENDER:$3|$1}} Ñ\81Ñ\83 Ð²Ñ\80аÑ\9bене на последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Сесија је окончана",
-       "sessionfailure": "Ð\98згледа Ð´Ð° Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ð¿Ñ\80облем Ñ\81 Ð²Ð°Ñ\88ом Ñ\81еÑ\81иÑ\98ом;\nова Ñ\80адÑ\9aа Ñ\98е Ð¾Ñ\82казана Ð´Ð° Ð±Ð¸ Ñ\81е Ð¸Ð·Ð±ÐµÐ³Ð»Ð° Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80еба.\nÐ\92Ñ\80аÑ\82иÑ\82е Ñ\81е Ð½Ð° Ð¿Ñ\80еÑ\82Ñ\85однÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ñ\98е Ñ\83Ñ\87иÑ\82аÑ\98Ñ\82е Ð¸ Ð¿Ð¾ÐºÑ\83Ñ\88аÑ\98Ñ\82е Ð¿Ð¾Ð½Ð¾Ð²Ð¾.",
+       "sessionfailure": "Ð\98згледа Ð´Ð° Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ð¿Ñ\80облем Ñ\81 Ð²Ð°Ñ\88ом Ñ\81еÑ\81иÑ\98ом;\nова Ñ\80адÑ\9aа Ñ\98е Ð¾Ñ\82казана Ð´Ð° Ð±Ð¸ Ñ\81е Ð¸Ð·Ð±ÐµÐ³Ð»Ð° Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80еба.\nÐ\9cолимо, Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð¿Ð¾Ñ\88аÑ\99иÑ\82е Ð¾Ð±Ñ\80азаÑ\86.",
        "changecontentmodel": "Промени модел садржаја странице",
        "changecontentmodel-legend": "Промени модел садржаја",
        "changecontentmodel-title-label": "Наслов странице",
        "changecontentmodel-success-text": "Модел садржаја странице [[:$1]] је промењен.",
        "changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.",
        "changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање",
+       "changecontentmodel-emptymodels-title": "Нема доступних модела садржаја",
        "log-name-contentmodel": "Дневник промене модела садржаја",
        "log-description-contentmodel": "Ова страница приказује измене у моделима садржаја страница и странице које су направљене са моделом садржаја који се разликује од подразумеваног.",
        "logentry-contentmodel-change": "$1 је {{GENDER:$2|променио|променила}} модел садржаја странице $3 из „$4“ у „$5“",
        "mycontris": "Доприноси",
        "anoncontribs": "Доприноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "Кориснички налог „$1“ није регистрован.",
+       "contributions-userdoesnotexist": "Кориснички налог „$1“ није отворен.",
        "nocontribs": "Нема измена које одговарају наведеним критеријумима.",
        "uctop": "(последња)",
        "month": "од месеца (и раније):",
        "autoblocklist-submit": "Претражи",
        "autoblocklist-legend": "Списак аутоблокирања",
        "autoblocklist-localblocks": "{{PLURAL:$1|Локални аутоблок|Локални аутоблокови}}",
+       "autoblocklist-total-autoblocks": "Укупно аутоблокова: $1",
        "autoblocklist-empty": "Списак аутоблокирања је празан.",
        "autoblocklist-otherblocks": "{{PLURAL:$1|Други аутоблок|Други аутоблокови}}",
        "ipblocklist": "Блокирани корисници",
        "block-log-flags-hiddenname": "корисничко име је сакривено",
        "range_block_disabled": "Администраторска могућност за блокирање распона ИП адреса је онемогућена.",
        "ipb_expiry_invalid": "Време истека је неисправно.",
+       "ipb_expiry_old": "Време истека је у прошлости.",
        "ipb_expiry_temp": "Сакривене блокаде корисника морају бити трајне.",
        "ipb_hide_invalid": "Не могу да потиснем овај налог; има више од {{PLURAL:$1|једне измене|$1 измена}}.",
        "ipb_already_blocked": "„$1“ је већ блокиран.",
        "ipb_blocked_as_range": "Грешка: IP адреса $1 није директно блокирана и не може да се деблокира.\nОна је блокирана као део блокаде $2, која може бити деблокирана.",
        "ip_range_invalid": "Неисправан распон IP адреса.",
        "ip_range_toolarge": "Опсежна блокирања већа од /$1 нису дозвољена.",
+       "ip_range_toolow": "IP-опсези нису дозвољени.",
        "proxyblocker": "Блокер посредника",
        "proxyblockreason": "Ваша ИП адреса је блокирана јер представља отворени посредник.\nОбратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.",
        "sorbs": "DNSBL",
        "cant-move-user-page": "Немате дозволу за премештање основних корисничких страница (осим подстраница).",
        "cant-move-to-user-page": "Немате дозволу за премештање странице на вашу корисничку страницу (осим на корисничку подстраницу).",
        "cant-move-category-page": "Немате дозволу да премештате странице категорија.",
+       "cant-move-to-category-page": "Немате дозволу да преместите страницу на страницу категорије.",
+       "cant-move-subpages": "Немате дозволу да премештате подстранице.",
+       "namespace-nosubpages": "Имениски простор „$1“ не дозвољава подстранице.",
        "newtitle": "Нови наслов:",
        "move-watch": "Надгледај ову страницу",
        "movepagebtn": "Премести страницу",
        "export-download": "Сачувај као датотеку",
        "export-templates": "Укључи шаблоне",
        "export-pagelinks": "Укључи повезане странице до дубине од:",
+       "export-manual": "Ручно додај странице:",
        "allmessages": "Системске поруке",
        "allmessagesname": "Назив",
        "allmessagesdefault": "Подразумевани текст",
        "import-mapping-namespace": "Увези у именски простор:",
        "import-mapping-subpage": "Увези као подстранице следеће странице:",
        "import-upload-filename": "Назив датотеке:",
+       "import-upload-username-prefix": "Међувики префикс:",
        "import-comment": "Коментар:",
        "importtext": "Извезите датотеку с изворног викија користећи [[Special:Export|извоз]].\nСачувајте је на рачунар и пошаљите овде.",
        "importstart": "Увозим странице…",
        "imported-log-entries": "{{PLURAL:$1|Увезена је $1 ставка извештаја|Увезене су $1 ставке извештаја|Увезено је $1 ставки извештаја}}.",
        "importfailed": "Неуспешан увоз: <nowiki>$1</nowiki>",
        "importunknownsource": "Непозната врста за увоз",
+       "importnoprefix": "Није наведен међувики префикс",
        "importcantopen": "Не могу да отворим датотеку за увоз",
        "importbadinterwiki": "Неисправна међувики веза",
        "importsuccess": "Увожење је завршено!",
        "importuploaderrortemp": "Не могу да пошаљем датотеку за увоз.\nНедостаје привремена фасцикла.",
        "import-parse-failure": "Погрешно рашчлањивање XML-а.",
        "import-noarticle": "Нема странице за увоз!",
-       "import-nonewrevisions": "Ð\98змене Ð½Ð¸Ñ\81Ñ\83 Ñ\83везене (Ñ\81ве Ñ\81Ñ\83 Ð²ÐµÑ\9b Ð±Ð¸Ð»Ðµ Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\81Ñ\83Ñ\82не Ð¸Ð»Ð¸ Ð¿Ñ\80еÑ\81коÑ\87ене Ð·Ð±Ð¾Ð³ Ð³Ñ\80еÑ\88ки).",
+       "import-nonewrevisions": "Ð\98змене Ð½Ð¸Ñ\81Ñ\83 Ñ\83везене (Ñ\81ве Ñ\81Ñ\83 Ð²ÐµÑ\9b Ð±Ð¸Ð»Ðµ Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\81Ñ\83Ñ\82не Ð¸Ð»Ð¸ Ð¿Ñ\80еÑ\81коÑ\87ене Ð·Ð±Ð¾Ð³ Ð³Ñ\80еÑ\88ака).",
        "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
        "import-upload": "Отпремање XML података",
        "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени. '''Молимо Вас проверите да ли сте још увек пријављени и покушајте поново'''.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли Ваш веб-пртраживач дозвољава колачиће са овог сајта.",
        "import-error-special": "Не могу да увезем страницу „$1“ јер она припада посебном именском простору које не прихвата странице.",
        "import-error-invalid": "Не могу да увезем страницу „$1“ јер је њен назив неисправан.",
        "import-error-unserialize": "Верзија $2 странице $1 не може бити прочитана/увезена. Записано је да верзија користи $3 тип садржаја у $4 формату.",
-       "import-options-wrong": "{{PLURAL:$2|Ð\9fогÑ\80еÑ\88на Ð¾Ð¿Ñ\86иÑ\98а|Ð\9fогÑ\80еÑ\88не Ð¾Ð¿Ñ\86иÑ\98е}}: <nowiki>$1</nowiki>",
+       "import-options-wrong": "{{PLURAL:$2|Ð\9fогÑ\80еÑ\88но Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aе|Ð\9fогÑ\80еÑ\88на Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aа}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Наведена основна страница има неисправан наслов.",
        "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.",
        "importlogpage": "Дневник увоза",
        "tooltip-ca-move": "Премести ову страницу",
        "tooltip-ca-watch": "Додај ову страницу на списак надгледања",
        "tooltip-ca-unwatch": "Уклони ову страницу са списка надгледања",
-       "tooltip-search": "Ð\9fÑ\80еÑ\82Ñ\80ага",
+       "tooltip-search": "Ð\9fÑ\80еÑ\82Ñ\80ажи",
        "tooltip-search-go": "Идите на страницу с овим именом, ако постоји",
        "tooltip-search-fulltext": "Претражите странице с овим текстом",
-       "tooltip-p-logo": "Посетите главну страну",
-       "tooltip-n-mainpage": "Посетите главну страну",
-       "tooltip-n-mainpage-description": "Посетите главну страну",
+       "tooltip-p-logo": "Посети главну страницу",
+       "tooltip-n-mainpage": "Посети главну страницу",
+       "tooltip-n-mainpage-description": "Посети главну страницу",
        "tooltip-n-portal": "О пројекту, шта можете да радите и где да пронађете ствари",
-       "tooltip-n-currentevents": "Сазнајте више о текућим догађајима",
+       "tooltip-n-currentevents": "Сазнај више о тренутним догађајима",
        "tooltip-n-recentchanges": "Списак скорашњих измена на викију",
-       "tooltip-n-randompage": "Учитајте случајну страницу",
-       "tooltip-n-help": "Ð\9cеÑ\81Ñ\82о Ð³Ð´Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\81е Ð¸Ð½Ñ\84оÑ\80миÑ\88еÑ\82е",
+       "tooltip-n-randompage": "Учитај случајну страницу",
+       "tooltip-n-help": "Ð\9cеÑ\81Ñ\82о Ð³Ð´Ðµ Ð¼Ð¾Ð¶ÐµÑ\88 Ð´Ð° Ñ\81е Ð¸Ð½Ñ\84оÑ\80миÑ\88еÑ\88",
        "tooltip-t-whatlinkshere": "Списак свих страница које воде овде",
        "tooltip-t-recentchangeslinked": "Скорашње измене на страницама које су повезане с овом страницом",
        "tooltip-feed-rss": "RSS довод ове странице",
        "pageinfo-length": "Дужина странице (у бајтовима)",
        "pageinfo-article-id": "ID странице",
        "pageinfo-language": "Језик садржаја странице",
+       "pageinfo-language-change": "промени",
        "pageinfo-content-model": "Модел садржаја странице",
        "pageinfo-content-model-change": "промени",
        "pageinfo-robot-policy": "Индексирање од стране робота",
        "pageinfo-category-pages": "Број страница",
        "pageinfo-category-subcats": "Број поткатегорија",
        "pageinfo-category-files": "Број датотека",
+       "pageinfo-user-id": "ID корисника",
+       "pageinfo-file-hash": "Hash вредност",
        "markaspatrolleddiff": "Означи као патролирано",
        "markaspatrolledtext": "Означи страницу као патролирану",
        "markaspatrolledtext-file": "Означи ову верзију датотеке као патролирану",
        "newimages-hidepatrolled": "Сакриј патролирана отпремања",
        "newimages-mediatype": "Врста датотеке:",
        "noimages": "Нема ништа.",
+       "gallery-slideshow-toggle": "минијатуре",
        "ilsubmit": "Претражи",
        "bydate": "по датуму",
        "sp-newimages-showfrom": "прикажи нове датотеке почевши од $1, $2",
        "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Заштићено ауторским правом",
        "exif-copyrighted-false": "Није дефинисан",
+       "exif-photometricinterpretation-1": "Црно-бело (црна је 0)",
        "exif-photometricinterpretation-2": "RGB",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-unknowndate": "Непознат датум",
        "confirm-unwatch-button": "У реду",
        "confirm-unwatch-top": "Уклонити ову страницу са списка надгледања?",
        "confirm-rollback-button": "У реду",
+       "confirm-rollback-top": "Врати измене на овој страници?",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "hebrew-calendar-m12-gen": "Елул",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])",
        "timezone-utc": "UTC",
+       "timezone-local": "Локално",
        "duplicate-defaultsort": "<strong>Упозорење:</strong> Подразумевани кључ сврставања „$2“ мења ранији подразумевани кључ сврставања „$1“.",
        "duplicate-displaytitle": "<strong>Упозорење:</strong> наслов за приказ „$2“ замениће постојећи „$1“.",
        "restricted-displaytitle": "<strong>Упозорење:</strong> Наслов за приказ „$1” је игнорисан пошто није еквивалентан стварном наслову странице.",
        "version-ext-colheader-credits": "Аутори",
        "version-license-title": "Лиценца за $1",
        "version-license-not-found": "За ову екстензију није нађена информација о лиценци.",
+       "version-credits-title": "Заслуге за $1",
        "version-poweredby-credits": "Овај вики покреће '''[https://www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
        "version-poweredby-others": "остали",
        "version-poweredby-translators": "translatewiki.net преводиоци",
        "redirect-page": "ID странице",
        "redirect-revision": "Измена странице",
        "redirect-file": "Назив датотеке",
+       "redirect-logid": "ID дневника",
        "redirect-not-exists": "Вредност није пронађена",
        "fileduplicatesearch": "Претрага дупликата",
        "fileduplicatesearch-summary": "Претрага дуплираних датотека према хеш вредности.",
        "tag-mw-new-redirect-description": "Измене којима је направљено ново преусмерење или је страница измењена да буде преусмерење",
        "tag-mw-removed-redirect": "Уклоњено преусмјерење",
        "tag-mw-removed-redirect-description": "Измене које мењају постојеће преусмерење у страницу без преусмерења",
-       "tag-mw-changed-redirect-target": "Ð\9fÑ\80омеÑ\9aена Ð¾Ð´Ñ\80едиÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а преусмерења",
+       "tag-mw-changed-redirect-target": "Ð\9fÑ\80омеÑ\9aено Ð¾Ð´Ñ\80едиÑ\88Ñ\82е преусмерења",
        "tag-mw-changed-redirect-target-description": "Измене које мењају одредиште преусмерења",
        "tag-mw-blank": "Страница испражњена",
        "tag-mw-blank-description": "Измене које бришу читав садржај странице",
        "tag-mw-replace-description": "Измене који уклањају више од 90% садржаја странице",
        "tag-mw-rollback": "Враћање",
        "tag-mw-rollback-description": "Измене које враћају страницу на претходне измене",
-       "tag-mw-undo": "Поништена претходна измена",
+       "tag-mw-undo": "Поништена ранија измена",
        "tag-mw-undo-description": "Измене које поништавају претходне измене",
        "tags-title": "Ознаке",
        "tags-intro": "На овој страници је наведен списак ознака с којима програм може да означи измене и његово значење.",
        "tags-edit-title": "Уреди ознаке",
        "tags-edit-manage-link": "Управљај ознакама",
        "tags-edit-existing-tags": "Постојеће ознаке:",
+       "tags-edit-existing-tags-none": "<em>Нема</em>",
        "tags-edit-new-tags": "Нове ознаке:",
+       "tags-edit-add": "Додај ове ознаке:",
+       "tags-edit-remove": "Уклони ове ознаке:",
+       "tags-edit-remove-all-tags": "(уклони све ознаке)",
+       "tags-edit-chosen-placeholder": "Изабери неке ознаке",
+       "tags-edit-chosen-no-results": "Одговарајуће ознаке нису пронађене",
        "tags-edit-reason": "Разлог:",
        "tags-edit-success": "Измене су примењене.",
        "comparepages": "Упоређивање страница",
        "compare-title-not-exists": "Наведени наслов не постоји.",
        "compare-revision-not-exists": "Наведена измена не постоји.",
        "diff-form": "Разлике",
+       "diff-form-oldid": "ID старе измене (необавезно)",
        "diff-form-submit": "Прикажи разлике",
        "permanentlink": "Стална веза",
        "permanentlink-revid": "ID измене",
        "feedback-termsofuse": "Прихватам да пошаљем повратне информације у складу са условима коришћења.",
        "feedback-thanks": "Хвала! Ваша повратна информација је постављена на страницу „[$2 $1]“.",
        "feedback-thanks-title": "Хвала вам!",
-       "searchsuggest-search": "Претрага",
+       "feedback-useragent": "Кориснички агент:",
+       "searchsuggest-search": "Претражи",
        "searchsuggest-containing": "садржи...",
        "api-error-badtoken": "Унутрашња грешка: неисправан жетон.",
        "api-error-emptypage": "Стварање нових празних страница није дозвољено.",
        "expand_templates_generate_xml": "Прикажи XML стабло",
        "expand_templates_generate_rawhtml": "Прикажи сиров HTML",
        "expand_templates_preview": "Претпреглед",
+       "pagelanguage": "Промени језик странице",
        "pagelang-name": "Страница",
        "pagelang-language": "Језик",
+       "pagelang-use-default": "Користи подразумевани језик",
        "pagelang-select-lang": "Изабери језик",
        "pagelang-reason": "Разлог",
        "pagelang-submit": "Пошаљи",
        "pagelang-nonexistent-page": "Страница $1 не постоји.",
+       "pagelang-unchanged-language": "Страница $1  је већ постављена на језик $2.",
+       "pagelang-db-failed": "База података није успела променити језик странице.",
        "right-pagelang": "мењање језика странице",
        "action-pagelang": "промену језика странице",
+       "log-name-pagelang": "Дневник промене језика",
        "logentry-pagelang-pagelang": "$1 је {{GENDER:$2|променио|променила}} језик странице $3 из $4 у $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (омогућена)",
        "mediastatistics": "Статистика датотека",
        "mediastatistics-summary": "Статистике о типовима послатих датотека. Овде су урачунате само најновије верзије датотека. Старе или обрисане верзије нису урачунате.",
        "mediastatistics-table-mimetype": "MIME тип",
        "special-characters-group-lao": "Лаоски",
        "special-characters-group-khmer": "Кмерски",
        "special-characters-group-canadianaboriginal": "Канадски абориџински",
+       "special-characters-title-endash": "цртица",
+       "special-characters-title-emdash": "дуга цртица",
+       "special-characters-title-minus": "минус",
        "mw-widgets-dateinput-no-date": "Датум није изабран",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
+       "mw-widgets-mediasearch-input-placeholder": "Претражи датотеке",
        "mw-widgets-mediasearch-noresults": "Нема резултата.",
        "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
        "mw-widgets-titleinput-description-redirect": "преусмерава на $1",
        "mw-widgets-usersmultiselect-placeholder": "Додај још...",
        "date-range-from": "Од датума:",
        "date-range-to": "До датума:",
+       "sessionprovider-generic": "$1 сесије",
        "randomrootpage": "Случајна коренска страница",
        "log-action-filter-block": "Тип блокирања:",
        "log-action-filter-contentmodel": "Тип промене модела садржаја:",
        "log-action-filter-patrol": "Тип патролирања:",
        "log-action-filter-protect": "Тип закључавања:",
        "log-action-filter-rights": "Тип промене корисничких права:",
+       "log-action-filter-suppress": "Врста скривања:",
        "log-action-filter-upload": "Тип отпремања:",
        "log-action-filter-all": "Све",
        "log-action-filter-block-block": "блокирање",
        "log-action-filter-block-reblock": "измена блокирања",
        "log-action-filter-block-unblock": "деблокирање",
+       "log-action-filter-contentmodel-change": "Измена модела садржаја",
+       "log-action-filter-contentmodel-new": "Нова страница с нестандардним моделом садржаја",
        "log-action-filter-delete-delete": "брисање странице",
        "log-action-filter-delete-delete_redir": "преснимавање преусмерења",
        "log-action-filter-delete-restore": "враћање странице",
        "log-action-filter-delete-event": "брисање уноса у дневницима",
        "log-action-filter-delete-revision": "брисање измене",
+       "log-action-filter-import-interwiki": "Међувики увоз",
        "log-action-filter-managetags-create": "нова ознака",
        "log-action-filter-managetags-delete": "брисање ознаке",
        "log-action-filter-managetags-activate": "активирање ознаке",
        "log-action-filter-protect-move_prot": "премештање заштите",
        "log-action-filter-rights-rights": "ручно",
        "log-action-filter-rights-autopromote": "аутоматски",
+       "log-action-filter-suppress-event": "Скривање уноса у дневнику",
+       "log-action-filter-suppress-revision": "Скривање измене",
+       "log-action-filter-suppress-delete": "Скривање странице",
+       "log-action-filter-suppress-block": "Скривање корисника блокирањем",
+       "log-action-filter-suppress-reblock": "Скривање корисника поновним блокирањем",
        "log-action-filter-upload-upload": "ново отпремање",
        "log-action-filter-upload-overwrite": "промена постојећег",
+       "authmanager-authn-no-primary": "Пружени акредитиви не могу се проверити.",
+       "authmanager-create-disabled": "Онемогућено прављење налога.",
+       "authmanager-create-from-login": "Попуните поља да бисте направили налог.",
        "authmanager-authplugin-setpass-failed-title": "Неуспешна промена лозинке",
+       "authmanager-authplugin-setpass-bad-domain": "Неисправан домен.",
+       "authmanager-autocreate-noperm": "Аутоматско прављење налога није дозвољено.",
+       "authmanager-userdoesnotexist": "Кориснички налог „$1“ није отворен.",
        "authmanager-email-label": "Имејл",
        "authmanager-email-help": "Имејл адреса",
        "authmanager-realname-label": "Право име",
        "authmanager-realname-help": "Право име корисника",
+       "authmanager-provider-temporarypassword": "Привремена лозинка",
+       "authprovider-confirmlink-option": "$1 ($2)",
+       "authprovider-confirmlink-request-label": "Рачуни који се требају повезати",
+       "authprovider-confirmlink-success-line": "$1: Успешно повезано.",
        "authprovider-resetpass-skip-label": "Прескочи",
+       "authform-newtoken": "Недостаје жетон. $1",
+       "authform-notoken": "Недостаје жетон",
+       "authform-wrongtoken": "Погрешан жетон",
+       "specialpage-securitylevel-not-allowed-title": "Није дозвољено",
+       "authpage-cannot-login": "Не могу започети пријаву.",
+       "authpage-cannot-create": "Не могу започети стварање налога.",
+       "authpage-cannot-link": "Не могу започети спајање налога.",
        "cannotauth-not-allowed-title": "Приступ је одбијен",
+       "cannotauth-not-allowed": "Није Вам дозвољено да користите ову страницу",
        "changecredentials": "Промјена акредитива",
        "changecredentials-submit": "Промени",
        "removecredentials": "Уклањање акредитива",
        "credentialsform-provider": "Врста акредитива:",
        "credentialsform-account": "Назив налога:",
+       "cannotlink-no-provider-title": "Нема налога за повезивање",
+       "cannotlink-no-provider": "Нема налога за повезивање.",
+       "linkaccounts": "Повежи налоге",
+       "linkaccounts-success-text": "Налог је повезан.",
        "linkaccounts-submit": "Повежи налоге",
+       "unlinkaccounts": "Обједини налоге",
+       "unlinkaccounts-success": "Налог је обједињен.",
        "userjsispublic": "Напомена: JavaScript подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
        "usercssispublic": "Напомена: CSS подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
        "edit-error-short": "Грешка: $1",
        "edit-error-long": "Грешке:\n\n$1",
        "revid": "измена $1",
+       "pageid": "ID странице: $1",
        "rawhtml-notallowed": "&lt;html&gt; тагови не могу да се користе ван нормалних страница.",
        "gotointerwiki": "Напуштам пројекат {{SITENAME}}",
        "gotointerwiki-invalid": "Одабрани наслов је неисправан.",
index de9ce07..fca6d7c 100644 (file)
        "newwindow": "(otvara se u novom prozoru)",
        "cancel": "Otkaži",
        "moredotdotdot": "Više…",
-       "morenotlisted": "Ova lista je možda nepotpuna",
+       "morenotlisted": "Ovaj spisak možda nije potpun.",
        "mypage": "Stranica",
        "mytalk": "Razgovor",
        "anontalk": "Razgovor",
        "tagline": "Izvor: {{SITENAME}}",
        "help": "Pomoć",
        "search": "Pretraga",
-       "search-ignored-headings": "#<!-- ovu liniju ostavite kakva jeste --> <pre>\n# Naslovi koji će biti ignorisani upitom\n# Promene su vidljive odmah nakon što stranica sa naslovom bude popisana\n# Možete iznuditi ponovno popisivanje sa \"null\" promenom\n# Sintaksa je sledeća:\n# * Svaka vrsta koja započinje \"#\" znakom pa sve do kraja je komentar\n# * Svaka ne prazna vrsta je tačan naslov za zanemariti, u tačnom obliku\nReference\nSpoljašnje veze\nPogledajte\n#</pre> <!-- ovu liniju ostavite kakva jeste -->",
+       "search-ignored-headings": "#<!-- ovu liniju ostavite onakvu kakva jeste --> <pre>\n# Naslovi koji će biti ignorisani upitom\n# Promene su vidljive odmah nakon što stranica sa naslovom bude popisana\n# Možete iznuditi ponovno popisivanje sa \"null\" promenom\n# Sintaksa je sledeća:\n# * Svaka vrsta koja započinje \"#\" znakom pa sve do kraja je komentar\n# * Svaka ne prazna vrsta je tačan naslov za zanemariti, u tačnom obliku\nReference\nSpoljašnje veze\nPogledajte\n#</pre> <!-- ovu liniju ostavite onakvu kakva jeste -->",
        "searchbutton": "Pretraži",
        "go": "Idi",
        "searcharticle": "Idi",
        "talk": "Razgovor",
        "views": "Pregledi",
        "toolbox": "Alatke",
-       "tool-link-userrights": "Promeni {{GENDER:$1|korisnik}} grupe",
+       "tool-link-userrights": "Uredi {{GENDER:$1|korisničke}} grupe",
        "tool-link-userrights-readonly": "Prikaži {{GENDER:$1|korisnik}} grupe",
        "tool-link-emailuser": "Pošalji imejl",
        "imagepage": "Pogledaj stranicu datoteke",
        "recentchanges-legend": "Opcije skorašnjih izmena",
        "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
        "recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.",
+       "recentchanges-notargetpage": "Unesite naziv stranice kako biste videli srodne izmene.",
        "recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.",
        "recentchanges-label-newpage": "Ovom izmenom napravljena je nova izmena",
        "recentchanges-label-minor": "Ovo je manja izmena",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik nadgleda|korisnika nadgledaju|korisnika nadgledaju}}]",
-       "rc_categories": "Ograniči na kategorije (razdvoji s uspravnom crtom):",
-       "rc_categories_any": "Sve",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
        "newsectionsummary": "/* $1 */ novi odeljak",
index 5eb4ab7..148cde9 100644 (file)
        "newpageletter": "Näi",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 beooboachtjende {{PLURAL:$1|Benutser|Benutsere}}]",
-       "rc_categories": "Bloot Sieden uut do Kategorien (tränd mäd „|“):",
-       "rc_categories_any": "Aal",
        "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
        "newsectionsummary": "Näie Apsats /* $1 */",
        "rc-enhanced-expand": "Details anwiese (bruukt JavaScript)",
index ca646b2..fa6ae89 100644 (file)
        "newpageletter": "A",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ngawaskeun|ngawaskeun}}]",
-       "rc_categories": "Watesan nepi ka kategori (dipisah ku \"|\"):",
-       "rc_categories_any": "Unggal nu kapilih",
        "rc-change-size-new": "$1 {{PLURAL:$1|bit|bit}} sanggeus robah",
        "newsectionsummary": "/* $1 */ bagean anyar",
        "rc-enhanced-expand": "Témbongkeun rincian",
index bd5e3ff..3ab3adb 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 bevakande {{PLURAL:$1|användare|användare}}]",
-       "rc_categories": "Begränsa till följande kategorier (separera med \"|\"):",
-       "rc_categories_any": "Någon av de valda",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte}} efter ändring",
        "newsectionsummary": "/* $1 */ nytt avsnitt",
        "rc-enhanced-expand": "Visa detaljer",
        "rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste sidversion av $2. [$3 Visa ändringar]",
        "sessionfailure-title": "Sessionsfel",
-       "sessionfailure": "Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.",
+       "sessionfailure": "Någonting med din inloggningssession är på tok;\ndin begärda åtgärd har avbrutits för att förhindra att någon kapar din session.\nSkicka formuläret igen.",
        "changecontentmodel": "Ändra innehållsmodell för en sida",
        "changecontentmodel-legend": "Ändra innehållsmodell",
        "changecontentmodel-title-label": "Sidtitel",
        "watchlistedit-clear-titles": "Sidor:",
        "watchlistedit-clear-submit": "Rensa bevakningslistan (Detta är permanent!)",
        "watchlistedit-clear-done": "Din bevakningslista har rensats.",
+       "watchlistedit-clear-jobqueue": "Din bevakningslista skapas. Detta kan ta en stund!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 sida|$1 sidor}} togs bort:",
        "watchlistedit-too-many": "Det finns för många sidor att visa här.",
        "watchlisttools-clear": "Rensa bevakningslistan",
index 7a2bbba..219a4f6 100644 (file)
        "newpageletter": "P",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[idadi ya {{PLURAL:$1|watumiaji}} wanaoufuatilia ni $1]",
-       "rc_categories": "Chagua jamii zingine (uzitenge na kigawaji hiki \"|\")",
-       "rc_categories_any": "Yoyote",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} baada ya mabadiliko",
        "newsectionsummary": "/* $1 */ mjadala mpya",
        "rc-enhanced-expand": "Onyesha maelezo",
index f61cb96..0ba4ef5 100644 (file)
        "nosuchuser": "Ńy ma sam użytkowńika uo mjańe \"$1\".\nSprowdź szrajbůng, abo [[Special:CreateAccount|utwůrz nowe kůnto]].",
        "nosuchusershort": "Ńy mo sam użytkowńika uo mjańe \"$1\".",
        "nouserspecified": "Podej mjano użytkowńika.",
-       "login-userblocked": "Tyn sprowjorz ma zawrzite sprowjyńa. Ńy możno sie zalogować.",
+       "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.",
        "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.",
        "loginlanguagelabel": "Godka: $1",
        "suspicious-userlogout": "Polecyńe wylogowańo uostoło uodćepńynte skiż tygo co wyglůnda, aże uostoło posłane bez uszkodzůna przeglůndarka abo buforujůncy serwer proxy.",
        "createacct-another-realname-tip": "Wszkryflańy twojigo mjana a nazwiska ńy je końyczne.\nKej bydźesz chćoł je podoć, bydům użyte, coby dokůmyntowoć Twoje autorstwo.",
-       "pt-login": "Zaloguj sie",
-       "pt-login-button": "Zalogůj sie",
+       "pt-login": "Zaloguj śe",
+       "pt-login-button": "Zaloguj śe",
        "pt-createaccount": "Twōrz nowe konto",
        "pt-userlogout": "Uodloguj śe",
        "php-mail-error-unknown": "Ńyznany feler we funkcyji mail()",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|dowajůncy pozůr užytkowńik|dowajůncych pozůr užytkowńikůw}}]",
-       "rc_categories": "Uůgrańič do katygorii (oddźelej za půmocům \"|\")",
-       "rc_categories_any": "Wšyskie",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtůw}} po půmjyńyńu",
        "newsectionsummary": "/* $1 */ nowo tajla",
        "rc-enhanced-expand": "Pokoż szczygůły",
        "removedwatchtext": "Artikel \"[[:$1]]\" zostou wyćepńjynty s [[Special:Watchlist|Twojij pozorlisty]].",
        "watch": "Dej pozůr",
        "watchthispage": "Dej pozůr",
-       "unwatch": "Njy dowej pozoru",
+       "unwatch": "Ńy dowej pozoru",
        "unwatchthispage": "Přestoń dować pozůr",
        "notanarticle": "To ńy je artikel",
        "notvisiblerev": "Wersyja zostoua wyćepano",
        "wlshowlast": "Pokož uostatńy $1 godźin $2 dńi ()",
        "watchlist-options": "Uopcyje artikli na kere dowosz pozůr",
        "watching": "Dowom pozor...",
-       "unwatching": "Njy dowom pozoru...",
+       "unwatching": "Ńy dowům pozůr.",
        "enotif_reset": "Uoznoč wšyjstke zajty kej uodwjydzůne",
        "enotif_impersonal_salutation": "užytkowńik {{GRAMMAR:D.lp|{{SITENAME}}}}",
        "enotif_lastvisited": "Uobejřij na zajće $1 wšyjstke půmjyńańo uod Twojej uostatńij wizyty.",
        "historywarning": "Pozor! Ta zajta kerům chceš wyćepnůńć mo historjo:",
        "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 sie.",
+       "actionfailed": "Ńy udało śe.",
        "deletedtext": "Wyćepano \"$1\". Rejer uostatnio zrobiůnych wyćepań možeš uobejžyć tukej: $2.",
        "dellogpage": "Wyćepane",
        "dellogpagetext": "To je lista uostatńo wykůnanych wyćepań.",
        "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.",
        "allmessagesnotsupportedDB": "Ta zajta ńy može być užyta, bez tůž co zmjynna '''$wgUseDatabaseMessages''' je wůuůnčůno.",
        "thumbnail-more": "Zwjynksz",
-       "filemissing": "Njy mo pliku",
+       "filemissing": "Ńyma pliku.",
        "thumbnail_error": "Feler při gynerowańu mińatury: $1",
        "djvu_page_error": "Zajta DjVu poza zakresym",
        "djvu_no_xml": "Ńy idźe pobrać danych we formaće XML do plika DjVu",
        "tooltip-pt-mycontris": "Lista uody mje sprowjonych",
        "tooltip-pt-login": "Chćeli by my, cobyś śe nalogowoł, nale to ńy je powinne",
        "tooltip-pt-logout": "Uodloguj śe ze wiki",
-       "tooltip-pt-createaccount": "Namawjůmy do stworzyńo kůnta a zalogůwańo śa, atoli niy je to uobowjůnzkowe",
+       "tooltip-pt-createaccount": "Namowjůmy do stworzyńo kůnta a zalogůwańo śe, atoli ńy je to uobowjůnzkowe",
        "tooltip-ca-talk": "Dyskusyjo uo tym artiklu",
        "tooltip-ca-edit": "Edytuj tã zajtã",
        "tooltip-ca-addsection": "Przidej nowy temat",
index 638d3eb..979c3f2 100644 (file)
        "newpageletter": "பு",
        "boteditletter": "தா",
        "number_of_watching_users_pageview": "[இப்பக்க்த்தை {{PLURAL:$1|ஒரு பயனர் பார்கிறார்|$1 பயனர்கள் பார்கிறார்கள்}}]",
-       "rc_categories": "பகுப்புகளுக்கு மட்டுப்படுத்து (\"|\" குறியீட்டால் பிரிக்கப்பட்டுள்ளது)",
-       "rc_categories_any": "தெரிவு செய்ததில் ஏதாவது",
        "rc-change-size-new": "$1 {{PLURAL:$1|பைட்டு|பைட்டுகள்}} -மாற்றத்திற்குப் பிறகு",
        "newsectionsummary": "/* $1 */ புதிய பகுதி",
        "rc-enhanced-expand": "விவரத்தை காட்டு",
index 14e67db..ca2bec2 100644 (file)
        "minoreditletter": "cipuq",
        "newpageletter": "Giqas",
        "boteditletter": "squliq na kikay",
-       "rc_categories_any": "Ana nanu’ binzyagan na",
        "rc-change-size-new": "sin-nbah$1 {{PLURAL:bzyaqan kkayal na llpgan}}",
        "rc-old-title": "pins’ruxsa minqsu’ na lalu’ ga \"$1\"",
        "recentchangeslinked": "M’ubuy quw zyuwaw na sinbahan",
        "recentchangeslinked-feed": "M’ubuy quw zyuwaw na sinbahan",
        "recentchangeslinked-toolbox": "M’ubuy quw zyuwaw na sinbahan",
        "recentchangeslinked-title": "Wal m’ubuy squw sinbahan na \"$1\"",
-       "recentchangeslinked-summary": "ani mkuw quw cyux niya’ spsbaq ssyansa zngayan tay sqaniy aniy p‘ubuy sa qsahuy kwara’ zzngayan (ini’ ga kwara’ nyux maki’ sqaniy kawayal niya’ s’nakun) ka wayal niya’ bkgun kwara’ qu zngayan ka wayal sbahun.\ncyux  maki’ sa qsahuy na [[Special:Watchlist|bnkuw su’ ka cyux su’ ktan]] ka zngayan ga musa’ niya’  <strong>biru’ qthuy</strong>buru’.",
+       "recentchangeslinked-summary": "ani mkuw quw cyux niya’ spsbaq ssyansa zngayan tay sqaniy aniy p‘ubuy sa qsahuy kwara’ zzngayan (ini’ ga kwara’ nyux maki’ sqaniy kawayal niya’ s’nakun) ka wayal niya’ bkgun kwara’ qu zngayan ka wayal sbahun.\ncyux  maki’ sa qsahuy na [[Special:Watchlist|bnkuw su’ ka cyux su’ ktan]] ka zngayan ga musa’ niya’ <strong>biru’ qthuy</strong>buru’.",
        "recentchangeslinked-page": "Lalu’ na zzngayan:",
        "recentchangeslinked-to": "Sbah squw m’ay’ubuy zngayan sqaniy ka sinbahan na pinkaykita’ niya’ squw m’ay’ubuy sa sngayan sqaniy",
        "upload": "Pawsa’ sa kktan zayzyuwaw na biru’",
index 8686631..9f1cba9 100644 (file)
        "minoreditletter": "ಕಿ",
        "newpageletter": "ಪೊ",
        "boteditletter": "ಬಾ",
-       "rc_categories_any": "ಒವ್ವೇ",
        "rc-change-size-new": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}ಬದಲಾವಣೆಡ್ದ್ ಬುಕ್ಕೊ",
        "newsectionsummary": "\n/* $1 */ಪೊಸ ವಿಭಾಗ",
        "rc-enhanced-expand": "ವಿವರೊಲೆನ್ ತೊಜಾವ್",
index 696bcfc..03054cd 100644 (file)
        "newpageletter": "కొ",
        "boteditletter": "బా",
        "number_of_watching_users_pageview": "[వీక్షిస్తున్న సభ్యులు: {{PLURAL:$1|ఒక్కరు|$1}}]",
-       "rc_categories": "ఈ వర్గాలకు పరిమితం చెయ్యి (\"|\" తో వేరు చెయ్యండి):",
-       "rc_categories_any": "ఎంచుకున్నది ఏదయినా",
        "rc-change-size-new": "మార్పు తర్వాత $1 {{PLURAL:$1|బైటు|బైట్లు}}",
        "newsectionsummary": "/* $1 */ కొత్త విభాగం",
        "rc-enhanced-expand": "వివరాలను చూపించు",
index 82a51cd..85d3bf0 100644 (file)
        "newpageletter": "Нав",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 пайгирикунанда {{PLURAL:$1|корбар|корбарон}}]",
-       "rc_categories": "Маҳдудият ба гурӯҳҳо (бо аломати \"|\" ҷудо кунед)",
-       "rc_categories_any": "Ҳар кадом",
        "rc-change-size-new": "$1 {{PLURAL:$1|байт}} пас аз тағйир",
        "newsectionsummary": "/* $1 */ бахши ҷадид",
        "rc-enhanced-expand": "Намоиши ҷузъиёт",
index effda3d..36e76c3 100644 (file)
        "newpageletter": "Nav",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 pajgirikunanda {{PLURAL:$1|korbar|korbaron}}]",
-       "rc_categories": "Mahdudijat ba gurūhho (bo alomati \"|\" çudo kuned)",
-       "rc_categories_any": "Har kadom",
        "newsectionsummary": "/* $1 */ baxşi çadid",
        "rc-enhanced-expand": "Namoişi çuz'ijot (nijozmand ba Çava Skript)",
        "rc-enhanced-hide": "Pinhoni çuz'ijot",
index b9bb62b..a938047 100644 (file)
@@ -37,7 +37,7 @@
        "tog-hidecategorization": "ซ่อนการจัดหมวดหมู่หน้า",
        "tog-extendwatchlist": "ขยายรายการเฝ้าดูให้แสดงการเปลี่ยนแปลงทั้งหมด ไม่เพียงการเปลี่ยนแปลงล่าสุด",
        "tog-usenewrc": "จัดกลุ่มการเปลี่ยนแปลงแบ่งตามหน้าในรายการปรับปรุงล่าสุดและรายการเฝ้าดู",
-       "tog-numberheadings": "à¸\81ำหà¸\99à¸\94à¹\80ลà¸\82หัวà¹\80รืà¹\88อà¸\87อัตโนมัติ",
+       "tog-numberheadings": "à¸\81ำหà¸\99à¸\94à¹\80ลà¸\82à¸\9eาà¸\94หัวอัตโนมัติ",
        "tog-showtoolbar": "แสดงแถบเครื่องมือแก้ไข",
        "tog-editondblclick": "แก้ไขหน้าเมื่อคลิกสองครั้ง",
        "tog-editsectiononrightclick": "เปิดใช้งานการแก้ไขส่วนโดยคลิกขวาที่ชื่อเรื่องของส่วนนั้น",
@@ -46,7 +46,7 @@
        "tog-watchmoves": "เพิ่มและไฟล์ที่ฉันย้ายเข้ารายการเฝ้าดู",
        "tog-watchdeletion": "เพิ่มหน้าและไฟล์ที่ฉันลบเข้ารายการเฝ้าดู",
        "tog-watchuploads": "เพิ่มไฟล์ใหม่ที่ฉันอัพโหลดไปยังรายการเฝ้าดูของฉัน",
-       "tog-watchrollback": "à¹\80à¸\9eิà¹\88มหà¸\99à¹\89าà¸\97ีà¹\88à¸\89ัà¸\99ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99เข้ารายการเฝ้าดู",
+       "tog-watchrollback": "à¹\80à¸\9eิà¹\88มหà¸\99à¹\89าà¸\97ีà¹\88à¸\89ัà¸\99ยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียวเข้ารายการเฝ้าดู",
        "tog-minordefault": "กำหนดการแก้ไขทุกครั้งเป็นการแก้ไขเล็กน้อยโดยปริยาย",
        "tog-previewontop": "แสดงตัวอย่างก่อนกล่องแก้ไข",
        "tog-previewonfirst": "แสดงตัวอย่างในการแก้ไขครั้งแรก",
@@ -58,7 +58,7 @@
        "tog-oldsig": "ลายเซ็นที่คุณมีอยู่:",
        "tog-fancysig": "ถือลายเซ็นเป็นข้อความวิกิ (โดยไม่มีลิงก์อัตโนมัติ)",
        "tog-uselivepreview": "แสดงตัวอย่างโดยไม่โหลดหน้าใหม่",
-       "tog-forceeditsummary": "à¹\80à¸\95ือà¸\99à¹\80มืà¹\88อà¸\8aà¹\88อà¸\87à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อว่าง",
+       "tog-forceeditsummary": "à¹\80à¸\95ือà¸\99à¹\80มืà¹\88อà¸\8aà¹\88อà¸\87à¸\84วามยà¹\88อà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ว่าง",
        "tog-watchlisthideown": "ซ่อนการแก้ไขของฉันจากรายการเฝ้าดู",
        "tog-watchlisthidebots": "ซ่อนการแก้ไขของบอตจากรายการเฝ้าดู",
        "tog-watchlisthideminor": "ซ่อนการแก้ไขเล็กน้อยจากรายการเฝ้าดู",
@@ -71,7 +71,7 @@
        "tog-ccmeonemails": "ส่งสำเนาอีเมลที่ฉันส่งหาผู้อื่นให้ฉัน",
        "tog-diffonly": "ไม่แสดงเนื้อหาหน้าใต้ความแตกต่างระหว่างรุ่น",
        "tog-showhiddencats": "แสดงหมวดหมู่ที่ซ่อนอยู่",
-       "tog-norollbackdiff": "à¹\84มà¹\88à¹\81สà¸\94à¸\87à¸\9cลà¸\95à¹\88าà¸\87หลัà¸\87à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99",
+       "tog-norollbackdiff": "à¹\84มà¹\88à¹\81สà¸\94à¸\87à¸\9cลà¸\95à¹\88าà¸\87หลัà¸\87à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียว",
        "tog-useeditwarning": "เตือนฉันเมื่อออกจากหน้าแก้ไขโดยมีการเปลี่ยนแปลงที่ยังไม่บันทึก",
        "tog-prefershttps": "ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อเข้าสู่ระบบแล้ว",
        "underline-always": "ทุกครั้ง",
        "october-date": "$1 ตุลาคม",
        "november-date": "$1 พฤศจิกายน",
        "december-date": "$1 ธันวาคม",
-       "period-am": "ก่อนเที่ยง",
-       "period-pm": "หลังเที่ยง",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|หมวดหมู่|หมวดหมู่}}",
        "category_header": "หน้าในหมวดหมู่ \"$1\"",
        "subcategories": "หมวดหมู่ย่อย",
        "errorpagetitle": "มีข้อผิดพลาด",
        "returnto": "กลับไป $1",
        "tagline": "จาก {{SITENAME}}",
-       "help": "วิà¸\98ีà¹\83à¸\8aà¹\89",
+       "help": "à¸\84ำอà¸\98ิà¸\9aาย",
        "search": "ค้นหา",
        "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# อธิบายหัวข้อที่จะละเว้นในการค้นหา\n# การเปลี่ยนแปลงนี้จะมีผลเมื่อหน้าหัวเรื่องถูกจัดทำดัชนี\n# บังคับให้จัดทำดัชนีหน้าใหม่ด้วยการแก้ไขที่ว่างเปล่า\n# ไวยากรณ์เป็นดังนี้:\n#   * ทุกๆ บรรทัดที่ขึ้นต้นด้วย \"#\" จะเป็นคำอธิบายจนถึงจุดสิ้นสุดของบรรทัด\n#   * บรรทัดที่ไม่ใช่บรรทัดว่างจะเป็นบรรทัดแรกที่คุณต้องการละเลย รวมทั้งการใช้อักษรตัวพิมพ์ใหญ่และทุกๆ อย่างด้วย\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "ค้นหา",
        "protect_change": "เปลี่ยน",
        "unprotect": "เปลี่ยนการล็อก",
        "newpage": "หน้าใหม่",
-       "talkpagelinktext": "à¸\9eูà¸\94à¸\84ุย",
+       "talkpagelinktext": "คุย",
        "specialpage": "หน้าพิเศษ",
        "personaltools": "เครื่องมือส่วนตัว",
-       "talk": "อภิà¸\9bราย",
+       "talk": "à¸\84ุย",
        "views": "ดู",
        "toolbox": "เครื่องมือ",
        "tool-link-userrights": "เปลี่ยนกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "tool-link-userrights-readonly": "ดูกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "tool-link-emailuser": "ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้",
        "imagepage": "ดูหน้าไฟล์",
-       "mediawikipage": "à¸\94ูหà¸\99à¹\89าà¸\82à¹\89อà¸\84วาม",
+       "mediawikipage": "à¸\94ูหà¸\99à¹\89าสาร",
        "templatepage": "ดูหน้าแม่แบบ",
-       "viewhelppage": "à¸\94ูหà¸\99à¹\89าวิà¸\98ีà¹\83à¸\8aà¹\89",
+       "viewhelppage": "à¸\94ูหà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aาย",
        "categorypage": "ดูหน้าหมวดหมู่",
-       "viewtalkpage": "à¸\94ูà¸\81ารà¸\9eูà¸\94à¸\84ุย",
+       "viewtalkpage": "à¸\94ูà¸\81ารอภิà¸\9bราย",
        "otherlanguages": "ในภาษาอื่น",
        "redirectedfrom": "(เปลี่ยนทางจาก $1)",
        "redirectpagesub": "หน้าเปลี่ยนทาง",
        "youhavenewmessages": "คุณมี$1 ($2)",
        "youhavenewmessagesfromusers": "คุณมี $1จาก{{PLURAL:$3|ผู้ใช้คนอื่น|ผู้ใช้ $3 คน}} ($2)",
        "youhavenewmessagesmanyusers": "คุณมี $1จากผู้ใช้หลายคน ($2)",
-       "newmessageslinkplural": "$1 à¸\82à¹\89อà¸\84วามใหม่",
+       "newmessageslinkplural": "$1 à¸ªà¸²à¸£ใหม่",
        "newmessagesdifflinkplural": "$1 การเปลี่ยนแปลงล่าสุด",
-       "youhavenewmessagesmulti": "à¸\84ุà¸\93มีà¸\82à¹\89อà¸\84วามใหม่ที่ $1",
+       "youhavenewmessagesmulti": "à¸\84ุà¸\93มีสารใหม่ที่ $1",
        "editsection": "แก้ไข",
        "editold": "แก้ไข",
        "viewsourceold": "ดูโค้ด",
        "nstab-special": "หน้าพิเศษ",
        "nstab-project": "หน้าโครงการ",
        "nstab-image": "ไฟล์",
-       "nstab-mediawiki": "à¸\82à¹\89อà¸\84วาม",
+       "nstab-mediawiki": "สาร",
        "nstab-template": "แม่แบบ",
-       "nstab-help": "หà¸\99à¹\89าวิà¸\98ีà¹\83à¸\8aà¹\89",
+       "nstab-help": "หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aาย",
        "nstab-category": "หมวดหมู่",
        "mainpage-nstab": "หน้าหลัก",
        "nosuchaction": "ไม่มีปฏิบัติการดังกล่าว",
        "createacct-realname": "ชื่อจริง (เลือกไม่ใส่ได้)",
        "createacct-reason": "เหตุผล",
        "createacct-reason-ph": "เหตุใดคุณจึงสร้างอีกบัญชี",
-       "createacct-reason-help": "à¸\82à¹\89อà¸\84วามà¸\97ีà¹\88à¹\81สà¸\94à¸\87à¹\83à¸\99ลà¹\87อà¸\81การสร้างบัญชี",
+       "createacct-reason-help": "สารà¸\97ีà¹\88à¹\81สà¸\94à¸\87à¹\83à¸\99à¸\9bูมการสร้างบัญชี",
        "createacct-submit": "สร้างบัญชีของคุณ",
        "createacct-another-submit": "สร้างบัญชี",
        "createacct-continue-submit": "สร้างบัญชีต่อ",
        "botpasswords-editexisting": "แก้ไขรหัสผ่านบอตที่มีอยู่เดิม",
        "botpasswords-label-appid": "ชื่อบอต:",
        "botpasswords-label-create": "สร้าง",
-       "botpasswords-label-update": "อัà¸\9bà¹\80à¸\94à¸\95",
+       "botpasswords-label-update": "à¸\9bรัà¸\9a",
        "botpasswords-label-cancel": "ยกเลิก",
        "botpasswords-label-delete": "ลบ",
        "botpasswords-label-resetpassword": "ตั้งรหัสผ่านใหม่",
        "media_tip": "เชื่อมโยงไฟล์",
        "sig_tip": "ลายเซ็นของคุณพร้อมตราเวลา",
        "hr_tip": "เส้นนอน (ใช้อย่างจำกัด)",
-       "summary": "à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ย่อ:",
+       "summary": "à¸\84วามย่อ:",
        "subject": "เรื่อง:",
        "minoredit": "เป็นการแก้ไขเล็กน้อย",
        "watchthis": "เฝ้าดูหน้านี้",
        "blankarticle": "<strong>คำเตือน:</strong> หน้าที่คุณกำลังสร้างว่าง หากคุณคลิก \"$1\" อีกครั้ง จะสร้างหน้าโดยไม่มีเนื้อหาใด",
        "anoneditwarning": "<strong>คำเตือน:</strong> คุณมิได้ล็อกอิน สาธารณะจะเห็นเลขที่อยู่ไอพีของคุณหากคุณแก้ไข หากคุณ<strong>[$1 ล็อกอิน]</strong>หรือ<strong>[$2 สร้างบัญชี]</strong> การแก้ไขของคุณจะถือว่าเป็นของชื่อผู้ใช้ของคุณ ร่วมกับประโยชน์อื่น",
        "anonpreviewwarning": "<em>คุณมิได้ล็อกอิน การบันทึกจะเก็บเลขที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้</em>",
-       "missingsummary": "<strong>อยà¹\88าลืม:</strong> à¸\84ุà¸\93ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\83หà¹\89à¸\84ำอà¸\98ิà¸\9aายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82 \nà¸\96à¹\89าà¸\84ุà¸\93à¸\84ลิà¸\81 \"$1\" à¸­à¸µà¸\81 à¸\88ะà¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\82à¸\94ยà¹\84มà¹\88มีà¸\84ำอà¸\98ิà¸\9aายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82",
-       "selfredirect": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸\84ุà¸\93à¸\81ำลัà¸\87สรà¹\89าà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\84à¸\9bà¸\9aà¸\97à¸\84วามà¹\80à¸\94ียวà¸\81ัà¸\99\nà¸\84ุà¸\93อาà¸\88ระà¸\9aุà¹\80à¸\9bà¹\89าหมายà¸\82อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\9cิà¸\94 à¸«à¸£à¸·à¸­à¸\84à¸\96ณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"$1\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
+       "missingsummary": "<strong>อยà¹\88าลืม:</strong> à¸\84ุà¸\93ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\83หà¹\89à¸\84วามยà¹\88อà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82\nà¸\96à¹\89าà¸\84ุà¸\93à¸\84ลิà¸\81 \"$1\" à¸­à¸µà¸\81 à¸\88ะà¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\82à¸\94ยà¹\80วà¹\89à¸\99à¹\84วà¹\89",
+       "selfredirect": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸\84ุà¸\93à¸\81ำลัà¸\87สรà¹\89าà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\84à¸\9bà¸\9aà¸\97à¸\84วามà¹\80à¸\94ียวà¸\81ัà¸\99\nà¸\84ุà¸\93อาà¸\88ระà¸\9aุà¹\80à¸\9bà¹\89าหมายà¸\82อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\9cิà¸\94 à¸«à¸£à¸·à¸­à¸\84ุณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"$1\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
        "missingcommenttext": "กรุณากรอกความเห็น",
        "missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่เรื่องสำหรับความเห็นนี้ \nถ้าคุณคลิก \"$1\" อีก จะบันทึกการแก้ไขของคุณโดยไม่ระบุเรื่อง",
-       "summary-preview": "à¸\95ัวอยà¹\88าà¸\87à¸\84ำอà¸\98ิà¸\9aายการแก้ไข:",
-       "subject-preview": "à¸\95ัวอยà¹\88าà¸\87à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87:",
+       "summary-preview": "à¸\95ัวอยà¹\88าà¸\87à¸\84วามยà¹\88อการแก้ไข:",
+       "subject-preview": "ตัวอย่างเรื่อง:",
        "previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ",
        "blockedtitle": "ผู้ใช้ถูกบล็อก",
        "blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "edit_form_incomplete": "<strong>แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง</strong>",
        "editing": "กำลังแก้ไข $1",
        "creating": "กำลังสร้าง $1",
-       "editingsection": "à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82 $1 (à¹\80à¸\89à¸\9eาะสà¹\88วà¸\99)",
+       "editingsection": "กำลังแก้ไข $1 (ส่วน)",
        "editingcomment": "กำลังแก้ไข $1 (ส่วนใหม่)",
        "editconflict": "แก้ไขชนกัน: $1",
-       "explainconflict": "มีà¸\9cูà¹\89à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80ริà¹\88มà¹\81à¸\81à¹\89à¹\84à¸\82\nà¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\9aà¸\99มีà¸\82à¹\89อà¸\84วามหà¸\99à¹\89าà¸\97ีà¹\88มีอยูà¹\88à¹\83à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99\nà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\81สà¸\94à¸\87อยูà¹\88à¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99ลà¹\88าà¸\87\nà¸\84ุà¸\93à¸\88ะà¸\95à¹\89อà¸\87รวมการเปลี่ยนแปลงของคุณเข้ากับข้อความที่มีอยู่\n<strong>เฉพาะ</strong>ข้อความในพื้นที่ข้อความส่วนบนเท่านั้นที่จะถูกบันทึก เมื่อกด \"$1\"",
+       "explainconflict": "มีà¸\9cูà¹\89à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80ริà¹\88มà¹\81à¸\81à¹\89à¹\84à¸\82\nà¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\9aà¸\99มีà¸\82à¹\89อà¸\84วามหà¸\99à¹\89าà¸\97ีà¹\88มีอยูà¹\88à¹\83à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99\nà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\81สà¸\94à¸\87อยูà¹\88à¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99ลà¹\88าà¸\87\nà¸\84ุà¸\93à¸\88ะà¸\95à¹\89อà¸\87à¸\9cสาà¸\99การเปลี่ยนแปลงของคุณเข้ากับข้อความที่มีอยู่\n<strong>เฉพาะ</strong>ข้อความในพื้นที่ข้อความส่วนบนเท่านั้นที่จะถูกบันทึก เมื่อกด \"$1\"",
        "yourtext": "ข้อความของคุณ",
        "storedversion": "รุ่นแก้ไขที่เก็บไว้",
        "editingold": "<strong>คำเตือน: คุณกำลังแก้ไขรุ่นที่ล้าสมัยของหน้านี้</strong> ถ้าคุณบันทึก การเปลี่ยนแปลงใด ๆ หลังรุ่นนี้จะหาย",
+       "unicode-support-fail": "ดูเหมือนว่าเบราว์เซอร์ของคุณไม่รองรับยูนิโค้ด ซึ่งจำเป็นต่อการแก้ไขหน้า ฉะนั้นการแก้ไขของคุณจึงไม่ถูกบันทึก",
        "yourdiff": "ความแตกต่าง",
        "copyrightwarning": "โปรดระลึกว่างานเขียนทั้งหมดใน {{SITENAME}} ถือว่าเผยแพร่ภายใต้ $2 (ดูรายละเอียดทาง $1)\nหากคุณไม่ต้องการให้งานของคุณถูกแก้ไขและกระจายได้ตามใจ ก็อย่าส่งเข้ามา<br />\nนอกจากนี้ คุณยังสัญญาเราว่าคุณเขียนงานด้วยตนเอง หรือคัดลอกจากสาธารณสมบัติหรือทรัพยากรเสรีที่คล้ายกัน\n<strong>อย่าส่งงานมีลิขสิทธิ์โดยไม่ได้รับอนุญาต!</strong>",
        "copyrightwarning2": "โปรดระลึกว่างานเขียนทั้งหมดใน {{SITENAME}} อาจถูกผู้เขียนอื่นแก้ไข เปลี่ยนแปลงหรือนำออก\nหากคุณไม่ต้องการให้งานของคุณถูกแก้ไข ก็อย่าส่งเข้ามา<br />\nนอกจากนี้ คุณยังสัญญาเราว่าคุณเขียนงานด้วยตนเอง หรือคัดลอกจากสาธารณสมบัติหรือทรัพยากรเสรีที่คล้ายกัน (ดูรายละเอียดที่ $1)\n<strong>อย่าส่งงานมีลิขสิทธิ์โดยไม่ได้รับอนุญาต!</strong>",
        "templatesused": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในหน้านี้:",
        "templatesusedpreview": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในตัวอย่างนี้:",
        "templatesusedsection": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในส่วนนี้:",
-       "template-protected": "(à¸\96ูà¸\81ลà¹\87อà¸\81)",
-       "template-semiprotected": "(à¸\96ูà¸\81à¸\81ึà¹\88à¸\87ลà¹\87อà¸\81)",
-       "hiddencategories": "หà¸\99à¹\89าà¸\99ีà¹\89มี {{PLURAL:$1|1 à¸«à¸¡à¸§à¸\94หมูà¹\88à¸\97ีà¹\88à¸\8bà¹\88อà¸\99อยูà¹\88|$1 à¸«à¸¡à¸§à¸\94หมูà¹\88à¸\97ีà¹\88à¸\8bà¹\88อà¸\99อยูà¹\88}}:",
+       "template-protected": "(à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99)",
+       "template-semiprotected": "(à¸\96ูà¸\81à¸\81ึà¹\88à¸\87à¸\9bà¹\89อà¸\87à¸\81ัà¸\99)",
+       "hiddencategories": "หà¸\99à¹\89าà¸\99ีà¹\89มี {{PLURAL:$1|1 à¸«à¸¡à¸§à¸\94หมูà¹\88à¸\8bà¹\88อà¸\99|$1 à¸«à¸¡à¸§à¸\94หมูà¹\88à¸\8bà¹\88อà¸\99}}:",
        "edittools": "<!-- ข้อความนี้จะแสดงผลใต้ฟอร์มสำหรับการแก้ไขและอัปโหลด -->",
        "nocreatetext": "{{SITENAME}} จำกัดการสร้างหน้าใหม่\nคุณสามารถย้อนกลับไปแก้ไขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|ล็อกอินหรือสร้างบัญชีผู้ใช้]]",
        "nocreate-loggedin": "คุณไม่มีสิทธิสร้างหน้าใหม่",
        "log-fulllog": "ดูปูมแบบเต็ม",
        "edit-hook-aborted": "การแก้ไขถูกฮุกยกเลิก\nไม่ได้ให้คำอธิบาย",
        "edit-gone-missing": "ไม่สามารถปรับหน้าดังกล่าวได้\nดูเหมือนถูกลบแล้ว",
-       "edit-conflict": "แก้ชนกัน",
+       "edit-conflict": "à¹\81à¸\81à¹\89à¹\84à¸\82à¸\8aà¸\99à¸\81ัà¸\99",
        "edit-no-change": "การแก้ไขของคุณถูกเพิกเฉย เพราะไม่มีการเปลี่ยนแปลงข้อความ",
        "postedit-confirmation-created": "สร้างหน้าแล้ว",
        "postedit-confirmation-restored": "กู้คืนหน้าแล้ว",
        "postedit-confirmation-saved": "บันทึกการแก้ไขของคุณแล้ว",
+       "postedit-confirmation-published": "เผยแพร่การแก้ไขของคุณแล้ว",
        "edit-already-exists": "ไม่สามารถสร้างหน้าใหม่ได้\nเพราะมีแล้ว",
        "defaultmessagetext": "ข้อความสารปริยาย",
        "content-failed-to-parse": "แจงส่วนเนื้อหา $2 ของตัวแบบ $1 ล้มเหลว: $3",
        "post-expand-template-argument-warning": "<strong>คำเตือน:</strong> หน้านี้มีอาร์กิวเมนต์แม่แบบอย่างน้อยหนึ่งที่มีขนาดขยายใหญ่เกินไป\nสละอาร์กิวเมนต์เหล่านี้แล้ว",
        "post-expand-template-argument-category": "หน้าที่มีอาร์กิวเมนต์แม่แบบถูกสละ",
        "parser-template-loop-warning": "ตรวจพบวงวนแม่แบบ: [[$1]]",
-       "template-loop-category": "หà¸\99à¹\89าà¸\97ีà¹\88มีà¹\81มà¹\88à¹\81à¸\9aà¸\9aวà¸\99",
+       "template-loop-category": "หà¸\99à¹\89าà¸\97ีà¹\88มีวà¸\87วà¸\99à¹\81มà¹\88à¹\81à¸\9aà¸\9a",
        "template-loop-category-desc": "หน้านี้มีวงวนแม่แบบ คือ แม่แบบที่เรียกตัวเองซ้ำ",
        "template-loop-warning": "<strong>Warning:</strong> หน้านี้เรียก [[:$1]] ซึ่งทำให้เกิดวงวนแม่แบบ (การเรียกซ้ำแบบไม่สิ้นสุด)",
        "parser-template-recursion-depth-warning": "เกินขีดจำกัดความลึกการเรียกแม่แบบซ้ำ ($1)",
        "undo-failure": "การแก้ไขนี้ไม่สามารถย้อนกลับได้ เนื่องจากขัดแย้งกับการแก้ไขระหว่างกลาง",
        "undo-norev": "ไม่สามารถย้อนการแก้ไขนี้กลับ เพราะไม่มีหรือถูกลบไปแล้ว",
        "undo-nochange": "ดูเหมือนว่าการแก้ไขดังกล่าวถูกย้อนกลับแล้ว",
-       "undo-summary": "ยà¹\89อà¸\99รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82 $1 à¸\97ีà¹\88 [[Special:Contributions/$2|$2]] ([[User talk:$2|à¸\84ุย]]) à¸ªà¸£à¹\89าà¸\87",
+       "undo-summary": "ยà¹\89อà¸\99รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82 $1 à¹\82à¸\94ย [[Special:Contributions/$2|$2]] ([[User talk:$2|à¸\84ุย]])",
        "undo-summary-username-hidden": "ย้อนการแก้ไข $1 ที่สร้างโดยผู้ใช้ปกปิดชื่อ",
        "cantcreateaccount-text": "การสร้างบัญชีใหม่จากที่อยู่ไอพีนี้ ('''$1''') ถูกระงับโดย [[User:$3|$3]]\n\nเหตุผลที่ $3 ให้ไว้ คือ ''$2''",
        "cantcreateaccount-range-text": "การสร้างบัญชีจากเลขที่อยู่ไอพีในช่วง <strong>$1</strong> ซึ่งรวมเลขที่อยู่ไอพีของคุณ (<strong>$4</strong>) ถูกบล็อกโดย [[User:$3|$3]] \n\nเหตุผลที่ $3 ชี้แจง คือ <em>$2</em>",
        "viewpagelogs": "ดูปูมของหน้านี้",
        "nohistory": "ไม่มีประวัติการแก้ไขสำหรับหน้านี้",
-       "currentrev": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94",
-       "currentrev-asof": "รุà¹\88à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99 เมื่อ $1",
+       "currentrev": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99",
+       "currentrev-asof": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99เมื่อ $1",
        "revisionasof": "รุ่นแก้ไขเมื่อ $1",
        "revision-info": "รุ่นแก้ไขเมื่อ $1 โดย {{GENDER:$6|$2}}$7",
        "previousrevision": "←รุ่นแก้ไขก่อนหน้า",
        "page_first": "แรกสุด",
        "page_last": "ท้ายสุด",
        "histlegend": "การเลือกผลต่าง: เลือกปุ่มของสองรุ่นที่ต้องการเปรียบเทียบ และกดป้อนเข้าหรือปุ่มด้านล่าง<br />\nคำอธิบาย: <strong>({{int:cur}})</strong> = ผลต่างกับรุ่นแก้ไขล่าสุด, <strong>({{int:last}})</strong> = ผลต่างกับรุ่นแก้ไขก่อนหน้า, <strong>{{int:minoreditletter}}</strong> = การแก้ไขเล็กน้อย",
-       "history-fieldset-title": "à¸\84à¹\89à¸\99หารุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87",
+       "history-fieldset-title": "à¸\84à¹\89à¸\99หารุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82",
        "history-show-deleted": "เฉพาะรุ่นแก้ไขที่ถูกลบ",
        "histfirst": "แรกสุด",
        "histlast": "ล่าสุด",
        "historysize": "($1 ไบต์)",
        "historyempty": "(ว่าง)",
        "history-feed-title": "ประวัติรุ่นแก้ไข",
-       "history-feed-description": "à¸\9bระวัà¸\95ิรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ของหน้านี้ในวิกิ",
+       "history-feed-description": "à¸\9bระวัà¸\95ิรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ของหน้านี้ในวิกิ",
        "history-feed-item-nocomment": "$1 เมื่อ $2",
        "history-feed-empty": "ไม่มีหน้าที่ต้องการ \nซึ่งอาจถูกลบหรือเปลี่ยนชื่อแล้ว \nลอง[[Special:Search|ค้นวิกินี้]]หาหน้าใหม่ที่เกี่ยวข้อง",
        "history-edit-tags": "แก้ไขป้ายระบุรุ่นแก้ไขที่เลือก",
-       "rev-deleted-comment": "(à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อà¸\96ูà¸\81ลà¸\9aออà¸\81)",
-       "rev-deleted-user": "(ชื่อผู้ใช้ถูกลบออก)",
+       "rev-deleted-comment": "(à¸\84วามยà¹\88อà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81ลà¸\9a)",
+       "rev-deleted-user": "(ชื่อผู้ใช้ถูกลบ)",
        "rev-deleted-event": "(รายละเอียดปูมถูกลบ)",
-       "rev-deleted-user-contribs": "[à¸\99ำà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89หรือà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีออà¸\81à¹\81ลà¹\89ว - à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¸\88าà¸\81รายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82]",
+       "rev-deleted-user-contribs": "[à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89หรือà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\96ูà¸\81ลà¸\9a - à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¸\88าà¸\81à¸\81ารà¹\80à¸\82à¹\89ามีสà¹\88วà¸\99รà¹\88วม]",
        "rev-deleted-text-permission": "รุ่นแก้ไขหน้านี้ <strong>ถูกลบ</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
        "rev-suppressed-text-permission": "รุ่นหน้านี้ถูก<strong>ยับยั้ง</strong> \nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
        "rev-deleted-text-unhide": "รุ่นแก้ไขหน้านี้<strong>ถูกลบ</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]\nคุณยังสามารถ[$1 ดูรุ่นแก้ไขนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
        "revdelete-legend": "ตั้งการจำกัดทัศนวิสัย",
        "revdelete-hide-text": "ข้อความรุ่นแก้ไข",
        "revdelete-hide-image": "ซ่อนเนื้อหาไฟล์",
-       "revdelete-hide-name": "à¸\8bà¹\88อà¸\99à¹\80à¸\9bà¹\89าหมายà¹\81ละà¸\9eารามิà¹\80à¸\95อรà¹\8c",
-       "revdelete-hide-comment": "à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อ",
+       "revdelete-hide-name": "à¸\8bà¹\88อà¸\99à¹\80à¸\9bà¹\89าหมายà¹\81ละà¸\95ัวà¹\81à¸\9bรà¹\80สริม",
+       "revdelete-hide-comment": "à¸\84วามยà¹\88อà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82",
        "revdelete-hide-user": "ชื่อผู้ใช้/เลขที่อยู่ไอพีผู้เขียน",
        "revdelete-hide-restricted": "ยับยั้งข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น",
        "revdelete-radio-same": "(ไม่เปลี่ยนแปลง)",
        "revdelete-offender": "ผู้ประพันธ์รุ่นปรับปรุง:",
        "suppressionlog": "ปูมการยับยั้ง",
        "suppressionlogtext": "ด้านล่างนี้คือรายการการลบและบล็อกที่เกี่ยวข้องกับเนื้อหาที่ถูกซ่อนจากผู้ดูแลระบบ\nดู[[Special:BlockList|รายการบล็อก]]สำหรับรายการการแบนและบล็อกที่ยังมีผลในปัจจุบัน",
-       "mergehistory": "รวมประวัติหน้า",
-       "mergehistory-header": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\83หà¹\89à¸\84ุà¸\93รวมรุà¹\88à¸\99ของประวัติหน้าต้นทางหนึ่งไปหน้าใหม่\nให้แน่ใจว่าการเปลี่ยนแปลงนี้จะคงความต่อเนื่องของประวัติหน้าเก่า",
-       "mergehistory-box": "รวมรุà¹\88à¸\99ของสองหน้า:",
+       "mergehistory": "à¸\9cสาà¸\99ประวัติหน้า",
+       "mergehistory-header": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\83หà¹\89à¸\84ุà¸\93à¸\9cสาà¸\99รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ของประวัติหน้าต้นทางหนึ่งไปหน้าใหม่\nให้แน่ใจว่าการเปลี่ยนแปลงนี้จะคงความต่อเนื่องของประวัติหน้าเก่า",
+       "mergehistory-box": "à¸\9cสาà¸\99รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ของสองหน้า:",
        "mergehistory-from": "หน้าต้นทาง:",
        "mergehistory-into": "หน้าปลายทาง:",
-       "mergehistory-list": "à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88สามารà¸\96รวมได้",
-       "mergehistory-merge": "รุà¹\88à¸\99à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\82อà¸\87หà¸\99à¹\89า [[:$1]] à¸ªà¸²à¸¡à¸²à¸£à¸\96รวมกับหน้า [[:$2]] ได้ \nใช้คอลัมน์ปุ่มเพื่อรวมเฉพาะรุ่นที่สร้าง ณ และก่อนเวลาที่ระบุ\nหมายเหตุว่าการใช้ลิงก์นำทางจะตั้งคอลัมน์นี้ใหม่",
-       "mergehistory-go": "à¹\81สà¸\94à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88รวมได้",
-       "mergehistory-submit": "รวมรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87",
-       "mergehistory-empty": "à¹\84มà¹\88มีรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88รวมได้",
-       "mergehistory-done": "รวม $3 à¸£à¸¸à¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87 $1 à¹\80à¸\82à¹\89ากับ [[:$2]] แล้ว",
+       "mergehistory-list": "à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88สามารà¸\96à¸\9cสาà¸\99ได้",
+       "mergehistory-merge": "รุà¹\88à¸\99à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\82อà¸\87หà¸\99à¹\89า [[:$1]] à¸ªà¸²à¸¡à¸²à¸£à¸\96à¸\9cสาà¸\99กับหน้า [[:$2]] ได้ \nใช้คอลัมน์ปุ่มเพื่อรวมเฉพาะรุ่นที่สร้าง ณ และก่อนเวลาที่ระบุ\nหมายเหตุว่าการใช้ลิงก์นำทางจะตั้งคอลัมน์นี้ใหม่",
+       "mergehistory-go": "à¹\81สà¸\94à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88à¸\9cสาà¸\99ได้",
+       "mergehistory-submit": "à¸\9cสาà¸\99รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82",
+       "mergehistory-empty": "à¹\84มà¹\88มีรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88สามารà¸\96à¸\9cสาà¸\99ได้",
+       "mergehistory-done": "à¸\9cสาà¸\99 $3 à¸£à¸¸à¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87 $1 กับ [[:$2]] แล้ว",
        "mergehistory-fail": "ไม่สามารถรวมประวัติได้ โปรดตรวจสอบตัวแปรเสริมหน้าและเวลาอีกครั้ง",
-       "mergehistory-fail-bad-timestamp": "สà¹\81à¸\95มà¸\9bà¹\8cเวลาไม่ถูกต้อง",
+       "mergehistory-fail-bad-timestamp": "à¸\95ราเวลาไม่ถูกต้อง",
        "mergehistory-fail-invalid-source": "หน้าต้นทางไม่ถูกต้อง",
        "mergehistory-fail-invalid-dest": "หน้าปลายทางไม่ถูกต้อง",
-       "mergehistory-fail-no-change": "à¹\84มà¹\88à¹\84à¸\94à¹\89มีà¸\81ารà¸\84วà¸\9aรวมรุà¹\88à¸\99à¹\83à¸\94à¹\86 à¹\83à¸\99à¸\81ารà¸\84วà¸\9aรวมà¸\9bระวัà¸\95ิหà¸\99à¹\89า  à¹\82à¸\9bรà¸\94à¸\95รวà¸\88à¸\94ูà¸\84à¹\88าà¸\95ัวà¹\81à¸\9bร à¸«à¸\99à¹\89า à¹\81ละ à¹\80วลา à¹\83หมà¹\88อีกครั้ง",
+       "mergehistory-fail-no-change": "à¸\81ารà¸\9cสาà¸\99à¸\9bระวัà¸\95ิà¹\84มà¹\88à¸\9cสาà¸\99รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aà¸\95ัวà¹\81à¸\9bรà¹\80สริมหà¸\99à¹\89าà¹\81ละà¹\80วลาอีกครั้ง",
        "mergehistory-fail-permission": "มีสิทธิไม่เพียงพอที่จะผสานประวัติ",
        "mergehistory-fail-self-merge": "หน้าต้นทางและปลายทางเป็นหน้าเดียวกัน",
        "mergehistory-fail-toobig": "ไม่สามารถผสานประวัติได้ เนื่องจาก $1 รุ่นแก้ไขเก่าที่เกินขีดจำกัดสูงสุดจะต้องถูกย้ายไปก่อน",
        "mergehistory-no-destination": "ไม่มีหน้าปลายทาง $1",
        "mergehistory-invalid-source": "ชื่อเรื่องหน้าต้นทางต้องสมเหตุสมผล",
        "mergehistory-invalid-destination": "ชื่อเรื่องหน้าปลายทางต้องสมเหตุสมผล",
-       "mergehistory-autocomment": "รวม [[:$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[:$2]]",
-       "mergehistory-comment": "รวม [[:$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[:$2]]: $3",
+       "mergehistory-autocomment": "à¸\9cสาà¸\99 [[:$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[:$2]] à¹\81ลà¹\89ว",
+       "mergehistory-comment": "à¸\9cสาà¸\99 [[:$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[:$2]] à¹\81ลà¹\89ว: $3",
        "mergehistory-same-destination": "หน้าต้นทางและปลายทางเป็นหน้าเดียวกันไม่ได้",
        "mergehistory-reason": "เหตุผล:",
-       "mergelog": "à¸\9bูมà¸\81ารรวม",
-       "revertmerge": "à¹\80ลิà¸\81รวม",
-       "mergelogpagetext": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารรวมประวัติหน้าหนึ่งกับของอีกหน้าหนึ่งล่าสุด",
-       "history-title": "à¸\9bระวัà¸\95ิà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ของ \"$1\"",
+       "mergelog": "à¸\9bูมà¸\81ารà¸\9cสาà¸\99",
+       "revertmerge": "à¹\80ลิà¸\81à¸\9cสาà¸\99",
+       "mergelogpagetext": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¸\9cสาà¸\99ประวัติหน้าหนึ่งกับของอีกหน้าหนึ่งล่าสุด",
+       "history-title": "à¸\9bระวัà¸\95ิรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ของ \"$1\"",
        "difference-title": "ผลต่างระหว่างรุ่นของ \"$1\"",
        "difference-title-multipage": "ผลต่างระหว่างหน้า \"$1\" และ \"$2\"",
        "difference-multipage": "(ผลต่างระหว่างหน้า)",
        "diff-paragraph-moved-tonew": "ย้ายย่อหน้าแล้ว คลิกเพื่อไปตำแหน่งใหม่",
        "diff-paragraph-moved-toold": "ย้ายย่อหน้าแล้ว คลิกเพื่อไปตำแหน่งเดิม",
        "difference-missing-revision": "ไม่พบ{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)\n\nโดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบแล้ว \nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-       "searchresults": "ผลการค้นหา",
-       "searchresults-title": "ผลการค้นหาสำหรับ \"$1\"",
+       "searchresults": "à¸\9cลลัà¸\9eà¸\98à¹\8cà¸\81ารà¸\84à¹\89à¸\99หา",
+       "searchresults-title": "à¸\9cลลัà¸\9eà¸\98à¹\8cà¸\81ารà¸\84à¹\89à¸\99หาสำหรัà¸\9a \"$1\"",
        "titlematches": "ชื่อเรื่องหน้าตรงกัน",
        "textmatches": "ข้อความหน้าตรงกัน",
        "notextmatches": "ไม่พบข้อความหน้าตรงกัน",
        "prevn": "ก่อนหน้า $1",
        "nextn": "ถัดไป $1",
-       "prev-page": "หน้าก่อน",
+       "prev-page": "หน้าก่อนหน้า",
        "next-page": "หน้าถัดไป",
        "prevn-title": "$1 ผลลัพธ์ก่อนหน้า",
        "nextn-title": "$1 ผลลัพธ์ถัดไป",
        "searchprofile-advanced": "ขั้นสูง",
        "searchprofile-articles-tooltip": "ค้นหาใน $1",
        "searchprofile-images-tooltip": "ค้นหาไฟล์",
-       "searchprofile-everything-tooltip": "à¸\84à¹\89à¸\99à¹\80à¸\99ืà¹\89อหาà¸\97ัà¹\89à¸\87หมà¸\94 (รวมหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุย)",
+       "searchprofile-everything-tooltip": "ค้นเนื้อหาทั้งหมด (รวมหน้าคุย)",
        "searchprofile-advanced-tooltip": "ค้นหาในเนมสเปซที่เลือกเอง",
        "search-result-size": "$1 ($2 คำ)",
        "search-result-category-size": "$1 สมาชิก ($2 หมวดหมู่ย่อย, $3 ไฟล์)",
        "search-file-match": "(เนื้อหาไฟล์ตรง)",
        "search-suggest": "คุณอาจหมายถึง: $1",
        "search-rewritten": "กำลังแสดงผลลัพธ์สำหรับ $1 ค้นหา $2 แทน",
-       "search-interwiki-caption": "à¸\9cลà¸\81ารà¸\84à¹\89à¸\99หาจากโครงการพี่น้อง",
+       "search-interwiki-caption": "à¸\9cลลัà¸\9eà¸\98à¹\8cจากโครงการพี่น้อง",
        "search-interwiki-default": "ผลลัพธ์จาก $1:",
        "search-interwiki-more": "(เพิ่มเติม)",
-       "search-interwiki-more-results": "à¸\9cลà¸\81ารà¸\84à¹\89à¸\99หาà¹\80à¸\9eิà¹\88ม",
+       "search-interwiki-more-results": "à¸\9cลลัà¸\9eà¸\98à¹\8cà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม",
        "search-relatedarticle": "สัมพันธ์",
        "searchrelated": "สัมพันธ์",
        "searchall": "ทั้งหมด",
        "prefs-labs": "คุณสมบัติทดลอง",
        "prefs-user-pages": "หน้าผู้ใช้",
        "prefs-personal": "โพรไฟล์ผู้ใช้",
-       "prefs-rc": "à¸\9bรัà¸\9aà¸\9bรุงล่าสุด",
+       "prefs-rc": "à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุด",
        "prefs-watchlist": "รายการเฝ้าดู",
        "prefs-editwatchlist": "แก้ไขรายการเฝ้าดู",
        "prefs-editwatchlist-label": "แก้ไขหน่วยในรายการเฝ้าดูของคุณ:",
        "prefs-editwatchlist-edit": "ดูและลบชื่อเรื่องในรายการเฝ้าดูของคุณ",
        "prefs-editwatchlist-raw": "แก้ไขรายการเฝ้าดูดิบ",
-       "prefs-editwatchlist-clear": "ลà¸\9aลà¹\89าà¸\87รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93",
+       "prefs-editwatchlist-clear": "ล้างรายการเฝ้าดูของคุณ",
        "prefs-watchlist-days": "จำนวนวันที่แสดงในรายการเฝ้าดู:",
        "prefs-watchlist-days-max": "มากสุด $1 วัน",
        "prefs-watchlist-edits": "จำนวนการเปลี่ยนแปลงมากสุดที่แสดงในรายการเฝ้าดู:",
        "timezoneuseoffset": "อื่น ๆ (ระบุส่วนต่างเวลา)",
        "servertime": "เวลาเซิร์ฟเวอร์:",
        "guesstimezone": "เรียกค่าจากเบราว์เซอร์",
-       "timezoneregion-africa": "แอฟริกา",
-       "timezoneregion-america": "อเมริกา",
-       "timezoneregion-antarctica": "แอนตาร์กติกา",
+       "timezoneregion-africa": "à¸\97วีà¸\9bà¹\81อà¸\9fริà¸\81า",
+       "timezoneregion-america": "à¸\97วีà¸\9bอà¹\80มริà¸\81า",
+       "timezoneregion-antarctica": "à¸\97วีà¸\9bà¹\81อà¸\99à¸\95ารà¹\8cà¸\81à¸\95ิà¸\81า",
        "timezoneregion-arctic": "อาร์กติก",
-       "timezoneregion-asia": "เอเชีย",
+       "timezoneregion-asia": "à¸\97วีà¸\9bà¹\80อà¹\80à¸\8aีย",
        "timezoneregion-atlantic": "มหาสมุทรแอตแลนติก",
        "timezoneregion-australia": "ออสเตรเลีย",
-       "timezoneregion-europe": "ยุโรป",
+       "timezoneregion-europe": "à¸\97วีà¸\9bยุà¹\82รà¸\9b",
        "timezoneregion-indian": "มหาสมุทรอินเดีย",
        "timezoneregion-pacific": "มหาสมุทรแปซิฟิก",
        "allowemail": "อนุญาตให้ผู้ใช้อื่นอีเมลหา",
        "prefs-help-email": "ไม่จำเป็นต้องใส่ที่อยู่อีเมล แต่จำเป็นสำหรับการตั้งรหัสผ่านใหม่หากคุณลืมรหัสผ่าน",
        "prefs-help-email-others": "คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ\nไม่เปิดเผยที่อยู่อีเมลของคุณเมื่อผู้ใช้อื่นติดต่อคุณ",
        "prefs-help-email-required": "ต้องการที่อยู่อีเมล",
-       "prefs-info": "à¸\82à¹\89อมูลเบื้องต้น",
+       "prefs-info": "สารสà¸\99à¹\80à¸\97ศเบื้องต้น",
        "prefs-i18n": "สากลวิวัตน์",
        "prefs-signature": "ลายเซ็น",
        "prefs-dateformat": "รูปแบบวันที่",
        "group-autoconfirmed": "ผู้ใช้ทั่วไป",
        "group-bot": "บอต",
        "group-sysop": "ผู้ดูแลระบบ",
-       "group-bureaucrat": "ผู้ดูแลสิทธิแต่งตั้ง",
+       "group-bureaucrat": "à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aสิà¸\97à¸\98ิà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87",
        "group-suppress": "ผู้ดูแลประวัติ",
        "group-all": "(ทั้งหมด)",
        "group-user-member": "{{GENDER:$1|ผู้ใช้}}",
        "group-autoconfirmed-member": "{{GENDER:$1|ผู้ใช้ทั่วไป}}",
        "group-bot-member": "{{GENDER:$1|บอต}}",
        "group-sysop-member": "{{GENDER:$1|ผู้ดูแลระบบ}}",
-       "group-bureaucrat-member": "{{GENDER:$1|ผู้ดูแลสิทธิแต่งตั้ง}}",
+       "group-bureaucrat-member": "{{GENDER:$1|à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aสิà¸\97à¸\98ิà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87}}",
        "group-suppress-member": "{{GENDER:$1|ผู้ดูแลประวัติ}}",
        "grouppage-user": "{{ns:project}}:ผู้ใช้",
        "grouppage-autoconfirmed": "{{ns:project}}:ผู้ใช้ทั่วไป",
        "grouppage-bot": "{{ns:project}}:บอต",
        "grouppage-sysop": "{{ns:project}}:ผู้ดูแลระบบ",
-       "grouppage-bureaucrat": "{{ns:project}}:ผู้ดูแลสิทธิแต่งตั้ง",
+       "grouppage-bureaucrat": "{{ns:project}}:à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aสิà¸\97à¸\98ิà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87",
        "grouppage-suppress": "{{ns:project}}:ผู้ดูแลประวัติ",
        "right-read": "อ่านหน้า",
        "right-edit": "แก้ไขหน้า",
        "right-purge": "ล้างแคชของเว็บไซต์โดยไม่ยืนยัน",
        "right-autoconfirmed": "ไม่ได้รับผลจากขีดจำกัดอัตรายึดเลขที่อยู่ไอพี",
        "right-bot": "กำหนดเป็นกระบวนการอัตโนมัติ",
-       "right-nominornewtalk": "หาà¸\81à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\83à¸\99หà¸\99à¹\89าอภิà¸\9bรายà¸\88ะà¸\97ำà¹\83หà¹\89à¸\81ารà¹\81à¸\88à¹\89à¸\87à¸\82à¹\89อà¸\84วามใหม่ปรากฏ",
+       "right-nominornewtalk": "หาà¸\81à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\83à¸\99หà¸\99à¹\89าอภิà¸\9bรายà¸\88ะà¸\97ำà¹\83หà¹\89à¸\81ารà¹\81à¸\88à¹\89à¸\87สารใหม่ปรากฏ",
        "right-apihighlimits": "ใช้ข้อจำกัดที่สูงขึ้นในคำสั่งเอพีไอ",
        "right-writeapi": "ใช้การเขียนเอพีไอ",
        "right-delete": "ลบหน้า",
        "right-autopatrol": "ให้ทำเครื่องหมายการแก้ไขของตนเองเป็นตรวจสอบแล้วอัตโนมัติ",
        "right-patrolmarks": "ดูการทำเครื่องหมายตรวจสอบในการเปลี่ยนแปลงล่าสุด",
        "right-unwatchedpages": "ดูรายการหน้าที่ไม่มีผู้เฝ้าดู",
-       "right-mergehistory": "รวมประวัติหน้า",
+       "right-mergehistory": "à¸\9cสาà¸\99ประวัติหน้า",
        "right-userrights": "แก้ไขสิทธิผู้ใช้ทั้งหมด",
        "right-userrights-interwiki": "แก้ไขสิทธิผู้ใช้ของผู้ใช้บนวิกิอื่น",
        "right-siteadmin": "ล็อกและปลดล็อกฐานข้อมูล",
        "right-sendemail": "ส่งอีเมลหาผู้ใช้อื่น",
        "right-managechangetags": "สร้างและเปิด/ปิดใช้งาน[[Special:Tags|ป้ายระบุ]]",
        "right-applychangetags": "ใช้[[Special:Tags|ป้ายระบุ]]ร่วมกับการเปลี่ยนแปลงของผู้ใช้",
+       "right-changetags": "เพิ่มและลบ[[Special:Tags|ป้ายระบุ]]คงค่าต่อรุ่นแก้ไขและหน่วยปูมหนึ่ง",
        "right-deletechangetags": "ลบ[[Special:Tags|ป้ายระบุ]]ออกจากฐานข้อมูล",
+       "grant-generic": "รวมชุดสิทธิ \"$1\"",
        "grant-group-page-interaction": "โต้ตอบกับหน้า",
        "grant-group-file-interaction": "โต้ตอบกับสื่อ",
        "grant-group-watchlist-interaction": "โต้ตอบกับรายการเฝ้าดูของคุณ",
        "grant-group-email": "ส่งอีเมล",
+       "grant-group-high-volume": "ดำเนินการปฏิบัติการปริมาตรสูง",
        "grant-group-customization": "การปรับแต่งและการตั้งค่า",
        "grant-group-administration": "ดำเนินปฏิบัติการบริหาร",
        "grant-group-private-information": "เข้าถึงข้อมูลส่วนตัวเกี่ยวกับตัวคุณ",
        "grant-patrol": "ลาดตระเวนตรวจการเปลี่ยนแปลงหน้าต่าง ๆ",
        "grant-privateinfo": "เข้าถึงข้อมูลส่วนบุคคล",
        "grant-protect": "ล็อกและปลดล็อกหน้าต่าง ๆ",
-       "grant-rollback": "à¸\97ำà¸\81ลัà¸\9aà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89า",
+       "grant-rollback": "ยà¹\89อà¸\99à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89ารวà¸\94à¹\80à¸\94ียว",
        "grant-sendemail": "ส่งอีเมลหาผู้ใช้อื่น",
        "grant-uploadeditmovefile": "อัปโหลด แทนที่ และย้ายไฟล์",
        "grant-uploadfile": "อัปโหลดไฟล์ใหม่",
        "action-patrol": "ทำเครื่องหมายการแก้ไขของผู้ใช้อื่นว่าตรวจสอบแล้ว",
        "action-autopatrol": "ทำเครื่องหมายการแก้ไขของคุณว่าตรวจสอบแล้ว",
        "action-unwatchedpages": "ดูรายการหน้าที่ไม่มีผู้เฝ้าดู",
-       "action-mergehistory": "รวมประวัติหน้านี้",
+       "action-mergehistory": "à¸\9cสาà¸\99ประวัติหน้านี้",
        "action-userrights": "แก้ไขสิทธิผู้ใช้ทั้งหมด",
        "action-userrights-interwiki": "แก้ไขสิทธิผู้ใช้ของผู้ใช้บนวิกิอื่น",
        "action-siteadmin": "ล็อกหรือปลดล็อกฐานข้อมูล",
        "action-viewmyprivateinfo": "ดูสารสนเทศส่วนตัวของคุณ",
        "action-editmyprivateinfo": "แก้ไขสารสนเทศส่วนตัวของคุณ",
        "action-editcontentmodel": "แก้ไขตัวแบบเนื้อหาของหน้า",
+       "action-managechangetags": "สร้างและ(เ)ปิดใช้งานป้ายระบุ",
+       "action-applychangetags": "ใช้ป้ายระบุร่วมกับการแก้ไขของคุณ",
+       "action-changetags": "เพิ่มและลบป้ายระบุคงค่าต่อรุ่นแก้ไขและหน่วยปูมหนึ่ง",
        "action-deletechangetags": "ลบป้ายระบุออกจากฐานข้อมูล",
        "action-purge": "ล้างหน้านี้",
        "nchanges": "$1 การเปลี่ยนแปลง",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ตั้งแต่การเยี่ยมชมครั้งสุดท้าย}}",
        "enhancedrc-history": "ประวัติ",
-       "recentchanges": "à¸\9bรัà¸\9aà¸\9bรุงล่าสุด",
-       "recentchanges-legend": "à¸\95ัวà¹\80ลือà¸\81à¸\81ารà¸\9bรัà¸\9aà¸\9bรุงล่าสุด",
+       "recentchanges": "à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุด",
+       "recentchanges-legend": "à¸\95ัวà¹\80ลือà¸\81à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุด",
        "recentchanges-summary": "ติดตามการเปลี่ยนแปลงล่าสุดบนวิกินี้ได้ทางหน้านี้",
        "recentchanges-noresult": "ไม่มีการเปลี่ยนแปลงในช่วงที่กำหนดซึ่งตรงกับเกณฑ์เหล่านี้",
        "recentchanges-timeout": "การค้นหานี้หมดเวลาแล้ว คุณอาจต้องการลองตัวแปรเสริมค้นหาอื่น",
        "recentchanges-network": "เนื่องจากข้อผิดพลาดทางเทคนิค จึงไม่สามารถโหลดผลลัพธ์ได้ กรุณาลองรีเฟรชหน้า",
        "recentchanges-notargetpage": "กรอกชื่อหน้าด้านบนเพื่อดูการเปลี่ยนแปลงที่สัมพันธ์กับหน้านั้น",
-       "recentchanges-feed-description": "à¸\95ิà¸\94à¸\95ามà¸\81ารà¸\9bรัà¸\9aà¸\9bรุงล่าสุดในวิกินี้ในฟีดนี้",
+       "recentchanges-feed-description": "à¸\95ิà¸\94à¸\95ามà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุดในวิกินี้ในฟีดนี้",
        "recentchanges-label-newpage": "การแก้ไขนี้สร้างหน้าใหม่",
        "recentchanges-label-minor": "เป็นการแก้ไขเล็กน้อย",
        "recentchanges-label-bot": "บอตเป็นผู้ทำการแก้ไขนี้",
        "rcfilters-filter-major-description": "การแก้ไขที่ไม่ได้ทำเครื่องหมายเป็นการแก้ไขเล็กน้อย",
        "rcfilters-filtergroup-watchlist": "หน้าในรายการเฝ้าดู",
        "rcfilters-filter-watchlist-watched-label": "ในรายการเฝ้าดู",
-       "rcfilters-filter-watchlist-watched-description": "à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82องหน้าในรายการเฝ้าดูของคุณ",
+       "rcfilters-filter-watchlist-watched-description": "à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงหน้าในรายการเฝ้าดูของคุณ",
        "rcfilters-filter-watchlist-watchednew-label": "การเปลี่ยนแปลงรายการเฝ้าดูใหม่",
        "rcfilters-filter-watchlist-watchednew-description": "การเปลี่ยนแปลงหน้าในรายการเฝ้าดูที่คุณยังไม่ได้ชมนับแต่มีการเปลี่ยนแปลง",
        "rcfilters-filter-watchlist-notwatched-label": "ไม่อยู่ในรายการเฝ้าดู",
        "boteditletter": "บ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 ผู้ใช้เฝ้าดู]",
-       "rc_categories": "จำกัดเฉพาะหมวดหมู่ (แยกด้วย \"|\"):",
-       "rc_categories_any": "อะไรก็ได้ที่เลือก",
-       "rc-change-size-new": "$1 ไบต์หลังปรับปรุง",
-       "newsectionsummary": "/* $1 */ หัวข้อใหม่",
+       "rc-change-size-new": "$1 ไบต์หลังเปลี่ยนแปลง",
+       "newsectionsummary": "/* $1 */ ส่วนใหม่",
        "rc-enhanced-expand": "แสดงรายละเอียด",
        "rc-enhanced-hide": "ซ่อนรายละเอียด",
        "rc-old-title": "เดิมถูกสร้างในชื่อ \"$1\"",
-       "recentchangeslinked": "à¸\9bรัà¸\9aà¸\9bรุงที่เกี่ยวโยง",
-       "recentchangeslinked-feed": "à¸\9bรัà¸\9aà¸\9bรุงที่เกี่ยวโยง",
-       "recentchangeslinked-toolbox": "à¸\81ารà¸\9bรัà¸\9aà¸\9bรุงที่เกี่ยวโยง",
+       "recentchangeslinked": "à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงที่เกี่ยวโยง",
+       "recentchangeslinked-feed": "à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงที่เกี่ยวโยง",
+       "recentchangeslinked-toolbox": "à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงที่เกี่ยวโยง",
        "recentchangeslinked-title": "การปรับปรุงที่โยงกับ \"$1\"",
        "recentchangeslinked-summary": "กรอกชื่อหน้าเพื่อดูการเปลี่ยนแปลงในหน้าที่ลิงก์ไปหรือจากหน้านั้น (ใส่หมวดหมู่:ชื่อหมวดหมู่ เพื่อดูสมาชิกของหมวดหมู่)  การเปลี่ยนแปลงของหน้าใน[[Special:Watchlist|รายการเฝ้าดูของคุณ]]แสดงเป็น<strong>ตัวหนา</strong>",
        "recentchangeslinked-page": "ชื่อหน้า:",
        "recentchangeslinked-to": "แสดงการเปลี่ยนแปลงไปหน้าซึ่งโยงไปหน้าที่ระบุแทน",
-       "recentchanges-page-added-to-category": "[[:$1]] ถูกเพิ่มเข้าหมวดหมู่",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] ถูกเพิ่มเข้าหมวดหมู่แล้ว [[Special:WhatLinksHere/$1|หน้านี้รวมถึงภายในหน้าอื่นๆ ด้วย]]",
-       "recentchanges-page-removed-from-category": "[[:$1]] ถูกลบจากหมวดหมู่",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] ถูกลบจากหมวดหมู่แล้ว [[Special:WhatLinksHere/$1|หน้านี้รวมถึงภายในหน้าอื่นๆ ด้วย]]",
+       "recentchanges-page-added-to-category": "เพิ่ม [[:$1]] เพิ่มเข้าหมวดหมู่",
+       "recentchanges-page-added-to-category-bundled": "เพิ่ม [[:$1]] เข้าหมวดหมู่ [[Special:WhatLinksHere/$1|หน้านี้รวมอยู่ในหน้าอื่น ๆ ด้วย]]",
+       "recentchanges-page-removed-from-category": "ลบ [[:$1]] จากหมวดหมู่",
+       "recentchanges-page-removed-from-category-bundled": "ลบ [[:$1]] ากหมวดหมู่แล้ว [[Special:WhatLinksHere/$1|หน้านี้รวมอยู่ในหน้าอื่น ๆ ด้วย]]",
        "autochange-username": "การเปลี่ยนแปลงอัตโนมัติมีเดียวิกิ",
        "upload": "อัปโหลดไฟล์",
        "uploadbtn": "อัปโหลดไฟล์",
-       "reuploaddesc": "ยà¸\81à¹\80ลิà¸\81à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\81ละà¸\81ลัà¸\9aà¹\84à¸\9bยัà¸\87à¹\81à¸\9aà¸\9aอัà¸\9bà¹\82หลà¸\94",
+       "reuploaddesc": "ยกเลิกการอัปโหลดและกลับไปแบบอัปโหลด",
        "upload-tryagain": "ส่งคำอธิบายไฟล์ที่ดัดแปรแล้ว",
        "upload-tryagain-nostash": "ส่งไฟล์ที่อัปโหลดใหม่และคำอธิบายที่ดัดแปรแล้ว",
        "uploadnologin": "ไม่ได้ล็อกอิน",
        "longpages": "หน้ายาว",
        "deadendpages": "หน้าสุดทาง",
        "deadendpagestext": "หน้าต่อไปนี้ไม่เชื่อมโยงไปหน้าอื่นใน {{SITENAME}}",
-       "protectedpages": "หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81",
-       "protectedpages-indef": "à¹\80à¸\89à¸\9eาะà¸\81ารลà¹\87อà¸\81แบบไม่มีกำหนด",
+       "protectedpages": "หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
+       "protectedpages-indef": "à¹\80à¸\89à¸\9eาะà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99แบบไม่มีกำหนด",
        "protectedpages-summary": "หน้านี้แสดงรายการหน้าที่มีอยู่ซึ่งปัจจุบันถูกล็อก สำหรับรายการชื่อเรื่องที่ถูกป้องกันมิให้สร้าง ดู [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]",
-       "protectedpages-cascade": "à¹\80à¸\89à¸\9eาะà¸\81ารลà¹\87อà¸\81แบบต่อเรียง",
+       "protectedpages-cascade": "à¹\80à¸\89à¸\9eาะà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99แบบต่อเรียง",
        "protectedpages-noredirect": "ซ่อนการเปลี่ยนทาง",
-       "protectedpagesempty": "à¸\82à¸\93ะà¸\99ีà¹\89à¹\84มà¹\88มีหà¸\99à¹\89าà¸\96ูà¸\81ลà¹\87อà¸\81à¸\95ามà¸\9eารามิà¹\80à¸\95อรà¹\8cเหล่านี้",
-       "protectedpages-timestamp": "วัà¸\99-เวลา",
+       "protectedpagesempty": "à¸\82à¸\93ะà¸\99ีà¹\89à¹\84มà¹\88มีหà¸\99à¹\89าà¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\95ามà¸\95ัวà¹\81à¸\9bรà¹\80สริมเหล่านี้",
+       "protectedpages-timestamp": "à¸\95ราเวลา",
        "protectedpages-page": "หน้า",
        "protectedpages-expiry": "หมดอายุ",
-       "protectedpages-performer": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88ลà¹\87อà¸\81",
-       "protectedpages-params": "à¸\9eารามิà¹\80à¸\95อรà¹\8cà¸\81ารลà¹\87อà¸\81",
+       "protectedpages-performer": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
+       "protectedpages-params": "à¸\95ัวà¹\81à¸\9bรà¹\80สริมà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
        "protectedpages-reason": "เหตุผล",
        "protectedpages-submit": "แสดงหน้า",
        "protectedpages-unknown-timestamp": "ไม่ทราบ",
        "protectedpages-unknown-performer": "ไม่ทราบผู้ใช้",
        "protectedtitles": "ชื่อเรื่องที่ถูกป้องกัน",
        "protectedtitles-summary": "หน้านี้แสดงรายการชื่อที่ปัจจุบันถูกป้องกันมิให้สร้าง สำหรับรายการหน้าที่มีอยู่ที่ถูกล็อก ดู [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]",
-       "protectedtitlesempty": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88มีหัวà¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\94à¹\89วยà¸\9eารามิà¹\80à¸\95อรà¹\8cเหล่านี้",
+       "protectedtitlesempty": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88มีหัวà¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\94à¹\89วยà¸\95ัวà¹\81à¸\9bรà¹\80สริมเหล่านี้",
        "protectedtitles-submit": "แสดงชื่อเรื่อง",
        "listusers": "รายการผู้ใช้",
        "listusers-editsonly": "แสดงเฉพาะผู้ใช้ที่มีการแก้ไข",
        "newpages-submit": "แสดง",
        "newpages-username": "ชื่อผู้ใช้:",
        "ancientpages": "หน้าเก่าสุด",
-       "move": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อ",
-       "movethispage": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหน้านี้",
+       "move": "ยà¹\89าย",
+       "movethispage": "ยà¹\89ายหน้านี้",
        "unusedimagestext": "ไฟล์ต่อไปนี้มีอยู่ แต่ไม่มีการเรียกใช้ในหน้าใด\nหมายเหตุว่า เว็บไซต์อื่นอาจเชื่อมโยงมายังไฟล์ด้วยยูอาร์แอลโดยตรง ฉะนั้นจึงอาจยังแสดงรายการอยู่ที่นี่แม้ยังใช้อยู่",
        "unusedcategoriestext": "หมวดหมู่ต่อไปนี้มีอยู่ แม้ไม่มีหน้าอื่นหรือหมวดหมู่ใดใช้",
        "notargettitle": "ไม่มีเป้าหมาย",
        "nopagetext": "ไม่มีหน้าเป้าหมายที่คุณระบุ",
        "pager-newer-n": "ใหม่กว่า $1",
        "pager-older-n": "เก่ากว่า $1",
-       "suppress": "à¸\9cูà¹\89à¸\94ูà¹\81ลà¸\9bระวัà¸\95ิ",
+       "suppress": "ระà¸\87ัà¸\9a",
        "querypage-disabled": "หน้าพิเศษนี้ถูกปิดใช้งานด้วยเหตุผลด้านสมรรถภาพ",
        "apihelp-no-such-module": "ไม่พบมอดูล \"$1\"",
        "apisandbox-api-disabled": "ไซต์นี้ไม่เปิดใช้ API",
        "apisandbox-loading": "กำลังดึงข้อมูลสำหรับ API module \"$1\"...",
        "apisandbox-load-error": "เกิดความผิดพลาดขณะดึงข้อมูลสำหรับ API module \"$1\": $2",
        "apisandbox-no-parameters": "ไม่มีตัวแปรใน API module นี้",
-       "apisandbox-helpurls": "ลิà¸\87à¸\81à¹\8cวิà¸\98ีà¹\83à¸\8aà¹\89",
+       "apisandbox-helpurls": "ลิà¸\87à¸\81à¹\8cà¸\84ำอà¸\98ิà¸\9aาย",
        "apisandbox-examples": "ตัวอย่าง",
-       "apisandbox-dynamic-parameters": "ตัวแปรเพิ่มเติม",
-       "apisandbox-dynamic-parameters-add-label": "เพิ่มตัวแปร:",
+       "apisandbox-dynamic-parameters": "à¸\95ัวà¹\81à¸\9bรà¹\80สริมà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม",
+       "apisandbox-dynamic-parameters-add-label": "เพิ่มตัวแปรเสริม:",
        "apisandbox-dynamic-error-exists": "มีตัวแปรเสริมชื่อ \"$1\" อยู่แล้ว",
        "apisandbox-deprecated-parameters": "ตัวแปรที่ไม่แนะนำให้ใช้",
        "apisandbox-results": "ผลลัพธ์",
        "categories-submit": "แสดง",
        "categoriespagetext": "{{PLURAL:$1|หมวดหมู่นี้|หมวดหมู่ต่อไปนี้}}มีหน้าหรือสื่อต่าง ๆ\n[[Special:UnusedCategories|หมวดหมู่ที่ไม่ได้ใช้]]จะไม่แสดงในที่นี้\nดูเพิ่มที่ [[Special:WantedCategories|หมวดหมู่ที่ต้องการ]]",
        "categoriesfrom": "แสดงหมวดหมู่เริ่มจาก:",
-       "deletedcontributions": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\80à¸\82ียà¸\99ที่ถูกลบ",
-       "deletedcontributions-title": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\80à¸\82ียà¸\99ที่ถูกลบ",
-       "sp-deletedcontributions-contribs": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\80à¸\82ียà¸\99",
+       "deletedcontributions": "à¸\81ารà¹\80à¸\82à¹\89ามีสà¹\88วà¸\99รà¹\88วมà¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ที่ถูกลบ",
+       "deletedcontributions-title": "à¸\81ารà¹\80à¸\82à¹\89ามีสà¹\88วà¸\99รà¹\88วมà¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ที่ถูกลบ",
+       "sp-deletedcontributions-contribs": "à¸\81ารà¹\80à¸\82à¹\89ามีสà¹\88วà¸\99รà¹\88วม",
        "linksearch": "ค้นหาลิงก์ภายนอก",
        "linksearch-pat": "รูปแบบการค้นหา:",
        "linksearch-ns": "เนมสเปซ:",
        "listusers-submit": "แสดง",
        "listusers-noresult": "ไม่พบผู้ใช้",
        "listusers-blocked": "(ถูกบล็อก)",
-       "activeusers": "รายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\84วามเคลื่อนไหว",
-       "activeusers-intro": "à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ิà¸\88à¸\81รรมใด ๆ ในช่วง $1 วันหลังสุด",
+       "activeusers": "รายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88ยัà¸\87เคลื่อนไหว",
+       "activeusers-intro": "à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\84วามà¹\80à¸\84ลืà¹\88อà¸\99à¹\84หวใด ๆ ในช่วง $1 วันหลังสุด",
        "activeusers-count": "$1 ปฏิบัติการ{{PLURAL:$1|}} ในช่วง $3 วันหลังสุด",
        "activeusers-from": "แสดงผู้ใช้เริ่มจาก:",
        "activeusers-noresult": "ไม่พบผู้ใช้",
-       "activeusers-submit": "à¹\81สà¸\94à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88ยัà¸\87มีà¸\81ิà¸\88à¸\81รรม",
+       "activeusers-submit": "à¹\81สà¸\94à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88ยัà¸\87à¹\80à¸\84ลืà¹\88อà¸\99à¹\84หว",
        "listgrouprights": "สิทธิกลุ่มผู้ใช้",
        "listgrouprights-summary": "ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง\nอาจมี[[{{MediaWiki:Listgrouprights-helppage}}|สารสนเทศเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ",
        "listgrouprights-key": "คำอธิบาย:\n* <span class=\"listgrouprights-granted\">สิทธิที่ได้รับแต่งตั้ง</span>\n* <span class=\"listgrouprights-revoked\">สิทธิที่ถูกเพิกถอน</span>",
        "listgrouprights-namespaceprotection-header": "การจำกัดเนมสเปซ",
        "listgrouprights-namespaceprotection-namespace": "เนมสเปซ",
        "listgrouprights-namespaceprotection-restrictedto": "สิทธิอนุญาตให้ผู้ใช้แก้ไข",
-       "listgrants": "สิà¸\97à¸\98ิà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87",
-       "listgrants-grant": "สิà¸\97à¸\98ิà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87",
+       "listgrants": "à¸\81ารà¹\83หà¹\89สิà¸\97à¸\98ิ",
+       "listgrants-grant": "à¸\81ารà¹\83หà¹\89สิà¸\97à¸\98ิ",
        "listgrants-rights": "สิทธิ",
        "trackingcategories": "หมวดหมู่ค้นหาและติดตาม",
        "trackingcategories-summary": "หน้านี้แสดงรายการหมวดหมู่ค้นหาและติดตามซึ่งซอฟต์แวร์มีเดียวิกิจัดการอัตโนมัติ สามารถเปลี่ยนชื่อเหล่านี้ได้โดยการเปลี่ยนสารระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}",
        "emailfrom": "จาก:",
        "emailto": "ถึง:",
        "emailsubject": "เรื่อง:",
-       "emailmessage": "à¸\82à¹\89อà¸\84วาม:",
+       "emailmessage": "สาร:",
        "emailsend": "ส่ง",
        "emailccme": "ส่งอีเมลสำเนาสารของฉันหาฉัน",
        "emailccsubject": "คัดลอกสารของคุณไป $1: $2",
        "unwatchthispage": "เลิกเฝ้าดูหน้านี้",
        "notanarticle": "ไม่ใช่หน้าเนื้อหา",
        "notvisiblerev": "รุ่นล่าสุดโดยผู้ใช้อีกคนถูกลบแล้ว",
-       "watchlist-details": "มี $1 à¸«à¸\99à¹\89าà¹\83à¸\99รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93 (รวมหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุย)",
+       "watchlist-details": "มี $1 หน้าในรายการเฝ้าดูของคุณ (รวมหน้าคุย)",
        "wlheader-enotif": "เปิดใช้งานการแจ้งเตือนผ่านอีเมล",
        "wlheader-showupdated": "หน้าที่มีการเปลี่ยนแปลงตั้งแต่คุณเยี่ยมครั้งสุดท้ายแสดงด้วย<strong>ตัวหนา</strong>",
        "wlnote": "ด้านล่างเป็น{{PLURAL:$1|การเปลี่ยนแปลงหลังสุด| <strong>$1</strong> การเปลี่ยนแปลงหลังสุด}} ใน{{PLURAL:$2|ชั่วโมง| <strong>$2</strong> ชั่วโมง}}ที่หลังสุด จนถึง $3, $4",
        "deletepage": "ลบหน้า",
        "confirm": "ยืนยัน",
        "excontent": "เนื้อหาเดิม: \"$1\"",
-       "excontentauthor": "à¹\80à¸\99ืà¹\89อหาà¹\80à¸\94ิม: \"$1\" à¹\81ละมีà¸\9cูà¹\89à¹\80à¸\82ียà¸\99à¸\84à¸\99à¹\80à¸\94ียวà¸\84ือ \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|à¸\9eูà¸\94à¸\84ุย]])",
+       "excontentauthor": "เนื้อหาเดิม: \"$1\" และมีผู้เขียนคนเดียวคือ \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|คุย]])",
        "exbeforeblank": "เนื้อหาก่อนถูกทำว่างคือ: \"$1\"",
        "delete-confirm": "ลบ \"$1\"",
        "delete-legend": "ลบ",
        "deleteprotected": "คุณไม่สามารถลบหน้านี้เพราะถูกล็อก",
        "deleting-backlinks-warning": "<strong>คำเตือน:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|หน้าอื่น]]เชื่อมโยงมายังหรือดึงข้อมูลจากหน้าที่คุณกำลังจะลบ",
        "deleting-subpages-warning": "<strong>คำเตือน:</strong> หน้าที่คุณกำลังจะลบมี[[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|หน้าย่อย $ หน้า|51=มากกว่า 50 หน้า}}]]",
-       "rollback": "ยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99",
-       "rollbacklink": "ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99",
-       "rollbacklinkcount": "ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99 $1 การแก้ไข",
-       "rollbacklinkcount-morethan": "ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99กว่า $1 การแก้ไข",
-       "rollbackfailed": "ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99ล้มเหลว",
-       "rollback-missingparam": "ในคำขอไม่มีตัวแปรที่ต้องการ",
+       "rollback": "ยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รวà¸\94à¹\80à¸\94ียว",
+       "rollbacklink": "ยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียว",
+       "rollbacklinkcount": "ยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียว $1 การแก้ไข",
+       "rollbacklinkcount-morethan": "ยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียวกว่า $1 การแก้ไข",
+       "rollbackfailed": "ยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียวล้มเหลว",
+       "rollback-missingparam": "à¹\83à¸\99à¸\84ำà¸\82อà¹\84มà¹\88มีà¸\95ัวà¹\81à¸\9bรà¹\80สริมà¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร",
        "rollback-missingrevision": "ไม่สามารถดึงข้อมูลรุ่น",
        "cantrollback": "ไม่สามารถย้อนการแก้ไขได้ ผู้เขียนคนล่าสุดเป็นผู้เขียนคนเดียวของหน้านี้",
-       "alreadyrolled": "à¹\84มà¹\88สามารà¸\96ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82สุà¸\94à¸\97à¹\89ายà¹\82à¸\94ย [[User:$2|$2]] ([[User talk:$2|à¸\9eูà¸\94à¸\84ุย]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) à¹\83à¸\99หà¸\99à¹\89า [[:$1]] à¸¡à¸µà¸\9cูà¹\89อืà¹\88à¸\99à¹\84à¸\94à¹\89à¹\81à¸\81à¹\89à¹\84à¸\82หรือยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\9bà¸\81à¹\88อà¸\99à¹\81ลà¹\89ว\n\nà¸\9cูà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\84ือ [[User:$3|$3]] ([[User talk:$3|à¸\9eูà¸\94คุย]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])",
+       "alreadyrolled": "à¹\84มà¹\88สามารà¸\96ยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียวà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82สุà¸\94à¸\97à¹\89ายà¹\82à¸\94ย [[User:$2|$2]] ([[User talk:$2|à¸\84ุย]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) à¹\83à¸\99หà¸\99à¹\89า [[:$1]] à¸¡à¸µà¸\9cูà¹\89อืà¹\88à¸\99à¹\84à¸\94à¹\89à¹\81à¸\81à¹\89à¹\84à¸\82หรือยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียวหà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\9bà¸\81à¹\88อà¸\99à¹\81ลà¹\89ว\n\nà¸\9cูà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\84ือ [[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|Talk]]) ไปยังรุ่นแก้ไขล่าสุดโดย [[User:$1|$1]]",
+       "revertpage": "ย้อนการแก้ไขโดย [[Special:Contributions/$2|$2]] ([[User talk:$2|คุย]]) ไปยังรุ่นแก้ไขล่าสุดโดย [[User:$1|$1]]",
        "revertpage-nouser": "ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นล่าสุดโดย {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "ย้อนการแก้ไขโดย $1; \nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2",
        "rollback-success-notify": "ย้อนการแก้ไขโดย $1;\nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2 [$3 แสดงการเปลี่ยนแปลง]",
        "changecontentmodel-title-label": "ชื่อหน้า:",
        "changecontentmodel-reason-label": "เหตุผล:",
        "changecontentmodel-submit": "ความเปลี่ยนแปลง",
+       "changecontentmodel-emptymodels-title": "ไม่มีตัวแบบเนื้อหา",
+       "log-name-contentmodel": "ปูมการเปลี่ยนตัวแบบเนื้อหา",
        "logentry-contentmodel-change-revertlink": "ย้อน",
        "logentry-contentmodel-change-revert": "ย้อน",
        "protectlogpage": "ปูมการล็อก",
        "unprotectedarticle-comment": "{{GENDER:$2|}}ปลดล็อก \"[[$1]]\"",
        "protect-title": "เปลี่ยนระดับการล็อกสำหรับ \"$1\"",
        "protect-title-notallowed": "ดูระดับการล็อกของ \"$1\"",
-       "prot_1movedto2": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อ [[$1]] เป็น [[$2]]",
+       "prot_1movedto2": "ยà¹\89าย [[$1]] เป็น [[$2]]",
        "protect-badnamespace-title": "เนมสเปซล็อกไม่ได้",
        "protect-badnamespace-text": "ล็อกหน้าในเนมสเปซนี้ไม่ได้",
        "protect-norestrictiontypes-text": "หน้านี้ไม่สามารถถูกล็อก เพราะไม่มีประเภทการจำกัดที่ใช้ได้",
        "maximum-size": "ขนาดอย่างมาก",
        "pagesize": "(ไบต์)",
        "restriction-edit": "แก้ไข",
-       "restriction-move": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อ",
+       "restriction-move": "ยà¹\89าย",
        "restriction-create": "สร้าง",
        "restriction-upload": "อัปโหลด",
-       "restriction-level-sysop": "ลà¹\87อà¸\81สมบูรณ์",
-       "restriction-level-autoconfirmed": "à¸\81ึà¹\88à¸\87ลà¹\87อà¸\81",
+       "restriction-level-sysop": "à¸\9bà¹\89อà¸\87à¸\81ัà¸\99สมบูรณ์",
+       "restriction-level-autoconfirmed": "à¸\81ึà¹\88à¸\87à¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
        "restriction-level-all": "ทุกระดับ",
        "undelete": "ดูหน้าที่ถูกลบ",
        "undeletepage": "ดูและกู้คืนหน้าที่ถูกลบ",
        "tooltip-invert": "เลือกกล่องนี้เพื่อซ่อนการเปลี่ยนแปลงไปยังหน้าในเนมเปซที่เลือก (และเนมสเปซที่เกี่ยวข้องถ้าเลือก)",
        "tooltip-whatlinkshere-invert": "เลือกกล่องนี้เพื่อซ่อนลิงก์จากหน้าในเนมสเปซที่เลือก",
        "namespace_association": "เนมสเปซที่เกี่ยวข้อง",
-       "tooltip-namespace_association": "à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¸\99ีà¹\89à¹\80à¸\9eืà¹\88อรวมà¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\9eูà¸\94à¸\84ุยหรือหัวà¸\82à¹\89อที่เกี่ยวข้องกับเนมสเปซที่เลือกด้วย",
+       "tooltip-namespace_association": "à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¸\99ีà¹\89à¹\80à¸\9eืà¹\88อรวมà¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\84ุยหรือà¹\80รืà¹\88อà¸\87ที่เกี่ยวข้องกับเนมสเปซที่เลือกด้วย",
        "blanknamespace": "(หลัก)",
        "contributions": "เรื่องที่{{GENDER:$1|ผู้ใช้}}นี้เขียน",
        "contributions-title": "เรื่องที่เขียนโดย $1",
        "sp-contributions-deleted": "การแก้ไขของผู้ใช้ที่ถูกลบ",
        "sp-contributions-uploads": "อัปโหลด",
        "sp-contributions-logs": "ปูม",
-       "sp-contributions-talk": "à¸\9eูà¸\94à¸\84ุย",
+       "sp-contributions-talk": "คุย",
        "sp-contributions-userrights": "การจัดการสิทธิผู้ใช้",
        "sp-contributions-blocked-notice": "ปัจจุบันผู้ใช้นี้ถูกบล็อก\nปูมการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:",
        "sp-contributions-blocked-notice-anon": "ปัจจุบันเลขที่อยู่ไอพีนี้ถูกบล็อก\nปูมการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:",
        "blocklist-target": "เป้าหมาย",
        "blocklist-expiry": "หมดอายุ",
        "blocklist-by": "ผู้ดูแลระบบที่บล็อก",
-       "blocklist-params": "à¸\9eารามิà¹\80à¸\95อรà¹\8cการบล็อก",
+       "blocklist-params": "à¸\95ัวà¹\81à¸\9bรà¹\80สริมการบล็อก",
        "blocklist-reason": "เหตุผล",
        "ipblocklist-submit": "ค้นหา",
        "ipblocklist-localblock": "การบล็อกในวิกินี้",
        "block-log-flags-nocreate": "ปิดใช้งานการสร้างบัญชี",
        "block-log-flags-noautoblock": "ปิดใช้งานการบล็อกอัตโนมัติ",
        "block-log-flags-noemail": "ปิดใช้งานอีเมล",
-       "block-log-flags-nousertalk": "à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยของตนเอง",
+       "block-log-flags-nousertalk": "à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89ของตนเอง",
        "block-log-flags-angry-autoblock": "การบล็อกอัตโนมัติขั้นสูงเปิดใช้งาน",
        "block-log-flags-hiddenname": "ชื่อผู้ใช้ถูกซ่อน",
        "range_block_disabled": "การบล็อกช่วงไอพีของผู้ดูแลระบบถูกปิดใช้งาน",
        "databasenotlocked": "ฐานข้อมูลไม่ได้ล็อก",
        "lockedbyandtime": "(โดย {{GENDER:$1|$1}} เมื่อวันที่ $2 เวลา $3)",
        "move-page": "ย้าย $1",
-       "move-page-legend": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อ",
+       "move-page-legend": "ยà¹\89ายหà¸\99à¹\89า",
        "movepagetext": "การใช้แบบด้านล่างจะเปลี่ยนชื่อหน้า และย้ายประวัติทั้งหมดไปชื่อใหม่\nชื่อเรื่องเก่าจะกลายเป็นหน้าเปลี่ยนทางไปชื่อเรื่องใหม่\nคุณสามารถปรับการเปลี่ยนทางซึ่งชี้ไปยังชื่อเรื่องเดิมได้อัตโนมัติ\nแต่หากคุณเลือกไม่ทำเช่นนั้น ให้แน่ใจว่าตรวจสอบ[[Special:DoubleRedirects|หน้าเปลี่ยนทางซ้ำซ้อน]]หรือ[[Special:BrokenRedirects|หน้าเปลี่ยนทางเสีย]]\nคุณเป็นผู้รับผิดชอบเพื่อให้แน่ใจว่าลิงก์ต่าง ๆ ยังชี้ไปยังที่ที่สมควร\n\nโปรดทราบว่าหน้าดังกล่าวจะ<strong>ไม่</strong>ถูกย้าย ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่แล้ว เว้นแต่หน้านั้นเป็นหน้าเปลี่ยนทาง และไม่มีประวัติการแก้ไขในอดีต\nซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้ากลับเป็นชื่อเดิมได้หากคุณทำผิดพลาด และคุณไม่สามารถเขียนทับหน้าที่มีอยู่แล้วได้\n\n<strong>คำเตือน!</strong>\nสิ่งนี้อาจเป็นการเปลี่ยนแปลงที่รุนแรงและไม่คาดคิดสำหรับหน้าที่เป็นที่นิยม\nโปรดให้แน่ใจว่าคุณเข้าใจผลลัพธ์นี้ก่อนดำเนินการ",
        "movepagetext-noredirectfixer": "การใช้แบบด้านล่างจะเปลี่ยนชื่อหน้า ซึ่งจะทำให้ประวัติทั้งหมดย้ายไปยังชื่อใหม่\nชื่อเรื่องเก่าจะกลายเป็นหน้าเปลี่ยนทางไปยังชื่อเรื่องใหม่\nให้แน่ใจว่า ตรวจสอบ[[Special:DoubleRedirects|หน้าเปลี่ยนทางซ้ำซ้อน]]หรือ[[Special:BrokenRedirects|หน้าเปลี่ยนทางที่เสีย]]\nคุณจะเป็นผู้รับผิดชอบเพื่อให้แน่ใจว่าลิงก์ต่าง ๆ ยังชี้ไปยังที่ที่สมควร\n\nโปรดทราบว่าหน้าดังกล่าวจะ'''ไม่'''ถูกย้าย ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่อยู่แล้ว เว้นแต่เป็นหน้าว่างหรือหน้าเปลี่ยนทาง และไม่มีประวัติการแก้ไขในอดีต\nซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้ากลับเป็นชื่อเดิมได้หากคุณทำผิดพลาด และคุณไม่สามารถเขียนทับหน้าที่มีอยู่แล้วได้\n\n'''คำเตือน!'''\nสิ่งนี้อาจเป็นการเปลี่ยนแปลงที่รุนแรงและไม่คาดคิดสำหรับหน้าที่เป็นที่นิยม\nโปรดแน่ใจว่าคุณเข้าใจถึงผลลัพธ์นี้ก่อนที่จะดำเนินการต่อไป",
-       "movepagetalktext": "หาà¸\81à¸\84ุà¸\93à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¸\99ีà¹\89 à¸«à¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะà¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¸\95ามà¹\84à¸\9bà¹\82à¸\94ยอัà¸\95à¹\82à¸\99มัà¸\95ิà¹\80วà¹\89à¸\99à¹\81à¸\95à¹\88à¸\9bลายà¸\97าà¸\87มีหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\84มà¹\88วà¹\88าà¸\87à¹\81ลà¹\89ว\n\nà¹\83à¸\99à¸\81รà¸\93ีà¹\80หลà¹\88าà¸\99ีà¹\89 à¸\84ุà¸\93à¸\88ะà¸\95à¹\89อà¸\87ยà¹\89ายหรือรวมหน้าเองหากต้องการ",
+       "movepagetalktext": "หาà¸\81à¸\84ุà¸\93à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¸\99ีà¹\89 à¸«à¸\99à¹\89าà¸\84ุยà¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะà¸\96ูà¸\81ยà¹\89ายà¹\84à¸\9bà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88à¹\82à¸\94ยอัà¸\95à¹\82à¸\99มัà¸\95ิà¹\80วà¹\89à¸\99à¹\81à¸\95à¹\88à¸\9bลายà¸\97าà¸\87มีหà¸\99à¹\89าà¸\84ุยà¹\84มà¹\88วà¹\88าà¸\87à¹\81ลà¹\89ว\n\nà¹\83à¸\99à¸\81รà¸\93ีà¹\80หลà¹\88าà¸\99ีà¹\89 à¸\84ุà¸\93à¸\88ะà¸\95à¹\89อà¸\87ยà¹\89ายหรือà¸\9cสาà¸\99หน้าเองหากต้องการ",
        "moveuserpage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะ<em>ไม่</em>ถูกเปลี่ยนชื่อ",
        "movecategorypage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าหมวดหมู่ โปรดทราบว่า จะย้ายเฉพาะหน้าและทุกหน้าในหมวดหมู่เก่าจะ<em>ไม่</em>ถูกจัดเข้าหมวดหมู่ใหม่",
        "movenologintext": "ถ้าต้องการเปลี่ยนชื่อหน้านี้ ต้องเป็นผู้ใช้ลงทะเบียนและ[[Special:UserLogin|ล็อกอิน]]",
        "namespace-nosubpages": "เนมสเปซ \"$1\" ไม่อนุญาตให้มีหน้าย่อย",
        "newtitle": "ชื่อเรื่องใหม่:",
        "move-watch": "เฝ้าดูหน้าต้นทางและหน้าปลายทาง",
-       "movepagebtn": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อ",
-       "pagemovedsub": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อสำเร็จ",
+       "movepagebtn": "ยà¹\89ายหà¸\99à¹\89า",
+       "pagemovedsub": "ยà¹\89ายสำเร็จ",
        "movepage-moved": "<strong>เปลี่ยนชื่อ \"$1\" เป็น \"$2\" แล้ว</strong>",
        "movepage-moved-redirect": "สร้างหน้าเปลี่ยนทางแล้ว",
        "movepage-moved-noredirect": "การสร้างหน้าเปลี่ยนทางถูกระงับ",
        "articleexists": "หน้าที่ต้องการมีอยู่แล้ว หรือชื่อที่เลือกไม่ถูกต้อง กรุณาเลือกชื่อใหม่",
        "cantmove-titleprotected": "คุณไม่สามารถเปลี่ยนชื่อหน้าเป็นชื่อนี้ได้ เนื่องจากชื่อเรื่องใหม่ถูกป้องกันมิให้สร้าง",
-       "movetalk": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¸\9eูà¸\94คุยที่สัมพันธ์",
+       "movetalk": "ยà¹\89ายหà¸\99à¹\89าคุยที่สัมพันธ์",
        "move-subpages": "ย้ายหน้าย่อยทั้งหมด (มากสุด $1 หน้า)",
-       "move-talk-subpages": "ยà¹\89ายหà¸\99à¹\89ายà¹\88อยà¸\97ัà¹\89à¸\87หมà¸\94à¸\82อà¸\87หà¸\99à¹\89าอภิà¸\9bราย (มากสุด $1 หน้า)",
+       "move-talk-subpages": "ยà¹\89ายหà¸\99à¹\89ายà¹\88อยà¸\97ัà¹\89à¸\87หมà¸\94à¸\82อà¸\87หà¸\99à¹\89าà¸\84ุย (มากสุด $1 หน้า)",
        "movepage-page-exists": "มีหน้า $1 อยู่แล้วและไม่สามารถบันทึกทับอัตโนมัติ",
-       "movepage-page-moved": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหน้า $1 เป็น $2 แล้ว",
+       "movepage-page-moved": "ยà¹\89ายหน้า $1 เป็น $2 แล้ว",
        "movepage-page-unmoved": "ไม่สามารถเปลี่ยนชื่อหน้า $1 เป็น $2",
-       "movepage-max-pages": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89ามาà¸\81สุà¸\94 $1 à¸«à¸\99à¹\89าà¹\81ลà¹\89วà¹\81ละà¸\88ะà¹\84มà¹\88à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหน้าเพิ่มอีกอัตโนมัติ",
+       "movepage-max-pages": "ยà¹\89ายหà¸\99à¹\89ามาà¸\81สุà¸\94 $1 à¸«à¸\99à¹\89าà¹\81ลà¹\89วà¹\81ละà¸\88ะà¹\84มà¹\88ยà¹\89ายหน้าเพิ่มอีกอัตโนมัติ",
        "movelogpage": "ปูมการเปลี่ยนชื่อ",
        "movelogpagetext": "ด้านล่างเป็นรายการการเปลี่ยนชื่อทั้งหมด",
        "movesubpage": "{{PLURAL:$1|หน้าย่อย|หน้าย่อย}}",
        "movesubpagetext": "หน้านี้มีหน้าย่อย $1 หน้า ดังด้านล่าง",
-       "movesubpagetalktext": "หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\97ีà¹\88สัมà¸\9eัà¸\99à¸\98à¹\8cมี $1 à¸«à¸\99à¹\89ายà¹\88อย à¸\94ัà¸\87à¹\81สà¸\94à¸\87à¸\94à¹\89าà¸\99ลà¹\88าà¸\87",
+       "movesubpagetalktext": "หน้าคุยที่สัมพันธ์มี $1 หน้าย่อย ดังแสดงด้านล่าง",
        "movenosubpage": "หน้านี้ไม่มีหน้าย่อย",
        "movereason": "เหตุผล:",
        "revertmove": "ย้อน",
        "export-download": "ส่งออกมาเป็นไฟล์",
        "export-templates": "รวมแม่แบบมาด้วย",
        "export-pagelinks": "จำนวนลำดับของหน้าที่ถูกเชื่อมโยงทั้งหมด:",
-       "allmessages": "à¸\82à¹\89อà¸\84วามของระบบ",
+       "allmessages": "สารของระบบ",
        "allmessagesname": "ชื่อ",
-       "allmessagesdefault": "à¸\82à¹\89อà¸\84วามà¸\95ามà¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99",
+       "allmessagesdefault": "à¸\82à¹\89อà¸\84วามสารà¹\82à¸\94ยà¸\9bริยาย",
        "allmessagescurrent": "ข้อความปัจจุบัน",
        "allmessagestext": "นี่คือรายการข้อความของระบบที่อยู่ในเนมสเปซมีเดียวิกิ\nกรุณาอ่านหน้า[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation เทศวิวัตน์ของมีเดียวิกิ] และ [https://translatewiki.net translatewiki.net] ถ้าคุณอยากที่จะช่วยแปลข้อความของระบบมีเดียวิกิ",
        "allmessagesnotsupportedDB": "หน้านี้ไม่สามารถใช้งานได้เนื่องจาก '''$wgUseDatabaseMessages''' ถูกระงับการใช้งาน",
        "thumbnail-more": "ขยาย",
        "filemissing": "ไฟล์สูญหาย",
        "thumbnail_error": "มีข้อผิดพลาดในการสร้างรูปย่อ: $1",
+       "thumbnail_error_remote": "สารข้อผิดพลาดจาก $1:\n$2",
        "djvu_page_error": "หน้าเดจาวู (DjVu) เกินขนาด",
        "djvu_no_xml": "ไม่สามารถส่งเอกซ์เอ็มแอล (XML) สำหรับไฟล์เดจาวู (DjVu)",
        "thumbnail-dest-create": "ไม่สามารถบันทึกรูปย่อลงในปลายทางได้",
        "javascripttest-qunit-intro": "ดู[$1 เอกสารกำกับการทดสอบ]บน mediawiki.org",
        "tooltip-pt-userpage": "{{GENDER:|หน้าผู้ใช้}}ของคุณ",
        "tooltip-pt-anonuserpage": "หน้าผู้ใช้ของเลขที่อยู่ไอพีที่คุณกำลังใช้แก้ไข",
-       "tooltip-pt-mytalk": "หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุย{{GENDER:|à¸\82อà¸\87à¸\84ุà¸\93}}",
+       "tooltip-pt-mytalk": "หน้าคุย{{GENDER:|ของคุณ}}",
        "tooltip-pt-anontalk": "อภิปรายเกี่ยวกับการแก้ไขจากเลขที่อยู่ไอพีนี้",
        "tooltip-pt-preferences": "การตั้งค่า{{GENDER:|ของคุณ}}",
        "tooltip-pt-watchlist": "รายการหน้าที่คุณกำลังเฝ้าดูการเปลี่ยนแปลง",
        "tooltip-ca-unprotect": "เปลี่ยนการป้องกันหน้านี้",
        "tooltip-ca-delete": "ลบหน้านี้",
        "tooltip-ca-undelete": "กู้คืนการแก้ไขหน้านี้กลับมาเป็นรุ่นก่อนที่ถูกลบ",
-       "tooltip-ca-move": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหน้านี้",
+       "tooltip-ca-move": "ยà¹\89ายหน้านี้",
        "tooltip-ca-watch": "เพิ่มหน้านี้เข้ารายการเฝ้าดู",
        "tooltip-ca-unwatch": "นำหน้านี้ออกจากรายการเฝ้าดู",
        "tooltip-search": "ค้นหา {{SITENAME}}",
        "tooltip-ca-nstab-special": "หน้านี้เป็นหน้าพิเศษ ไม่สามารถแก้ไขได้",
        "tooltip-ca-nstab-project": "ดูหน้าโครงการ",
        "tooltip-ca-nstab-image": "ดูหน้าภาพไฟล์",
-       "tooltip-ca-nstab-mediawiki": "à¸\94ูà¸\82à¹\89อà¸\84วามระบบ",
+       "tooltip-ca-nstab-mediawiki": "à¸\94ูสารระบบ",
        "tooltip-ca-nstab-template": "ดูแม่แบบ",
        "tooltip-ca-nstab-help": "ดูหน้าคำอธิบาย",
        "tooltip-ca-nstab-category": "ดูหน้าหมวดหมู่",
        "tooltip-watchlistedit-raw-submit": "ปรับรายการเฝ้าดู",
        "tooltip-recreate": "สร้างหน้านี้อีกครั้งแม้เคยถูกลบ",
        "tooltip-upload": "เริ่มอัปโหลด",
-       "tooltip-rollback": "\"ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99\" ใช้ย้อนการแก้ไขในหน้านี้ของผู้เขียนคนล่าสุดในคลิกเดียว",
+       "tooltip-rollback": "\"ยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียว\" ใช้ย้อนการแก้ไขในหน้านี้ของผู้เขียนคนล่าสุดในคลิกเดียว",
        "tooltip-undo": "\"การทำกลับ\" ย้อนการแก้ไขนี้และเปิดแบบแก้ไขในภาวะตัวอย่าง เปิดให้เพิ่มเหตุผลในคำอธิบาย",
        "tooltip-preferences-save": "บันทึกการตั้งค่า",
        "tooltip-summary": "ใส่สรุปสั้น ๆ",
        "pageinfo-category-subcats": "จำนวนหมวดหมู่ย่อย",
        "pageinfo-category-files": "จำนวนไฟล์",
        "pageinfo-user-id": "หมายเลขประจำตัวผู้ใช้",
+       "pageinfo-file-hash": "ค่าแฮช",
        "markaspatrolleddiff": "ทำเครื่องหมายว่าตรวจสอบแล้ว",
        "markaspatrolledtext": "ทำเครื่องหมายว่าหน้านี้ถูกตรวจสอบแล้ว",
        "markaspatrolledtext-file": "ทำเครื่องหมายรุ่นไฟล์นี้ว่าตรวจสอบแล้ว",
        "scarytranscludefailed": "[ไม่สามารถดึงแม่แบบมาได้สำหรับ $1]",
        "scarytranscludetoolong": "[ยูอาร์แอลยาวเกินไป]",
        "deletedwhileediting": "<strong>คำเตือน:</strong>  หน้านี้ถูกลบหลังคุณเริ่มแก้ไข!",
-       "confirmrecreate": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89 [[User:$1|$1]] ([[User talk:$1|à¸\9eูà¸\94à¸\84ุย]]) à¸¥à¸\9aหà¸\99à¹\89าà¸\99ีà¹\89หลัà¸\87à¸\84ุà¸\93à¹\80ริà¹\88มà¹\81à¸\81à¹\89à¹\84à¸\82 à¸\94à¹\89วยà¹\80หà¸\95ุà¸\9cลวà¹\88า:\n: <em>$2</em>\nกรุณายืนยันว่า คุณต้องการสร้างหน้านี้ใหม่จริง ๆ",
-       "confirmrecreate-noreason": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89 [[User:$1|$1]] ([[User talk:$1|à¸\9eูà¸\94à¸\84ุย]]) à¸¥à¸\9aหà¸\99à¹\89าà¸\99ีà¹\89หลัà¸\87à¸\84ุà¸\93à¹\80ริà¹\88มà¹\81à¸\81à¹\89à¹\84à¸\82 à¹\82à¸\9bรà¸\94ยืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารสรà¹\89าà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\83หมà¹\88à¸\88ริà¸\87 à¹\86",
+       "confirmrecreate": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89 [[User:$1|$1]] ([[User talk:$1|à¸\84ุย]]) à¸¥à¸\9aหà¸\99à¹\89าà¸\99ีà¹\89หลัà¸\87à¸\84ุà¸\93à¹\80ริà¹\88มà¹\81à¸\81à¹\89à¹\84à¸\82à¸\94à¹\89วยà¹\80หà¸\95ุà¸\9cล:\n: <em>$2</em>\nกรุณายืนยันว่า คุณต้องการสร้างหน้านี้ใหม่จริง ๆ",
+       "confirmrecreate-noreason": "ผู้ใช้ [[User:$1|$1]] ([[User talk:$1|คุย]]) ลบหน้านี้หลังคุณเริ่มแก้ไข โปรดยืนยันว่าคุณต้องการสร้างหน้านี้ใหม่จริง ๆ",
        "recreate": "สร้างใหม่",
        "confirm-purge-title": "ชะล้างหน้านี้",
        "confirm_purge_button": "ตกลง",
        "watchlisttools-view": "ดูการเปลี่ยนแปลงที่เกี่ยวข้อง",
        "watchlisttools-edit": "ดูและแก้ไขรายการเฝ้าดู",
        "watchlisttools-raw": "แก้ไขรายการเฝ้าดูดิบ",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|à¸\9eูà¸\94à¸\84ุย]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|คุย]])",
        "timezone-local": "ท้องถิ่น",
        "duplicate-defaultsort": "<strong>คำเตือน:</strong> หลักเรียงลำดับปริยาย \"$2\" ได้ลบล้างหลักเรียงลำดับปริยาย \"$1\" ที่มีอยู่ก่อนหน้า",
        "version": "รุ่น",
        "tag-mw-blank-description": "การแก้ไขที่ทำหน้าว่าง",
        "tag-mw-replace": "ถูกแทน",
        "tag-mw-replace-description": "การแก้ไขซึ่งลบเนื้อหากว่า 90% ของหน้า",
-       "tag-mw-rollback": "ยà¹\89อà¸\99à¸\81ลัà¸\9a",
-       "tag-mw-rollback-description": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\8bึà¹\88à¸\87ยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\81à¹\88อà¸\99หà¸\99à¹\89าà¹\82à¸\94ยà¹\83à¸\8aà¹\89ลิà¸\87à¸\81à¹\8cยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99",
+       "tag-mw-rollback": "ยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียว",
+       "tag-mw-rollback-description": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\8bึà¹\88à¸\87ยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\81à¹\88อà¸\99หà¸\99à¹\89าà¹\82à¸\94ยà¹\83à¸\8aà¹\89ลิà¸\87à¸\81à¹\8cยà¹\89อà¸\99รวà¸\94à¹\80à¸\94ียว",
        "tag-mw-undo": "ทำกลับ",
        "tag-mw-undo-description": "การแก้ไขที่ทำกลับการแก้ไขก่อนหน้าโดยใช้ลิงก์ทำกลับ",
        "tags-title": "ป้ายระบุ",
        "logentry-block-reblock": "$1 เปลี่ยนการตั้งค่าการบล็อกสำหรับ $3 โดยมีเวลาหมดอายุเมื่อ $5 $6",
        "logentry-suppress-block": "$1 บล็อก $3 โดยมีเวลาหมดอายุเมื่อ $5 $6",
        "logentry-suppress-reblock": "$1 เปลี่ยนการตั้งค่าการบล็อกสำหรับ $3 โดยมีเวลาหมดอายุเมื่อ $5 $6",
-       "logentry-merge-merge": "$1 {{GENDER:$2|รวม}} $3 เข้ากับ $4 (รุ่นถึง $5)",
+       "logentry-merge-merge": "$1 {{GENDER:$2|à¸\9cสาà¸\99}} $3 เข้ากับ $4 (รุ่นถึง $5)",
        "logentry-move-move": "$1 ย้ายหน้า $3 ไปยัง $4",
        "logentry-move-move-noredirect": "$1 ย้ายหน้า $3 ไปยัง $4 โดยไม่สร้างหน้าเปลี่ยนทางตามมา",
        "logentry-move-move_redir": "$1 ย้ายหน้า $3 ไปยัง $4 ทับหน้าเปลี่ยนทาง",
        "feedback-bugornote": "หากคุณได้อธิบายปัญหาทางเทคนิคในรายละเอียดแล้ว โปรด[$1 รายงานจุดบกพร่อง]\nมิฉะนั้น คุณสามารถแบบอย่างง่ายด้านล่าง ความเห็นของคุณจะถูกเพิ่มเข้าสู่ \"[$3 $2]\" ร่วมกับชื่อผู้ใช้ของคุณ",
        "feedback-cancel": "ยกเลิก",
        "feedback-close": "เสร็จสิ้น",
-       "feedback-message": "à¸\82à¹\89อà¸\84วาม:",
+       "feedback-message": "สาร:",
        "feedback-subject": "เรื่อง:",
        "feedback-submit": "ตกลง",
        "feedback-thanks": "ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า \"[$2 $1]\" แล้ว",
        "log-action-filter-rights-rights": "การเปลี่ยนด้วยมือ",
        "log-action-filter-rights-autopromote": "การเปลี่ยนอัตโนมัติ",
        "log-action-filter-suppress-event": "การระงับปูม",
+       "log-action-filter-suppress-revision": "การระงับรุ่นแก้ไข",
+       "log-action-filter-suppress-delete": "การระงับหน้า",
+       "log-action-filter-suppress-block": "การระงับผู้ใช้โดยการบล็อก",
+       "log-action-filter-suppress-reblock": "การระงับผู้ใช้โดยการบล็อกใหม่",
        "log-action-filter-upload-upload": "อัปโหลดใหม่",
        "log-action-filter-upload-overwrite": "อัปโหลดใหม่",
+       "authmanager-authn-not-in-progress": "ไม่อยู่ระหว่างการพิสูจน์ตัวจริงหรือข้อมูลช่วงเวลาสื่อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
+       "authmanager-authn-no-primary": "เอกสารทางการที่ให้ไม่สามารถพิสูจน์ตัวจริงได้",
+       "authmanager-authn-no-local-user": "เอกสารทางการที่ให้ไม่สัมพันธ์กับผู้ใช้ใดในวิกินี้",
+       "authmanager-authn-no-local-user-link": "เอกสารทางการที่ให้ไม่สัมพันธ์กับผู้ใช้ใดในวิกินี้ ล็อกอินอีกทางหนึ่ง หรือสร้างผู้ใช้ใหม่ และคุณจะมีตัวเลือกให้ลิงก์เอกสารทางการก่อนหน้าของคุณไปบัญชีนั้น",
+       "authmanager-authn-autocreate-failed": "การสร้างบัญชีท้องถิ่นอัตโนมัติล้มเหลว: $1",
+       "authmanager-change-not-supported": "ไม่สามารถเปลี่ยนเอกสารทางการที่ให้ได้ เพราะไม่มีความต้องการใช้",
+       "authmanager-create-disabled": "ปิดใช้งานการสร้างบัญชี",
+       "authmanager-create-from-login": "กรุณากรอกเขตข้อมูลเพื่อสร้างบัญชี",
+       "authmanager-create-not-in-progress": "ไม่อยู่ระหว่างการสร้างบัญชีหรือข้อมูลช่วงเวลาสื่อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
+       "authmanager-create-no-primary": "เอกสารทางการที่ให้ไม่สามารถใช้สำหรับการสร้างบัญชีได้",
+       "authmanager-link-no-primary": "เอกสารทางการที่ให้ไม่สามารถใช้สำหรับการเชื่อมโยงบัญชี",
+       "authmanager-link-not-in-progress": "ไม่อยู่ระหว่างการโยงบัญชีหรือข้อมูลช่วงเวลาสื่อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
+       "authmanager-authplugin-setpass-failed-title": "การเปลี่ยนรหัสผ่านล้มเหลว",
+       "authmanager-authplugin-setpass-failed-message": "ปลั๊กอินการพิสูจน์ตัวจริงปฏิเสธการเปลี่ยนรหัสผ่าน",
+       "authmanager-authplugin-create-fail": "ปลั๊กอินการพิสูจน์ตัวจริงปฏิเสธการสร้างบัญชี",
+       "authmanager-authplugin-setpass-denied": "ปลั๊กอินการพิสูจน์ตัวจริงไม่อนุญาตการเปลี่ยนรหัสผ่าน",
+       "authmanager-authplugin-setpass-bad-domain": "โดเมนไม่สมเหตุสมผล",
+       "authmanager-autocreate-noperm": "ไม่อนุญาตการสร้างบัญชีอัตโนมัติ",
+       "authmanager-autocreate-exception": "ปิดใช้งานการสร้างบัญชีอัตโนมัติชั่วคราวเนื่องจากข้อผิดพลาดก่อนหน้านี้",
+       "authmanager-userdoesnotexist": "บัญชีผู้ใช้ \"$1\"ยังไม่ลงทะเบียน",
+       "authmanager-userlogin-remembermypassword-help": "ควรจดจำรหัสผ่านนานเกินความยาวของช่วงเวลาสื่อสารหรือไม่",
+       "authmanager-username-help": "ชื่อผู้ใช้สำหรับการพิสูจน์ตัวจริง",
+       "authmanager-password-help": "รหัสผ่านสำหรับการพิสูจน์ตัวจริง",
+       "authmanager-domain-help": "โดเมนสำหรับการพิสูจน์ตัวจริงภายนอก",
+       "authmanager-retype-help": "รหัสผ่านอีกครั้งเพื่อยืนยัน",
+       "authmanager-email-label": "อีเมล",
+       "authmanager-email-help": "ที่อยู่อีเมล",
+       "authmanager-realname-label": "ชื่อจริง",
+       "authmanager-realname-help": "ชื่อจริงของผู้ใช้",
+       "authmanager-provider-password": "การพิสูจน์ตัวจริงที่อาศัยรหัสผ่าน",
+       "authmanager-provider-password-domain": "การพิสูจน์ตัวจริงที่อาศัยรหัสผ่านและโดเมน",
+       "authmanager-provider-temporarypassword": "รหัสผ่านชั่วคราว",
        "edit-error-short": "ข้อผิดพลาด: $1",
        "edit-error-long": "ข้อผิดพลาด: $1",
        "revid": "รุ่นแก้ไข $1",
index 40d36a6..73e5cd2 100644 (file)
        "newpageletter": "T",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ulanyjy|ulanyjy}} gözegçilik edýär]",
-       "rc_categories": "Kategoriýalar bilen çäklendir (\"|\" bilen aýyr)",
-       "rc_categories_any": "Islendik",
        "newsectionsummary": "/* $1 */ täze bölüm",
        "rc-enhanced-expand": "Jikme-jikligi görkez",
        "rc-enhanced-hide": "Jikme-jiklikleri gizle",
index 2e8b8e9..9d822ad 100644 (file)
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 binabantayang {{PLURAL:$1|tagagamit|mga tagagamit}}]",
-       "rc_categories": "Itakda lang sa mga kaurian (ihiwalay sa pamamagitan ng \"|\")",
-       "rc_categories_any": "Kahit ano",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte}} pagkaraan ng pagbabago",
        "newsectionsummary": "/* $1 */ bagong seksyon",
index 3bed975..02f50c0 100644 (file)
        "minoreditletter": "г",
        "newpageletter": "Т",
        "boteditletter": "б",
-       "rc_categories_any": "Һар гылә",
        "newsectionsummary": "/* $1 */ нујә мывзу",
        "rc-enhanced-expand": "Тәфсилотон нишо дој (JavaScript истифодә бедә)",
        "rc-enhanced-hide": "Тәфсилотон нијо кардеј",
index ed2838b..422b905 100644 (file)
@@ -5,7 +5,8 @@
                        "Tauʻolunga",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Fanjiayi"
                ]
        },
        "tog-underline": "Ngaahi fehokotaki ʻoku laineʻi ʻi lalo:",
        "nstab-template": "Sīpinga",
        "nstab-help": "Tokoni",
        "nstab-category": "Faʻahinga",
+       "mainpage-nstab": "Peesi tali fiefia",
        "nosuchaction": "Hala ha ngāue pehē",
        "nosuchspecialpage": "Hala ha peesi makehe pehē",
        "error": "Halaʻi",
        "showingresults": "ʻOku ʻasi ʻi lalo ʻa e ngaahi fua ʻoku kamata mo e #'''$2''' (aʻu ki he '''$1''').",
        "powersearch-legend": "Kumi lakasi",
        "preferences": "Faʻiteliha",
-       "mypreferences": "faʻiteliha ʻaʻaku",
+       "mypreferences": "Faʻiteliha",
        "prefs-skin": "Kili",
        "skin-preview": "Vakai pē",
        "datedefault": "ʻIkai ha faʻiteliha",
        "rcnotefrom": "ʻOku ʻasi ʻi lalo ʻa e liliu talu mei '''$2''' (aʻu ki he '''$1''').",
        "rclistfrom": "ʻAsi mai ha ngaahi liliu foʻou ʻo kamata mei he $3 $2",
        "rcshowhideminor": "$1 fatu siʻi",
+       "rcshowhideminor-show": "ʻAsi mai",
+       "rcshowhideminor-hide": "Toi",
        "rcshowhidebots": "$1 fatu fakamīsini",
+       "rcshowhidebots-show": "ʻAsi mai",
+       "rcshowhidebots-hide": "Toi",
        "rcshowhideliu": "$1 kau ʻetita ʻoku kau-ki-ai",
+       "rcshowhideliu-show": "ʻAsi mai",
        "rcshowhideanons": "$1 kau ʻetita taʻehingoa",
+       "rcshowhideanons-show": "ʻAsi mai",
+       "rcshowhideanons-hide": "Toi",
        "rcshowhidemine": "$1 fatu ʻaʻaku",
+       "rcshowhidemine-show": "ʻAsi mai",
+       "rcshowhidemine-hide": "Toi",
        "rclinks": "ʻAsi mai ha liliu ʻe $1 lolotonga ha ʻaho ʻe $2 fakamuimui",
        "diff": "kehe",
        "hist": "hisi",
        "minoreditletter": "s",
        "newpageletter": "F",
        "boteditletter": "m",
-       "rc_categories": "Fakangatangata ki he faʻahinga (vaheʻi he \"|\")",
-       "rc_categories_any": "Faʻahinga noa pē",
        "rc-enhanced-expand": "ʻAsi ngaahi ʻeu (fiemaʻu ʻa e ''Javascript'')",
        "rc-enhanced-hide": "Toi ngaahi ʻeu",
        "recentchangeslinked": "Ngaahi liliu fekauʻaki",
        "sp-contributions-deleted": "Ngaahi foaki ʻo ha ʻetita kuo tāmateʻi",
        "sp-contributions-talk": "Alea",
        "whatlinkshere": "Ngaahi fehokotaki ki heni",
+       "whatlinkshere-page": "Peesi:",
        "linkshere": "ʻOku fehokotaki ki heni ʻa e ngaahi peesi:",
        "nolinkshere": "ʻOku ʻikai ha ngaahi kupu fehokotaki ki heni.",
        "isredirect": "Peesi leʻei",
        "siteusers": "Kau ʻetita {{SITENAME}} $1",
        "creditspage": "Peesi fakangeiaʻi",
        "spamprotectionmatch": "Naʻe kamosi ʻemau meʻasivi tohila ʻe he ngaahi mataʻitohi koʻeni: $1",
+       "pageinfo-article-id": "Peesi ID",
+       "pageinfo-toolboxlink": "Peesi information",
        "rcpatroldisabled": "ʻOku fakataʻeʻaʻongaʻi ʻa e leʻo ʻo e ngaahi toki liliu",
        "deletedrevision": "Kuo tāmateʻi he paaki motuʻa $1.",
        "previousdiff": "← Faikehe ki muʻa",
        "watchlisttools-edit": "Sio pea fatu ʻete hokohoko leʻo",
        "watchlisttools-raw": "Fatu ʻa e hokohoko leʻo taʻengaohi",
        "version": "Paaki",
+       "redirect-page": "Peesi ID",
        "specialpages": "Ngaahi peesi makehe",
        "rightsnone": "(hala)",
        "expandtemplates": "Fakalahiange ʻa e ngaahi sīpinga"
index 324ac59..82afb38 100644 (file)
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
-       "rc_categories": "Soim ol senis insait long ol dispela grup tasol (raitim wantaim \"|\" namel long wanwan)",
-       "rc_categories_any": "Olgeta",
        "recentchangeslinked": "Ol senis klostu",
        "recentchangeslinked-feed": "Ol senis klostu",
        "recentchangeslinked-toolbox": "Ol senis klostu",
index d0d8ceb..bf16795 100644 (file)
        "recentchanges-legend-heading": "<strong>Gösterge:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca [[Special:NewPages|yeni sayfalar listesine]] bakınız)",
        "recentchanges-submit": "Göster",
+       "rcfilters-legend-heading": "<strong>Kısaltmalar listesi:</strong>",
        "rcfilters-other-review-tools": "Diğer inceleme araçları",
        "rcfilters-group-results-by-page": "Sayfalandırılmış grup sonuçları",
        "rcfilters-activefilters": "Etkin süzgeçler",
        "rcfilters-advancedfilters": "Gelişmiş süzgeçler",
        "rcfilters-limit-title": "Gösterilecek sonuçlar",
        "rcfilters-limit-and-date-label": "$1 değişiklik, $2",
+       "rcfilters-date-popup-title": "Aranacak zaman dilimi",
        "rcfilters-days-title": "Son günler",
        "rcfilters-hours-title": "Son saatler",
        "rcfilters-days-show-days": "$1 gün",
        "newpageletter": "Y",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 izlenilen {{PLURAL:$1|kullanıcı|kullanıcı}}]",
-       "rc_categories": "Kategorileri sınırla (\"|\" ile ayır)",
-       "rc_categories_any": "Seçilen herhangi bir",
        "rc-change-size-new": "Değişiklikten sonraki boyut: $1 {{PLURAL:$1|bayt|bayt}}",
        "newsectionsummary": "/* $1 */ yeni başlık",
        "rc-enhanced-expand": "Ayrıntıları göster",
index 56b6f9e..fe6c9bf 100644 (file)
        "newpageletter": "Я",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|күзәтүче кулланучы}}]",
-       "rc_categories": "Төркемнәрдән генә («|» бүлүче):",
-       "rc_categories_any": "Сайланганның һәрберсе",
        "rc-change-size-new": "Кертелгән үзгәрешләр белән бергә зурлык: $1 {{PLURAL:$1|байт}}",
        "newsectionsummary": "/* $1 */ яңа бүлек",
        "rc-enhanced-expand": "Ваклыкларны күрсәтү",
index 7bb64cf..91cf0b4 100644 (file)
        "newpageletter": "Y",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|küzätep tora qullanuçı}}]",
-       "rc_categories": "Törkemnärdä genä tora («|» bülüçe)",
-       "rc_categories_any": "Härber",
        "rc-change-size-new": "üzgäreştän soñ $1 {{PLURAL:$1|bayt}}",
        "newsectionsummary": "/* $1 */ yaña bülek",
        "rc-enhanced-expand": "Waqlıqlarnı kürsätü (JavaScript kiräk)",
index a1c22fb..dc4821d 100644 (file)
        "newpageletter": "ⵏ",
        "boteditletter": "ⴱ",
        "unpatrolledletter": "!",
-       "rc_categories_any": "ⵎⴰⵏ",
        "recentchangeslinked-toolbox": "ⵉⴱⴷⴷⴻⵍⵏ ⵖⵓⵔ ⵜⴰⵣⴷⴰⵢⵜ",
        "recentchangeslinked-page": "ⴰⵙⵙⴰⵖ ⵏ ⵜⴰⵙⵏⴰ:",
        "upload": "ⵣⴷⴻⵎ ⴰⵙⴷⴰⵡ",
index 0ac4ddd..706c3a4 100644 (file)
@@ -13,7 +13,8 @@
                        "Macofe",
                        "Matma Rex",
                        "Amire80",
-                       "Uzdil"
+                       "Uzdil",
+                       "چۈشكۈن"
                ]
        },
        "tog-underline": "ئۇلانما ئاستى سىزىقى:",
@@ -49,6 +50,8 @@
        "tog-watchlisthidebots": "كۆزىتىش تىزىملىكىدىن ماشىنا ئادەم تەھرىرلىگەننى يوشۇرۇش",
        "tog-watchlisthideminor": "كۆزىتىش تىزىملىكىدىن ئازراقلا تەھرىرلىگەننى يوشۇرۇش",
        "tog-watchlisthideliu": "كۆزىتىش تىزىملىكىدە تىزىمغا كىرگەن ئىشلەتكۈچىلەرنىڭ تەھرىرىنى يوشۇرۇش",
+       "tog-watchlistreloadautomatically": "بىر سۈزگۈچ قائىدىسى تەييار بولغاندا ، ئاپتوماتىك قايتىدىن يۈكلەش كۆزىتىش جەدۋەل ( JavaScript required) كېرەك",
+       "tog-watchlistunwatchlinks": "كۆزىتىش جەدۋەل مەزمۇنىنى قوشۇش بىۋاسىتە (بىكار قىلىندى ) ( كۆزىتىش ئۇلىنىش ( JavaScript ئاندىن ئىقتىدارلىق كېرەك )",
        "tog-watchlisthideanons": "كۆزەت تىزىملىكىدە ئىمزاسىز ئابونتلارنى يوشۇرۇش",
        "tog-watchlisthidepatrolled": "كۆزىتىش تىزىملىكىدىن كۆزىتىلگەن تەھرىرنى يوشۇرۇش",
        "tog-watchlisthidecategorization": "بەت تۈرىنى يوشۇرۇش",
        "tagline": "ئورنى {{SITENAME}}",
        "help": "ياردەم",
        "search": "ئىزدە",
+       "search-ignored-headings": "# < ! - قويۇڭ ، بۇ ئەسلى ھالىتىنى ساقلاش - - > < > \n# ئىزدەش تەرىپىدىن سەل دەپ ماۋزۇ قويۇلغان . \n# بۇنىڭغا بەت ئۆزگەرتىش ئېلىپ ماۋزۇ بەت يۈزى تەرىپىدىن ئىندېكس تەسىر پەيدا قىلىدۇ . \n# ھاۋا ئارقىلىق تەھرىرلەش ئارقىلىق سىز بەتنى قايتا ئىندېكسلاش . \n# گرامماتىكىلىق تۆۋەندىكىچە : \n# * بارلىق « # » بىلەن باشلانغان قۇر بىر ئىزاھات بېرىش كېرەك . \n# * بارلىق بوش قۇر ھەممىسى سەل قاراشقا بولمىغان تېما . \nپايدىلىنىلغان ماتېرىياللار \nسىرتقى ئۇلاش \nقاراڭ \n# < < ! - قويۇڭ ، بۇ ئەسلى ھالىتىنى ساقلاش - - >",
        "searchbutton": "ئىزدە",
        "go": "يۆتكىلىش",
        "searcharticle": "يۆتكىلىش",
        "jumptonavigation": "يولباشچى",
        "jumptosearch": "ئىزدە",
        "view-pool-error": "كەچۈرۈڭ، نۆۋەتتە مۇلازىمىتىرنىڭ يۈكى ئېشىپ كەتتى.\nبۇ بەتنى بەك كۆپ ئىشلەتكۈچى كۆرۈشنى سىنىغانلىقتىن بولغان.\nبۇ بەتنى قايتا زىيارەت قىلىشتىن ئىلگىرى سەل كۈتۈڭ.\n\n$1",
+       "generic-pool-error": "كەچۈرۈڭ، مۇلازىمەتچى ھازىر نورمىدىن ئاشۇرۇپ ئايلاندۇردى . ھازىر تەكشۈرۈش بۇ بايلىق خېرىدار بەك كۆپ . بۇ بايلىق بۇرۇن قايتا سىناپ زىيارەت قىلغاندا زىيارەت قىلىشقا ، ساقلاپ تۇرۇڭ .",
        "pool-timeout": "قۇلۇپنى ساقلاش ۋاقىت ھالقىدى",
        "pool-queuefull": "قاچا ئۆچرىتى توشتى",
        "pool-errorunknown": "نامەلۇم خاتالىق",
+       "pool-servererror": "بۇ ھېسابلىغۇچ مۇلازىمىتى ئىشلىمەيدۇ ($1)",
        "poolcounter-usage-error": "ئىشلىتىش خاتالىقى: $1",
        "aboutsite": "{{SITENAME}} ھەققىدە",
        "aboutpage": "Project:ھەققىدە",
        "hidetoc": "يوشۇرۇش",
        "collapsible-collapse": "قاتلاش",
        "collapsible-expand": "ياي",
+       "confirmable-confirm": "{{GENDER:$1|سىز}} جەزملەشتۈرەلەمسىز ؟",
        "confirmable-yes": "ھەئە",
        "confirmable-no": "ياق",
        "thisisdeleted": "كۆرسەت ياكى ئەسلىگە كەلتۈر $1 ؟",
        "databaseerror-query": "سوراق: $1",
        "databaseerror-function": "فۇنكىسىيە: $1",
        "databaseerror-error": "خاتا: $1",
+       "transaction-duration-limit-exceeded": "چۈنكى يازغان ۋاقتى  سېكۇنت ( $1 ) ئېشىپ كەتتى چەكلىمىسىگە ئۇچرىمايدۇ ، كۆپ مىقداردا كىسىپ بەرپا قىلىش كېچىكتۈرۈش ئالدىنى ئېلىش ئۈچۈن ، بۇ $2 قېتىمقى بىر تەرەپ قىلىش ئاللىقاچان توختىتىلدى . ئەگەر سىز ھازىر شۇنىڭ بىلەن بىر ۋاقىتتا نۇرغۇن تۈرنى ئۆزگەرتىش ، كىچىك مەشغۇلات ئېلىپ بېرىلدى .",
        "laggedslavemode": "ئاگاھلاندۇرۇش: بەت يېقىنقى يېڭىلاشنى ئۆز ئىچىگە ئالمىغان بولۇشى مۇمكىن.",
        "readonly": "ساندان قۇلۇپلانغان",
        "enterlockreason": "قۇلۇپلىنىش سەۋەبىنى كىرگۈزۈڭ، قايتا ئېچىشنىڭ مۆلچەر ۋاقتىنىمۇ ئۆز ئىچىگە ئالىدۇ",
        "no-null-revision": "\"$1\" بېتى ئۈچۈن يېڭىدىن قۇرۇق ئۆزگەرتىش قىلالمىدى",
        "badtitle": "خاتا ماۋزۇ",
        "badtitletext": "ئىلتىماس قىلىنغان بەتنىڭ ماۋزۇسى ئىناۋەتسىز، مەۋجۇد ئەمەس، تىل ھالقىغان ياكى wiki ئۇلانمىسىدىن ھالقىغان ماۋزۇ خاتالىقى.\nئۇ بىر ياكى بىر قانچە ماۋزۇغا ئىشلەتكىلى بولمايدىغان ھەرپنى ئۆز ئىچىگە ئالغان.",
+       "title-invalid-empty": "ئىلتىماس قىلغان بەت ماۋزۇدىكى بوش ياكى ئىسىم نامى پەقەت ئۆز ئىچىگە ئالىدۇ .",
+       "title-invalid-utf8": "تەلەپ بەت ماۋزۇسى ئۆز ئىچىگە ئالغان بىر كۈچكە ئىگە ئەمەس UTF - 8 .",
+       "title-invalid-interwiki": "ھالقىغان ئۇلىنىش ئىلتىماس قىلغان بەت ۋىكى ماۋزۇسى ئۆز ئىچىگە ئالىدۇ ، ئۇ ماۋزۇنى ئىشلىتىشكە بولمايدۇ .",
+       "title-invalid-talk-namespace": "ئىلتىماس قىلغان بەت مەۋجۇت بولۇپ تۇرالمايدۇ مۇلاھىزە بېتى ماۋزۇ نەقىل كەلتۈردى .",
+       "title-invalid-characters": "تەلەپ بەت ماۋزۇسى ئىناۋەتسىز ھەرپ - بەلگە ئۆز ئىچىگە ئالىدۇ : \"$1\".",
+       "title-invalid-relative": "ماۋزۇ نىسپىي يول بار . مۇناسىۋەتلىك بەت ماۋزۇسى ( \\ ، . . . / ) كۈچكە ئىگە ئەمەس ، ئابونتنىڭ كۆز يۈگۈرتكۈچ دائىم بۇ بەتكە يېتىپ كەلدى .",
+       "title-invalid-magic-tilde": "تەلەپ بەت ماۋزۇسى ئۆز ئىچىگە ئالغان ئىناۋەتسىز ئۈزلۈكسىز دولقۇن (</nowiki>~~~<nowiki>).",
+       "title-invalid-leading-colon": "تەلەپ بەت ماۋزۇسى بېشىدا بىر ئىناۋەتسىز قوش چېكىت ( : ) ئۆز ئىچىگە ئالىدۇ .",
        "perfcached": "تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، شۇڭلاشقا يېڭى بولماسلىقى مۇمكىن. ئەڭ كۆپ بولغاندا غەملەكتىكى {{PLURAL:$1|بىر تۈر|$1 تۈر}} نى ئىشلەتكىلى بولىدۇ.",
        "perfcachedts": "تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، ئاخىرقى يېڭىلانغان ۋاقتى $1. ئەڭ كۆپ بولغاندا غەملەكتىكى {{PLURAL:$1|بىر تۈر|$1 تۈر}} نى ئىشلەتكىلى بولىدۇ.",
        "querypage-no-updates": "نۆۋەتتە مەزكۇر بەتنى يېڭىلاش چەكلەندى.\n\nبۇ جايدىكى سانلىق مەلۇماتنى دەرھال يېڭىلىغىلى بولمايدۇ.",
        "virus-unknownscanner": "نامەلۇم ۋىرۇسخور",
        "logouttext": "'''ھازىر تىزىمدىن چىقتىڭىز.'''\n\nدىققەت، بەزى بەتلەر توركۆرگۈنىڭ غەملىكى تازىلانمىغۇچە يەنىلا سىزنى تىزىمغا كىرگەن ھالەتتە كۆرسىتىشى مۇمكىن.",
        "cannotlogoutnow-title": "ھازىر چېكىنگىلى بولمايدۇ",
+       "cannotlogoutnow-text": "ئىشلەتكەندە $1 دە ئامالسىز چېكىنىپ چىقىش .",
        "welcomeuser": "$1، خۇش كەپسىز!",
        "welcomecreation-msg": "ھېساباتىڭىز قۇرۇلدى.\n\n[[Special:Preferences|{{SITENAME}} تەڭشىكىڭىزنى تەڭشەشنى ئۇنتۇپ قالماڭ]].",
        "yourname": "ئىشلەتكۈچى نامى:",
        "cannotlogin-title": "ھازىر كىرگىلى بولمايدۇ",
        "cannotlogin-text": "كىرگىلى بولمايدۇ.",
        "cannotloginnow-title": "ھازىر كىرگىلى بولمايدۇ",
+       "cannotloginnow-text": "ئىشلەتكەندە $1 دە تىزىمغا ئالدۇرالمايمەن .",
        "cannotcreateaccount-title": "ھېسابات قۇرالمىدى",
+       "cannotcreateaccount-text": "بۇ ۋىكى ئىشلىتىلمىگەن بىۋاسىتە ئىسچوت بەرپا قىلىش .",
        "yourdomainname": "دائىرە نامىڭىز:",
        "password-change-forbidden": "بۇ ۋىكىدىكى پارولنى ئۆزگەرتەلمەيسىز.",
        "externaldberror": "بۇ سانداننى دەلىللەش خاتالىقى ياكى سىرتقى ھېساباتىڭىزنى يېڭىلاشنى چەكلىگەنلىكتىن بولغان بولۇشى مۇمكىن.",
        "userlogin-resetpassword-link": "پارولىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟",
        "userlogin-helplink2": "كىرىشتىن ياردەم",
        "userlogin-loggedin": "سىز ئاللىقاچان {{GENDER:$1|$1}} ھالىتىدە تىزىمغا كىرىپ بولدىڭىز. تۆۋەندىكىلەرنى تولدۇرۇپ باشقا ئىشلەتكۈچى ھالىتىدە تىزىمغا كىرىڭ.",
+       "userlogin-reauth": "سىز چوقۇم يەنە بىر قېتىم سىز تىزىملىتىش ئىسپاتى {{GENDER:$1|$1}}",
        "userlogin-createanother": "باشقا ھېسابات قۇرىمەن",
        "createacct-emailrequired": "ئېلخەت ئادرېسى",
        "createacct-emailoptional": "ئېلخەت ئادرېسى (ئىختىيارى)",
        "createacct-email-ph": "ئېلخەت ئادرېسىڭىزنى كىرگۈزۈڭ",
        "createacct-another-email-ph": "ئېلخەت ئادرېسى كىرگۈزۈڭ",
        "createaccountmail": "ۋاقىتلىق ئىختىيارىي پارولنى ئىشلەت ھەمدە بەلگىلەنگەن ئېلېكتىرونلۇق خەت ئادرېسىغا ئەۋەت",
+       "createaccountmail-help": "يەنە بىر ئادەم تەرىپىدىن ئىشلىتىلىدۇ بەرپا قىلىش ھېسابى خەۋەر تاپقاندىن كېيىن ، مەخپىي نومۇرنىڭ ھاجىتى يوق .",
        "createacct-realname": "ھەقىقى ئىسمىڭىز (ئىختىيارى)",
        "createacct-reason": "سەۋەبى",
        "createacct-reason-ph": "نېمىشقا باشقا ھېسابات قۇرماقچى بولدىڭىز",
        "createacct-benefit-body2": "{{PLURAL:$1|بەت}}",
        "createacct-benefit-body3": "يېقىنقى {{PLURAL:$1|تۆھپىكار|تۆھپىكارلار}}",
        "badretype": "سىز كىرگۈزگەن پارول ماس كەلمىدى.",
+       "usernameinprogress": "بۇ ئابونت نامى ئاللىقاچان ئېلىپ بېرىلماقتا ئىسچوت بەرپا قىلىش . بىر دەم ساقلاڭ .",
        "userexists": "كىرگۈزگەن ئىشلەتكۈچى ئاتى ئىشلىتىلىۋاتىدۇ.\nباشقا ئاتنى تاللاڭ.",
        "loginerror": "تىزىمغا كىرىش خاتالىقى",
        "createacct-error": "ھېسابات قۇرۇش خاتالىقى",
        "nocookieslogin": "{{SITENAME}} تور بېكىتى تىزىمغا كىرگەن ئىشلەتكۈچىلەرگە cookies ئىشلىتىدۇ .\n\nسىز cookies نى چەكلىگەن.\n\nئۇنى قوزغىتىپ قايتا سىناڭ.",
        "nocookiesfornew": "ئىشلەتكۈچى ھېساباتى قۇرۇلمىدى، ئۇنىڭ مەنبەسىنى جەزملىيەلمەيمىز.\ncookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتنى قايتا يۈكلەپ ئاندىن قايتا سىناڭ.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "ھېساب قۇرۇش مۇۋەپپەقىيەتلىك بولدى ، لېكىن سىز ئاپتوماتىك چىقىدۇ . داۋاملىق [ [Special:userLogin|manual login : قول بىلەن تىزىملىتىش [ گە قاراڭ]] .",
        "noname": "سىز تېخى ئىناۋەتلىك ئىشلەتكۈچى نامىنى بەلگىلىمىدىڭىز.",
        "loginsuccesstitle": "تىزىمغا كىردىڭىز",
        "loginsuccess": "'''سىز {{SITENAME}} غا \"$1\" سالاھىيىتىدە كىردىڭىز.'''",
        "wrongpassword": "كىرگۈزگەن پارول خاتا.\nقايتا سىناڭ.",
        "wrongpasswordempty": "پارول كىرگۈزمىدىڭىز\nقايتا سىناڭ.",
        "passwordtooshort": "ئىم ئاز دېگەندە {{PLURAL:$1|1 ھەرپ|$1 ھەرپ}} بولۇشى لازىم.",
+       "passwordtoopopular": "ئومۇمىي تاللاش مەخپىي نومۇر ئىشلىتىشكە بولمايدۇ . تېخىمۇ تەڭداشسىز بولغان مەخپىي نومۇر تاللاڭ .",
        "password-name-match": "پارولىڭىز ئىشلەتكۈچى نامىڭىزدىن پەرقلىنىشى لازىم.",
        "password-login-forbidden": "بۇ ئىشلەتكۈچى نامى ۋە پارول چەكلەنگەن.",
        "mailmypassword": "پارولنى ئەسلىگە قايتۇرماق",
        "createaccount-text": "بەزىلەر {{SITENAME}} دا ئېلخەت ئادرېسىڭىزنى ئىشلىتىپ، \"$2\" نامىدىكى ($4) يېڭى ھېسابات قۇردى، پارول \"$3\".\nسىز تىزىمغا كىرىپ پارولنى ئۆزگەرتىڭ.\n\nئەگەر بۇ ھېسابات خاتا قۇرۇلغان بولسا بۇ ئۇچۇرغا پەرۋا قىلماڭ.",
        "login-throttled": "سىز بۇ ھېساباتتا تىزىمغا كىرىشنى كۆپ قېتىم سىنىدىڭىز.\n$1 ساقلاپ، ئاندىن قايتا سىناڭ.",
        "login-abort-generic": "تىزىمغا كىرەلمىدىڭىز - چېكىندى",
+       "login-migrated-generic": "سىزنىڭ ھېسابات نومۇرىڭىز ئاللىبۇرۇن يۆتكەلدى ، ھەمدە سىزنىڭ ئابونت ۋىكى نامىڭىزنى بۇ يەردە مەۋجۇت ئەمەس .",
        "loginlanguagelabel": "تىل: $1",
        "suspicious-userlogout": "تىزىمدىن چىقىش ئىلتىماسىڭىز رەت قىلىندى، چۈنكى ئۇ بەلكىم بۇزۇلغان توركۆرگۈ ياكى غەملەك ۋاكالەتچىسى يوللىغان بولۇشى مۇمكىن.",
        "createacct-another-realname-tip": "ھەقىقىي ئىسمىڭىز ئىختىيارى.\nئەگەر تەمىنلەشنى تاللىسىڭىز، ئۇ سىزنىڭ تۆھپىڭىزنىڭ ئىمزاسى بولىدۇ.",
        "changepassword-success": "پارولىڭىز ئوڭۇشلۇق ئۆزگەرتىلدى!",
        "changepassword-throttled": "سىز بۇ ھېساباتتا تىزىمغا كىرىشنى كۆپ قېتىم سىنىدىڭىز.\n$1 ساقلاپ، ئاندىن قايتا سىناڭ.",
        "botpasswords": "ماشىنا ئادەم پارولى",
+       "botpasswords-summary": "<em> ماشىنا ئادەم مەخپىي نومۇرى </em> يول ئىشلەتكەن ھېساب ئاساسلىق تىزىملاش ئىسپاتى بولمىغان ئەھۋال ئاستىدا ، API ئارقىلىق زىيارەت قىلىنىدىغان ئابونت سچوتى . مەخپى نۇمۇرنى تىزىمغا ئالدۇرغان ۋاقىتتا ئىشلەتكىلى بولىدىغان ماشىنا ئارقىلىق ئابونت ھوقۇق دائىرىسى چەكلەنگەن بولىدۇ . \n\nبىلمەيمەن نېمىشقا بۇنداق ئەھۋال ئاستىدا ، سىز بۇ ئىقتىدارنى ئىشلەتكەن . ھەرقانداق ئادەم بۇ مەخپىي نومۇر ھاسىل قىلىش ھەمدە ئۇلار سىزگە كېرەك ئىدى .",
        "botpasswords-disabled": "ماشىنا ئادەم پارولى چەكلەنگەن.",
+       "botpasswords-no-central-id": "ماشىنا ئادەم مەخپىي نومۇر ئىشلىتىش كېرەك ، سىز چوقۇم ئابونت كىرىش ئاللىقاچان مەركەزلەشكەن .",
        "botpasswords-existing": "نۆۋەتتە بار ماشىنا ئادەم پارولى",
        "botpasswords-createnew": "يېڭى ماشىنا ئادەم پارولى قۇرۇش",
+       "botpasswords-editexisting": "تەھرىرلەش ھازىرقى ماشىنا ئادەم مەخپىي نومۇرى",
        "botpasswords-label-appid": "ماشىنا ئادەم نامى:",
        "botpasswords-label-create": "قۇرۇش",
        "botpasswords-label-update": "يېڭىلاش",
        "boteditletter": "ماشىنا ئادەم",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1  {{PLURAL:$1|ئىشلەتكۈچى|ئىشلەتكۈچى}}كۆزىتىۋاتىدۇ]",
-       "rc_categories": "تۈر چېگرىسى (\"|\" بىلەن ئايرىلىدۇ )",
-       "rc_categories_any": "خالىغانچە تاللاش",
        "rc-change-size": "$1",
        "rc-change-size-new": "ئۆزگەرتكەندىن كېيىن $1 {{PLURAL:$1|بايت}}",
        "newsectionsummary": "* $1 * يېڭى ئابزاس",
index d40a8d8..81c211f 100644 (file)
        "databaseerror-function": "Функція: $1",
        "databaseerror-error": "Помилка: $1",
        "transaction-duration-limit-exceeded": "Щоб уникнути великого лагу при реплікації, ця транзакція була перервана, оскільки тривалість запису ($1) перевищила обмеження в $2 {{PLURAL:$2|секунду|секунд|секунди}}.\n\nЯкщо ви змінюєте декілька елементів за один раз, постарайтесь замість цього зробити декілька невеликих операцій.",
-       "laggedslavemode": "Увага: сторінка може не містити останніх редагувань.",
+       "laggedslavemode": "<strong>Увага:</strong> сторінка може не містити останніх редагувань.",
        "readonly": "Запис до бази даних заблокований",
        "enterlockreason": "Зазначте причину і приблизний термін блокування",
        "readonlytext": "Додавання нових статей та інші зміни бази даних у даний момент заблоковані: ймовірно, через планове сервісне обслуговування бази даних, після закінчення якого буде відновлено нормальний стан.\n\nАдміністратор, що заблокував базу, дав таке пояснення: $1",
        "postedit-confirmation-created": "Створено сторінку.",
        "postedit-confirmation-restored": "Сторінка була відновлена.",
        "postedit-confirmation-saved": "Ваше редагування збережено",
+       "postedit-confirmation-published": "Ваше редагування опубліковано.",
        "edit-already-exists": "Неможливо створити нову сторінку.\nВона вже існує.",
        "defaultmessagetext": "Стандартний текст повідомлення",
        "content-failed-to-parse": "Не вдалось ідентифікувати $2 як тип $1 через: $3",
        "boteditletter": "б",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|користувач спостерігає|користувачі спостерігають|користувачів спостерігають}}]",
-       "rc_categories": "Тільки з категорій (розділювач «|»):",
-       "rc_categories_any": "Будь-яка з обраних",
        "rc-change-size": "$1",
        "rc-change-size-new": "Розмір після зміни: $1 {{PLURAL:$1|байт|байти|байтів}}",
        "newsectionsummary": "/* $1 */ нова тема",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обговорення]])",
        "timezone-utc": "UTC",
        "timezone-local": "Місцеві",
-       "duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».",
+       "duplicate-defaultsort": "{{#if:{{REVISIONID}}|<span class=\"t-test test\" style=\"display:none;>|\n}}<strong>Увага!</strong> Ключ сортування «$2» перекриває попередній ключ сортування «$1».{{\n#if:{{REVISIONID}}|</span>}}",
        "duplicate-displaytitle": "<strong>Увага:</strong> Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".",
        "restricted-displaytitle": "<strong>Увага:</strong> Відображувану назву «$1» було проігноровано, оскільки вона не відповідає чинній назві сторінки.",
        "invalid-indicator-name": "<strong>Помилка:</strong> Сторінка індикатора стану <code>name</code> атрибута не може бути пуста.",
index a676422..e33c545 100644 (file)
        "postedit-confirmation-created": "صفحہ تخلیق کر دیا گیا۔",
        "postedit-confirmation-restored": "صفحہ بحال کر دیا گیا۔",
        "postedit-confirmation-saved": "آپ کی ترمیم محفوظ ہوگئی۔",
+       "postedit-confirmation-published": "آپ کی ترمیم شائع کر دی گئی تھی۔",
        "edit-already-exists": "نیا صفحہ تخلیق نہیں کیا جاسکتا.\nیہ پہلے سے موجود ہے.",
        "defaultmessagetext": "طے شدہ پیغام کا متن",
        "content-failed-to-parse": "ماڈل $1 کے $2 مواد کے تجزیہ میں ناکامی: $3",
        "newpageletter": "نیا ..",
        "boteditletter": " خودکار",
        "number_of_watching_users_pageview": "[$1 مشاہد {{PLURAL:$1|صارف|صارفین}}]",
-       "rc_categories": "ان زمروں تک محدود رکھیں («|» سے علاحدہ کریں):",
-       "rc_categories_any": "کوئی بھی منتخب",
        "rc-change-size-new": "تبدیلی کے بعد $1 {{PLURAL:$1|بائٹ}}",
        "newsectionsummary": "/* $1 */ نیا قطعہ",
        "rc-enhanced-expand": "تفصیلات دکھائیں",
        "uploaded-script-svg": "اپلوڈ کردہ SVG فائل میں scriptable عنصر \"$1\" ملا۔",
        "uploaded-hostile-svg": "اپلوڈ کردہ ایس وی جی فائل کے اسٹائل عنصر میں غیر محفوظ سی ایس ایس دریافت ہوئی ہے۔",
        "uploaded-event-handler-on-svg": "ایونٹ ہینڈلر صفات <code> $1 = \"$2\" </code> کو ترتیب دینے کی اجازت نہیں ہے کہ SVG فائلوں میں.",
+       "uploaded-href-unsafe-target-svg": "اپلوڈ کردہ ایس‌وی‌جی فائل میں غیر محفوظ href ملا، <code>&lt;$1 $2=\"$3\"&gt;</code>",
        "uploaded-setting-href-svg": "والدین \"عنصر\" ٹیگ کا استعمال کرتے ہوئے \"href\" شامل کرنے کے لئے والدین عنصر کو منسوب کیا جاتا ہے.",
        "uploadscriptednamespace": "اس ایس وی جی فائل میں غیر قانونی نام فضا \"<nowiki>$1</nowiki>\" موجود ہے۔",
        "uploadinvalidxml": "اپلوڈ کردہ فائل میں موجود ایکس ایم ایل کا تجزیہ نہیں کیا جا سکا۔",
        "uploadstash-bad-path-unknown-type": "نامعلوم قسم \"$1\"",
        "uploadstash-bad-path-unrecognized-thumb-name": "غیر معروف نام تصغیر",
        "uploadstash-file-not-found": "اسکرین میں کلیدی \"$1\" نہیں مل سکا.",
+       "uploadstash-file-not-found-no-thumb": "تصغیر حاصل نہیں کیا جا سکا۔",
+       "uploadstash-file-not-found-no-local-path": "تصغیر شدہ آئٹم کے لیے کوئی مقامی پاتھ موجود نہیں۔",
        "uploadstash-file-not-found-missing-content-type": "لاپتہ مواد کی قسم ہیڈر.",
+       "uploadstash-file-not-found-not-exists": "کوئی پاتھ یا سادہ فائل نہیں ملی۔",
+       "uploadstash-file-too-large": "$1 بائٹ سے بڑی فائل نہیں دکھائی جا سکتی ہے۔",
+       "uploadstash-not-logged-in": "کوئی بھی صارف لاگ ان نہیں ہے، فائلیں صارفین سے متعلق ہونی چاہئیں۔",
+       "uploadstash-wrong-owner": "یہ فائل ($1) اس صارف سے متعلق نہیں ہے۔",
+       "uploadstash-no-such-key": "ایسی کسی کلید ($1) کو حذف نہیں کیا جا سکتا۔",
        "uploadstash-no-extension": "توسیع نہیں ہے۔",
        "uploadstash-zero-length": "فائل کا طول صفر ہے۔",
        "invalid-chunk-offset": "آفسیٹ کا قطعہ نادرست ہے",
        "apisandbox-loading-results": "اے پی آئی کے نتائج موصول ہو رہے ہیں۔۔۔",
        "apisandbox-results-error": "اے پی آئی کوئری کا جواب لوڈ ہونے کے دوران میں نقص واقع ہوا: $1",
        "apisandbox-request-selectformat-label": "درخواست کے اعداد و شمار کے طور پر دکھائیں:",
+       "apisandbox-request-format-url-label": "یوآرایل کوئیری اسٹرنگ",
        "apisandbox-request-url-label": "درخواست کا ربط:",
        "apisandbox-request-json-label": "JSON درخواست:",
        "apisandbox-request-time": "درخواست کا وقت: {{PLURAL:$1|$1 ملی سیکنڈ}}",
        "import-mapping-namespace": "کسی نام فضا میں درآمد کریں:",
        "import-mapping-subpage": "درج ذیل صفحہ کے ذیلی صفحات کے طور پر درآمد کریں:",
        "import-upload-filename": "فائل کا نام:",
+       "import-upload-username-prefix": "بین الویکی سابقہ:",
        "import-comment": "تبصرہ:",
        "importtext": "براہ کرم [[Special:Export|برآمد کی سہولت]] کے ذریعہ اصل ویکی سے فائل برآمد کریں۔\nاور اسے اپنے کمپیوٹر میں محفوظ کرکے یہاں اپلوڈ کریں۔",
        "importstart": "صفحات درآمد کیے جا رہے ہیں۔۔۔",
        "imported-log-entries": "درآمد کردہ $1 {{PLURAL:$1|اندراج نوشتہ|اندراجات نوشتہ}}۔",
        "importfailed": "درآمد ناکام: <nowiki>$1</nowiki>",
        "importunknownsource": "درآمد کے ماخذ کی نوعیت نامعلوم ہے",
+       "importnoprefix": "کوئی بین الویکی سابقہ فراہم نہیں کیا گیا",
        "importcantopen": "درآمد فائل کھل نہیں سکی",
        "importbadinterwiki": "غلط بین الویکی ربط",
        "importsuccess": "درآمد مکمل!",
        "pageinfo-category-subcats": "تعداد ذیلی زمرہ جات",
        "pageinfo-category-files": "فائلوں کی تعداد",
        "pageinfo-user-id": "صارف آئی ڈی",
+       "pageinfo-file-hash": "ہیش قدر",
        "markaspatrolleddiff": "بطور مراجعت شدہ نشان زد کریں",
        "markaspatrolledtext": "اس صفحہ کو بطور مراجعت شدہ نشان زد کریں",
        "markaspatrolledtext-file": "فائل کے اس نسخے کو مراجعت شدہ نشان زد کریں",
        "newimages-hidepatrolled": "مراجعت شدہ اپلوڈ چھپائیں",
        "newimages-mediatype": "میڈیا قسم:",
        "noimages": "دیکھنے کیلئے کچھ نہیں ہے۔",
+       "gallery-slideshow-toggle": "تصغیر شدہ تصویروں کو فعال یا غیر فعال کریں",
        "ilsubmit": "تلاش",
        "bydate": "بلحاظ تاریخ",
        "sp-newimages-showfrom": "$2، $1 کے بعد اپلوڈ کی جانے والی فائلیں دکھائیں",
        "watchlistedit-clear-titles": "عناوین:",
        "watchlistedit-clear-submit": "زیرنظر فہرست صاف کریں (یہ دائمی ہے!)",
        "watchlistedit-clear-done": "آپ کی زیرنظر فہرست صاف ہو چکی ہے۔",
+       "watchlistedit-clear-jobqueue": "آپ کی زیر نظر فہرست کی صفائی جاری ہے۔ اسے مکمل ہونے میں کچھ وقت لگ سکتا ہے!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 عنوان حذف کیا گیا|$1 عناوین حذف کیے گئے}}:",
        "watchlistedit-too-many": "نمائش کے لیے صفحات کی تعداد بہت زیادہ ہے۔",
        "watchlisttools-clear": "زیرنظر فہرست کی صفائی",
        "tag-mw-contentmodelchange": "مواد کے ماڈل میں تبدیلی",
        "tag-mw-contentmodelchange-description": "ترامیم جو صفحہ کے [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel مواد کے ماڈل کو تبدیل کرتی ہیں]",
        "tag-mw-new-redirect": "نیا رجوع مکرر",
+       "tag-mw-new-redirect-description": "ترامیم جو ایک نیا رجوع مکرر بناتی ہیں یا صفحہ کو رجوع مکرر کر دیتی ہیں",
        "tag-mw-removed-redirect": "رجوع مکرر ہٹایا",
+       "tag-mw-removed-redirect-description": "ترامیم جو کسی موجودہ رجوع مکرر کو غیر رجوع مکرر ميں بدل دیتی ہیں",
        "tag-mw-changed-redirect-target": "ہدف رجوع مکرر کی تبدیلی",
+       "tag-mw-changed-redirect-target-description": "ترامیم جو ایک رجوع مکرر کے ہدف کو بدل یتی ہیں",
        "tag-mw-blank": "صفحہ سے تمام مواد حذف",
+       "tag-mw-blank-description": "ترامیم جو صفحہ کو خالی کرتی ہیں",
        "tag-mw-replace": "مواد کی تبدیلی",
+       "tag-mw-replace-description": "ترامیم جو ایک صفحہ سے 90% مواد حذف کرتی ہیں",
        "tag-mw-rollback": "استرجع",
+       "tag-mw-rollback-description": "ترامیم جو استرجع ربط استعمال کرتے ہوئے پچھلی ترامیم استرجع کرتی ہیں",
        "tag-mw-undo": "رد ترمیم",
+       "tag-mw-undo-description": "ترامیم جو رد ترمیم ربط استعمال کرتے ہوئے پچھلی ترامیم رد کرتی ہیں",
        "tags-title": "ٹیگ",
        "tags-intro": "اس صفحہ میں ان تمام ٹیگوں کی فہرست درج ہے، جنہیں سافٹ ویئر کسی ترمیم پر مفہوم کے ساتھ نشان زد کرتا ہے۔",
        "tags-tag": "ٹیگ کا نام",
        "logentry-move-move": "$1 نے صفحہ $3 کو $4 کی جانب منتقل کیا",
        "logentry-move-move-noredirect": "$1 نے صفحہ $3 کو $4 کی جانب بدون رجوع مکرر {{GENDER:$2|منتقل کیا}}",
        "logentry-move-move_redir": "$1 نے رجوع مکرر ہٹا کر صفحہ $3 کو $4 کی جانب {{GENDER:$2|منتقل کیا}}",
-       "logentry-move-move_redir-noredirect": "$1 نے صفحہ $3 کو رجوع مکرر چھوڑے بغیر $4 کی جانب جو رجوع مکر تھا {{GENDER:$2|منتقل کیا}}",
+       "logentry-move-move_redir-noredirect": "$1 نے صفحہ $3 کو رجوع مکرر چھوڑے بغیر $4 کی جانب جو رجوع مکرر تھا {{GENDER:$2|منتقل کیا}}",
        "logentry-patrol-patrol": "$1 نے صفحہ $3 کے نسخہ $4 کو مراجعت شدہ {{GENDER:$2|نشان زد کیا}}",
        "logentry-patrol-patrol-auto": "$1 نے صفحہ $3 کے نسخہ $4 کو خودکار طور پر مراجعت شدہ {{GENDER:$2|نشان زد کیا}}",
        "logentry-newusers-newusers": "صارف کھاتہ $1 {{GENDER:$2|تخلیق ہو چکا ہے}}",
        "restrictionsfield-badip": "آئی پی پتا یا رینج نادرست ہے: $1",
        "restrictionsfield-label": "آئی پی کی اجازت یافتہ رینج:",
        "restrictionsfield-help": "فی سطر ایک آئی پی پتا یا سی آئی ڈی آر رینج۔ تمام کو فعال کرنے کے لیے <br><code>0.0.0.0/0</code><br><code>::/0</code> استعمال کریں",
+       "edit-error-short": "خطا: $1",
+       "edit-error-long": "خطائیں:\n\n$1",
        "revid": "نسخہ $1",
        "pageid": "صفحہ کا شناختی نمبر $1",
        "rawhtml-notallowed": "\n&lt;html&gt; ٹیگ عام صفحات کے باہر استعمال نہیں کیا جا سکتا۔",
index 4c45461..b4b772b 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[osservà da {{PLURAL:$1|un utente|$1 utenti}}]",
-       "rc_categories": "Limita a le categorie (separà da \"|\")",
-       "rc_categories_any": "Qualsiasi",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte}} dopo ła modifega",
        "newsectionsummary": "/* $1 */ sezion nova",
        "rc-enhanced-expand": "Mostra detaji",
index 33e5953..61c6728 100644 (file)
        "newpageletter": "U",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|kaclii kävutai|kaclijad kävutajad}}]",
-       "rc_categories": "Vaiše kategorijoišpäi (erigoitkat znamaižel \"|\")",
-       "rc_categories_any": "Eraz",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|bait|baitad}} jäl'ges toižetamišt",
        "newsectionsummary": "/* $1 */ uz' jaguz",
index ab931ff..84c0a47 100644 (file)
        "newpageletter": "M",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 người đang xem]",
-       "rc_categories": "Hạn chế theo thể loại (phân cách bằng “|”):",
-       "rc_categories_any": "Bất kỳ được chọn",
        "rc-change-size-new": "$1 byte sau thay đổi",
        "newsectionsummary": "Đề mục mới: /* $1 */",
        "rc-enhanced-expand": "Xem chi tiết",
        "recentchangeslinked-feed": "Thay đổi liên quan",
        "recentchangeslinked-toolbox": "Thay đổi liên quan",
        "recentchangeslinked-title": "Thay đổi liên quan tới “$1”",
-       "recentchangeslinked-summary": "Đây là danh sách các thay đổi được thực hiện gần đây tại những trang được liên kết đến từ một trang nào đó (hoặc tại các trang thuộc một thể loại nào đó).\nCác trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tô đậm'''.",
+       "recentchangeslinked-summary": "Nhập tên trang để xem các thay đổi được thực hiện tại những trang được liên kết với trang đó. (Để xem các trang được xếp vào một thể loại nào đó, nhập Thể loại:Tên thể loại). Các thay đổi được thực hiện tại trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tô đậm'''.",
        "recentchangeslinked-page": "Tên trang:",
        "recentchangeslinked-to": "Hiện thay đổi tại những trang có liên kết đến trang này thay thế",
        "recentchanges-page-added-to-category": "[[:$1]] được xếp vào thể loại",
index 0162941..478a77f 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|geban|gebans}} galädöl $1]",
-       "rc_categories": "Te klads fovik (ditolös me el \"|\")",
-       "rc_categories_any": "Alseimik",
        "rc-change-size-new": "{{PLURAL:$1|jölät|jöläts}} $1 po votükam",
        "newsectionsummary": "/* $1 */ diläd nulik",
        "rc-enhanced-expand": "Jonön patis",
index d77bff2..5caa187 100644 (file)
        "newpageletter": "V",
        "boteditletter": "rb",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 perräkaejat|üts perräkaeja}}]",
-       "rc_categories": "Õnnõ katõgoorijist (eräldedäs märgiga \"|\")",
-       "rc_categories_any": "Miä taht",
        "rc-change-size-new": "$1 {{PLURAL:$1|bait|baiti}} peräst muutmist",
        "rc-enhanced-expand": "Näütäq ütsikasjo",
        "rc-enhanced-hide": "Käkiq ütsikas'aq ärq",
index 3b13ff3..c84e1e2 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[shuvou pa $1 {{PLURAL:$1|uzeu|uzeus}}]",
-       "rc_categories": "Limiter åzès categoreyes (separer avou des «|»)",
-       "rc_categories_any": "Totes",
        "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après l' candjmint",
        "newsectionsummary": "/* $1 */ novele seccion",
        "rc-enhanced-expand": "Mostrer les detays",
index 36e66ea..9c35d91 100644 (file)
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 nagbabatay hin {{PLURAL:$1|gumaramit|mga gumaramit}}]",
-       "rc_categories_any": "Bisan ano nga pinili",
        "rc-change-size-new": "$1 {{PLURAL:$1|nga byte|nga mga byte}} kahuman han pagbag-o",
        "newsectionsummary": "/* $1 */ bag-o nga bahin",
        "rc-enhanced-expand": "Igpakita an detalye",
        "statistics-edits-average": "Average nga mga pagliwat kada pakli",
        "statistics-users": "Mga [[Special:ListUsers|gumaramit]] nga nakarehistro",
        "statistics-users-active": "Mga gumaramit nga nanggigios",
-       "statistics-users-active-desc": "Mga gumaramit nga may-ada iginbuhat ha urhi nga {{PLURAL:$1|ka adlaw|$1 ka mga adlaw}}",
+       "statistics-users-active-desc": "Mga gumaramit nga mayda ginbuhat ha naglabay {{PLURAL:$1|ka adlaw|$1 ka mga adlaw}}",
        "pageswithprop-prop": "Ngaran han propyudad:",
        "pageswithprop-submit": "Kadto-a",
        "doubleredirects": "Mga doble nga redirekta",
index 5f96e7e..a82560f 100644 (file)
@@ -8,7 +8,8 @@
                        "SF-Language",
                        "Urhixidur",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Fanjiayi"
                ]
        },
        "tog-underline": "Rëddaatu lëkkalekaay yi :",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|jëfandikukat moo koy topp|$1 jëfandikukat ñoo koy topp}}]",
-       "rc_categories": "Digalub wàll yi (xaajale leen ak « \"|\" »)",
-       "rc_categories_any": "Yépp",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ginnaaw coppite gi",
        "newsectionsummary": "/* $1 */ xaaj bu bees",
        "contributions": "Cëruy bii {{GENDER:$1|jëfandikukat}}",
        "contributions-title": "Cëru yu jëfandikukat bii di $1",
        "mycontris": "Cëru",
+       "anoncontribs": "Cëru",
        "contribsub2": "Ngir $1 ($2)",
        "nocontribs": "Amul benn coppite bu melokaanoo nii bu ñu gis.",
        "uctop": "(bi mujj)",
        "spam_blanking": "Setal nañ wecc sumb yi amoon lëkkalekaay buy jëme $1",
        "simpleantispam-label": "Caytu lànk-spam.\n<strong>Bu</strong> fi yokk lenn!",
        "pageinfo-toolboxlink": "Xibaar ci xët wi",
+       "pageinfo-contentpage-yes": "Waaw",
        "previousdiff": "← Coppite yi gën a yàgg",
        "nextdiff": "Coppite yi mujj →",
        "file-info": "Réyaayu file bi : $1, type MIME : $2",
index 5aeadb0..eda5374 100644 (file)
        "newpageletter": "ახ.",
        "boteditletter": "ბ",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|მომხმარებლის|მომხმარებლის}} კონტროლი]",
-       "rc_categories": "ხვალო კატეგორიეფშე (გეგშართით \"|\"-იშ მეჯინათ)",
-       "rc_categories_any": "არძონერი",
        "rc-change-size-new": "ზჷმა თირუაშ უკული რე: {{PLURAL:$1|ბაიტი|ბაიტი}}",
        "newsectionsummary": "/* $1 */ ახალი სექცია",
        "rc-enhanced-expand": "დეტალების  ჩვენება",
index c4c61e2..d0d7069 100644 (file)
        "newpageletter": "נ",
        "boteditletter": "ב",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|איין באַניצער פאַסט|$1 באַניצערס פאַסן}} אויף]",
-       "rc_categories": "גרענעץ פֿאַר קאַטעגאריעס (אָפשיידן מיט \"|\")",
-       "rc_categories_any": "איינער פון די געקליבענע",
        "rc-change-size-new": "$1 {{PLURAL:$1|בייט|בייטן}} נאך דער ענדערונג",
        "newsectionsummary": "/* $1 */ נייע אפטיילונג",
        "rc-enhanced-expand": "צייגן דעטאלן",
index ed42790..5183213 100644 (file)
        "newpageletter": "T",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|Oníṣe $1|Àwọn oníṣe $1}} ún ṣe ìmójútó]",
-       "rc_categories": "Òpin sí àwọn ẹ̀ka (pínsọ́tọ̀ pẹ̀lú \"|\")",
-       "rc_categories_any": "Èyíkéyìí",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} lẹ́yìn àtúnṣe",
        "newsectionsummary": "/* $1 */ abala tuntun",
        "rc-enhanced-expand": "Ìfihàn ẹ̀kúnrẹ́rẹ́",
index b303cf7..4b22b1b 100644 (file)
        "lastmodifiedat": "呢一頁嘅最後修改係響$1 $2。",
        "viewcount": "呢一頁已經有$1人次睇過。",
        "protectedpage": "受保護頁",
-       "jumpto": "跳去:",
+       "jumpto": "跳去",
        "jumptonavigation": "定向",
        "jumptosearch": "搵嘢",
        "view-pool-error": "對唔住,個伺服器響呢段時間超出咗負荷。\n太多用戶試過去睇呢一版。\n響再睇呢一版之前請等多一陣。\n\n$1",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1位用戶監視]",
-       "rc_categories": "限定到分類(以\"|\"作分隔):",
-       "rc_categories_any": "任何揀咗嘅",
        "rc-change-size-new": "改完後係$1位元組",
        "newsectionsummary": "/* $1 */ 新小節",
        "rc-enhanced-expand": "顯示細節",
        "recentchangeslinked-feed": "連結頁嘅更改",
        "recentchangeslinked-toolbox": "連結頁嘅更改",
        "recentchangeslinked-title": "對「$1」有關嘅更改",
-       "recentchangeslinked-summary": "呢一個特別頁列示咗''由''所畀到嘅一版連結到頁嘅最近更改(或者係指定分類嘅成員)。\n響[[Special:Watchlist|你張監視清單]]嘅版會以'''粗體'''顯示。",
+       "recentchangeslinked-summary": "輸入一個頁名來睇下嗰版連出去或者連入去嗰版嘅頁面嘅相關更改(想睇一個類入面嘅版,請輸入Category:分類名)。喺[[Special:Watchlist|你張監視清單]]嘅版會以<strong>粗體</strong>顯示。",
        "recentchangeslinked-page": "頁名:",
        "recentchangeslinked-to": "顯示連到所畀到嘅版",
        "recentchanges-page-added-to-category": "[[:$1]] 加咗落分類",
index 2eb2b61..01a162d 100644 (file)
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keêr|keêr}} op een volglieste]",
-       "rc_categories": "Beperk'n tot categorieën (scheien mie een \"|\")",
-       "rc_categories_any": "Elk'n",
        "newsectionsummary": "/* $1 */ nieuwe subkop",
        "rc-enhanced-expand": "Details weerheven (JavaScript vereist)",
        "rc-enhanced-hide": "Verbarg details",
index a28c457..da7d0d2 100644 (file)
        "newpageletter": "新",
        "boteditletter": "机",
        "number_of_watching_users_pageview": "[$1个关注用户]",
-       "rc_categories": "分类限制(用“|”分隔):",
-       "rc_categories_any": "任何选择的",
        "rc-change-size-new": "更改后有$1字节",
        "newsectionsummary": "/* $1 */ 新章节",
        "rc-enhanced-expand": "显示细节",
        "rollback-success": "已恢复{{GENDER:$3|$1}}的编辑;更改回{{GENDER:$4|$2}}的最后版本。",
        "rollback-success-notify": "已回退$1的编辑,更改回$2的最后版本。[$3 显示更改]",
        "sessionfailure-title": "会话无效",
-       "sessionfailure": "似乎您的登录会话有问题;\n为äº\86é\98²æ­¢ä¼\9aè¯\9då\8a«æ\8c\81ï¼\8cè¿\99个æ\93\8dä½\9cå·²ç»\8f被å\8f\96æ¶\88ã\80\82\n请è¿\94å\9b\9eå\85\88å\89\8dç\9a\84页é\9d¢ï¼\8cé\87\8dæ\96°è½½å\85¥è¯¥é¡µé\9d¢ï¼\8cç\84¶å\90\8eé\87\8dè¯\95ã\80\82",
+       "sessionfailure": "似乎您的登录会话有问题;为äº\86é\98²æ­¢ä¼\9aè¯\9då\8a«æ\8c\81ï¼\8cè¿\99个æ\93\8dä½\9cå·²ç»\8f被å\8f\96æ¶\88ã\80\82请é\87\8dæ\96°æ\8f\90交表å\8d\95ã\80\82",
        "changecontentmodel": "更改一个页面的内容模型",
        "changecontentmodel-legend": "更改内容类型",
        "changecontentmodel-title-label": "页面标题",
        "thumbnail_dest_directory": "无法建立目标目录",
        "thumbnail_image-type": "图像类型不支持",
        "thumbnail_gd-library": "未完成的GD设置:功能遗失 $1",
+       "thumbnail_image-size-zero": "图片文件大小看似为0。",
        "thumbnail_image-missing": "文件可能丢失:$1",
        "thumbnail_image-failure-limit": "近期尝试生成此缩略图失败太多次($1次或更多)。请稍后再试。",
        "import": "导入页面",
        "watchlistedit-clear-titles": "标题:",
        "watchlistedit-clear-submit": "清空监视列表(永久!)",
        "watchlistedit-clear-done": "您的监视列表已清空。",
+       "watchlistedit-clear-jobqueue": "您的监视列表正在清空。这需要花一些时间!",
        "watchlistedit-clear-removed": "$1个标题已移除:",
        "watchlistedit-too-many": "这里显示了太多页面。",
        "watchlisttools-clear": "清空监视列表",
index 5fc80ae..212487e 100644 (file)
        "nosuchaction": "無此動作",
        "nosuchactiontext": "URL 所指定的動作無效。\n您的 URL 可能輸入錯誤,或點選了錯誤的連結。\n這也可能是 {{SITENAME}} 使用的系統出現問題。",
        "nosuchspecialpage": "無此特殊頁面",
-       "nospecialpagetext": "<strong>您請求的特殊頁面無效。</strong>\n\n欲取得有效的特殊頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。",
+       "nospecialpagetext": "<strong>您請求的特定頁面無效。</strong>\n\n欲取得有效的特定頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。",
        "error": "錯誤",
        "databaseerror": "資料庫錯誤",
        "databaseerror-text": "出現資料庫查詢錯誤。\n這可能表示系統有問題存在。",
        "newpageletter": "新",
        "boteditletter": "機",
        "number_of_watching_users_pageview": "[$1 位正在監視的使用者]",
-       "rc_categories": "分類限制 (以 \"|\" 分隔):",
-       "rc_categories_any": "任何選擇的",
        "rc-change-size-new": "變更後為 $1 位元組",
        "newsectionsummary": "/* $1 */ 新章節",
        "rc-enhanced-expand": "顯示詳細資料",
        "rollback-success": "已還原 {{GENDER:$3|$1}} 所做的編輯;\n變更回由 {{GENDER:$4|$2}} 修訂的最後一個版本。",
        "rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]",
        "sessionfailure-title": "連線階段失敗",
-       "sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
+       "sessionfailure": "您的登入連線階段似乎有問題,為了預防連線階段受到劫持攻擊,此動作已經被取消。請重新提交表單。",
        "changecontentmodel": "變更頁面的內容模型",
        "changecontentmodel-legend": "變更內容模型",
        "changecontentmodel-title-label": "頁面標題",
        "creditspage": "頁面製作群",
        "nocredits": "此頁面沒有製作群資訊。",
        "spamprotectiontitle": "垃圾訊息過濾程式",
-       "spamprotectiontext": "您輸入文字內容已被垃圾訊息過濾程式禁止儲存,\n可能因您的內容包含了已封鎖的外部連結。",
+       "spamprotectiontext": "您輸入文字內容已被垃圾訊息過濾程式禁止儲存,可能因您的內容包含了已封鎖的外部連結。",
        "spamprotectionmatch": "以下文字內容觸發垃圾訊息過濾程式:$1",
        "spambot_username": "MediaWiki 垃圾訊息清理",
        "spam_reverting": "還原至未包含 $1 連結的最新修訂",
        "colon-separator": ":",
        "word-separator": "",
        "ellipsis": "…",
-       "parentheses": " ($1)",
+       "parentheses": "($1)",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← 上一頁",
        "imgmultipagenext": "下一頁 →",
        "watchlistedit-clear-titles": "標題:",
        "watchlistedit-clear-submit": "清空監視清單 (無法還原)",
        "watchlistedit-clear-done": "已清空您的監視清單。",
+       "watchlistedit-clear-jobqueue": "您的監視列表正在清空。這需要花一些時間!",
        "watchlistedit-clear-removed": "已移除 $1 個標題:",
        "watchlistedit-too-many": "太多要在此處顯示的頁面。",
        "watchlisttools-clear": "清空監視清單",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|已保護}} $3 $4 [連鎖]",
        "logentry-protect-modify": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4 [連鎖]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|已更改}} {{GENDER:$6|$3}} 的群組成員資格由 $4 成為 $5",
+       "logentry-rights-rights": "$1已將{{GENDER:$6|$3}}的使用者群組從$4{{GENDER:$2|更改}}至$5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格",
        "logentry-rights-autopromote": "$1 已自動{{GENDER:$2|提升}}從 $4 成為 $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|已上傳}} $3",
        "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|已移除}}{{PLURAL:$9|標籤|標籤}} $8 自日誌項目 $3 的修訂 $5。",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的修訂 $4 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的日誌項目 $5 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
-       "rightsnone": "(無)",
+       "rightsnone": "(無)",
        "rightslogentry-temporary-group": "$1 (臨時,直到 $2)",
        "feedback-adding": "正在新增意見回饋至頁面...",
        "feedback-back": "返回",
diff --git a/languages/messages/MessagesEs_formal.php b/languages/messages/MessagesEs_formal.php
new file mode 100644 (file)
index 0000000..2c5d727
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Spanish (formal) (español (formal))
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'es';
index 527e6cb..7e4bf7c 100644 (file)
@@ -514,6 +514,8 @@ abstract class Maintenance {
                        "http://en.wikipedia.org. This is sometimes necessary because " .
                        "server name detection may fail in command line scripts.", false, true );
                $this->addOption( 'profiler', 'Profiler output format (usually "text")', false, true );
+               // This is named --mwdebug, because --debug would conflict in the phpunit.php CLI script.
+               $this->addOption( 'mwdebug', 'Enable built-in MediaWiki development settings', false, true );
 
                # Save generic options to display them separately in help
                $this->mGenericParameters = $this->mParams;
@@ -1149,6 +1151,11 @@ abstract class Maintenance {
                        MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->destroy();
                }
 
+               # Apply debug settings
+               if ( $this->hasOption( 'mwdebug' ) ) {
+                       require __DIR__ . '/../includes/DevelopmentSettings.php';
+               }
+
                // Per-script profiling; useful for debugging
                $this->activateProfiler();
 
@@ -1156,9 +1163,9 @@ abstract class Maintenance {
 
                $wgShowSQLErrors = true;
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                set_time_limit( 0 );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $this->adjustMemoryLimit();
        }
index fd66b3f..3aa7af7 100644 (file)
@@ -37,9 +37,9 @@ class BenchmarkJSMinPlus extends Benchmarker {
        }
 
        public function execute() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $content = file_get_contents( $this->getOption( 'file' ) );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( $content === false ) {
                        $this->fatalError( 'Unable to open input file' );
                }
index f001236..55ffcb8 100644 (file)
@@ -43,7 +43,7 @@ class CheckLess extends Maintenance {
                self::requireTestsAutoloader();
 
                // If phpunit isn't available by autoloader try pulling it in
-               if ( !class_exists( 'PHPUnit_Framework_TestCase' ) ) {
+               if ( !class_exists( 'PHPUnit\\Framework\\TestCase' ) ) {
                        require_once 'PHPUnit/Autoload.php';
                }
 
index 3763d3b..b2fdf2f 100644 (file)
@@ -110,7 +110,7 @@ class CleanupUsersWithNoId extends LoggedUpdateMaintenance {
                                $next = "$field > $value OR $field = $value AND ($next)";
                        }
                }
-               $display = join( ' ', array_reverse( $display ) );
+               $display = implode( ' ', array_reverse( $display ) );
                return [ $next, $display ];
        }
 
index fdc36c7..57e09a7 100644 (file)
@@ -722,13 +722,13 @@ TEXT
        }
 
        private function getTextSpawned( $id ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                if ( !$this->spawnProc ) {
                        // First time?
                        $this->openSpawn();
                }
                $text = $this->getTextSpawnedOnce( $id );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                return $text;
        }
@@ -774,7 +774,7 @@ TEXT
        }
 
        private function closeSpawn() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                if ( $this->spawnRead ) {
                        fclose( $this->spawnRead );
                }
@@ -791,7 +791,7 @@ TEXT
                        pclose( $this->spawnProc );
                }
                $this->spawnProc = false;
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
        }
 
        private function getTextSpawnedOnce( $id ) {
index 04c00e2..9903c9e 100644 (file)
@@ -245,7 +245,7 @@ class FindHooks extends Maintenance {
                $m = [];
                preg_match_all(
                        // All functions which runs hooks
-                       '/(?:wfRunHooks|Hooks\:\:run)\s*\(\s*' .
+                       '/(?:wfRunHooks|Hooks\:\:run|Hooks\:\:runWithoutAbort)\s*\(\s*' .
                                // First argument is the hook name as string
                                '([\'"])(.*?)\1' .
                                // Comma for second argument
index eb13dd1..5db1fa8 100644 (file)
@@ -305,7 +305,7 @@ class ImportImages extends Maintenance {
                                        $publishOptions = [];
                                        $handler = MediaHandler::getHandler( $props['mime'] );
                                        if ( $handler ) {
-                                               $metadata = MediaWiki\quietCall( 'unserialize', $props['metadata'] );
+                                               $metadata = Wikimedia\quietCall( 'unserialize', $props['metadata'] );
 
                                                $publishOptions['headers'] = $handler->getContentHeaders( $metadata );
                                        } else {
index d170c15..6249094 100644 (file)
@@ -132,9 +132,9 @@ class CommandLineInstaller extends Maintenance {
                                $this->error( 'WARNING: You have provided the options "dbpass" and "dbpassfile". '
                                        . 'The content of "dbpassfile" overrides "dbpass".' );
                        }
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $dbpass = file_get_contents( $dbpassfile ); // returns false on failure
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $dbpass === false ) {
                                $this->fatalError( "Couldn't open $dbpassfile" );
                        }
@@ -149,9 +149,9 @@ class CommandLineInstaller extends Maintenance {
                                $this->error( 'WARNING: You have provided the options "pass" and "passfile". '
                                        . 'The content of "passfile" overrides "pass".' );
                        }
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $pass = file_get_contents( $passfile ); // returns false on failure
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $pass === false ) {
                                $this->fatalError( "Couldn't open $passfile" );
                        }
index deac4af..661ec98 100644 (file)
@@ -47,9 +47,9 @@ class JSParseHelper extends Maintenance {
 
                $parser = new JSParser();
                foreach ( $files as $filename ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $js = file_get_contents( $filename );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( $js === false ) {
                                $this->output( "$filename ERROR: could not read file\n" );
                                $this->errs++;
index 15ccb2d..723ea62 100644 (file)
@@ -26,9 +26,9 @@
 /** A general output object. Need to be overridden */
 class StatsOutput {
        function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $return = sprintf( '%.' . $accuracy . 'f%%', 100 * $subset / $total );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                return $return;
        }
@@ -92,9 +92,9 @@ class WikiStatsOutput extends StatsOutput {
        }
 
        function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $v = round( 255 * $subset / $total );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $revert ) {
                        # Weigh reverse with factor 20 so coloring takes effect more quickly as
index c35315d..cb72c1e 100644 (file)
@@ -205,7 +205,7 @@ class MigrateComments extends LoggedUpdateMaintenance {
                                        $next = "$field > $value OR $field = $value AND ($next)";
                                }
                        }
-                       $prompt = join( ' ', array_reverse( $prompt ) );
+                       $prompt = implode( ' ', array_reverse( $prompt ) );
                        $this->output( "... $prompt\n" );
                        wfWaitForSlaves();
                }
index 55ed4fa..ae6a75e 100644 (file)
@@ -140,7 +140,7 @@ class RebuildFileCache extends Maintenance {
                                                }
                                        }
 
-                                       MediaWiki\suppressWarnings(); // header notices
+                                       Wikimedia\suppressWarnings(); // header notices
                                        // Cache ?action=view
                                        $wgRequestTime = microtime( true ); # T24852
                                        ob_start();
@@ -157,7 +157,7 @@ class RebuildFileCache extends Maintenance {
                                        $context->getOutput()->clearHTML();
                                        $historyHtml = ob_get_clean();
                                        $historyCache->saveToFileCache( $historyHtml );
-                                       MediaWiki\restoreWarnings();
+                                       Wikimedia\restoreWarnings();
 
                                        if ( $rebuilt ) {
                                                $this->output( "Re-cached page '$title' (id {$row->page_id})..." );
index 5070745..bfd4d97 100644 (file)
@@ -117,12 +117,12 @@ class SqliteMaintenance extends Maintenance {
                $this->db->query( 'BEGIN IMMEDIATE TRANSACTION', __METHOD__ );
                $ourFile = $this->db->getDbFilePath();
                $this->output( "   Copying database file $ourFile to $fileName... " );
-               MediaWiki\suppressWarnings( false );
+               Wikimedia\suppressWarnings();
                if ( !copy( $ourFile, $fileName ) ) {
                        $err = error_get_last();
                        $this->error( "      {$err['message']}" );
                }
-               MediaWiki\suppressWarnings( true );
+               Wikimedia\restoreWarnings();
                $this->output( "   Releasing lock...\n" );
                $this->db->query( 'COMMIT TRANSACTION', __METHOD__ );
        }
index f6aa19b..b7ae691 100644 (file)
@@ -310,9 +310,9 @@ class FixT22757 extends Maintenance {
                $text = $secondaryRow->old_text;
                if ( in_array( 'external', $flags ) ) {
                        $url = $text;
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        list( /* $proto */, $path ) = explode( '://', $url, 2 );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
 
                        if ( $path == "" ) {
                                return false;
index 2a92140..54a9102 100644 (file)
@@ -236,9 +236,9 @@ class RecompressTracked {
                                [ 'file', 'php://stdout', 'w' ],
                                [ 'file', 'php://stderr', 'w' ]
                        ];
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $proc = proc_open( "$cmd --replica-id $i", $spec, $pipes );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        if ( !$proc ) {
                                $this->critical( "Error opening replica DB process: $cmd" );
                                exit( 1 );
index ad47ee0..4d89f87 100644 (file)
@@ -1202,6 +1202,7 @@ return [
                ],
                'dependencies' => [
                        'jquery.byteLength',
+                       'jquery.byteLimit',
                        'mediawiki.util',
                ],
                'targets' => [ 'desktop', 'mobile' ],
@@ -1441,7 +1442,6 @@ return [
        'mediawiki.action.edit.preview' => [
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.preview.js',
                'dependencies' => [
-                       'jquery.form',
                        'jquery.spinner',
                        'jquery.textSelection',
                        'mediawiki.api',
@@ -1766,9 +1766,14 @@ return [
                        'oojs',
                        'mediawiki.api',
                        'mediawiki.api.options',
+                       'mediawiki.jqueryMsg',
                        'mediawiki.Uri',
                        'mediawiki.user',
                ],
+               'messages' => [
+                       'quotation-marks',
+                       'rcfilters-filterlist-title',
+               ],
        ],
        'mediawiki.rcfilters.filters.ui' => [
                'scripts' => [
@@ -1924,6 +1929,7 @@ return [
                'dependencies' => [
                        'oojs-ui-widgets',
                        'jquery.makeCollapsible',
+                       'mediawiki.jqueryMsg',
                        'mediawiki.language',
                        'mediawiki.user',
                        'mediawiki.util',
index c75246c..3ce6e7f 100644 (file)
                'blur.byteLimit'
        ].join( ' ' );
 
+       // Like String#charAt, but return the pair of UTF-16 surrogates for characters outside of BMP.
+       function codePointAt( string, offset, backwards ) {
+               // We don't need to check for offsets at the beginning or end of string,
+               // String#slice will simply return a shorter (or empty) substring.
+               var maybePair = backwards ?
+                       string.slice( offset - 1, offset + 1 ) :
+                       string.slice( offset, offset + 2 );
+               if ( /^[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test( maybePair ) ) {
+                       return maybePair;
+               } else {
+                       return string.charAt( offset );
+               }
+       }
+
        /**
         * Utility function to trim down a string, based on byteLimit
         * and given a safe start position. It supports insertion anywhere
@@ -32,7 +46,7 @@
         * @return {boolean} return.trimmed
         */
        $.trimByteLength = function ( safeVal, newVal, byteLimit, fn ) {
-               var startMatches, endMatches, matchesLen, inpParts,
+               var startMatches, endMatches, matchesLen, inpParts, chopOff, oldChar, newChar,
                        oldVal = safeVal;
 
                // Run the hook if one was provided, but only on the length
 
                // Count same characters from the left, first.
                // (if "foo" -> "foofoo", assume addition was at the end).
-               while (
-                       startMatches < matchesLen &&
-                       oldVal.charAt( startMatches ) === newVal.charAt( startMatches )
-               ) {
-                       startMatches += 1;
+               while ( startMatches < matchesLen ) {
+                       oldChar = codePointAt( oldVal, startMatches, false );
+                       newChar = codePointAt( newVal, startMatches, false );
+                       if ( oldChar !== newChar ) {
+                               break;
+                       }
+                       startMatches += oldChar.length;
                }
 
-               while (
-                       endMatches < ( matchesLen - startMatches ) &&
-                       oldVal.charAt( oldVal.length - 1 - endMatches ) === newVal.charAt( newVal.length - 1 - endMatches )
-               ) {
-                       endMatches += 1;
+               while ( endMatches < ( matchesLen - startMatches ) ) {
+                       oldChar = codePointAt( oldVal, oldVal.length - 1 - endMatches, true );
+                       newChar = codePointAt( newVal, newVal.length - 1 - endMatches, true );
+                       if ( oldChar !== newChar ) {
+                               break;
+                       }
+                       endMatches += oldChar.length;
                }
 
                inpParts = [
                if ( fn ) {
                        // stop, when there is nothing to slice - T43450
                        while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[ 1 ].length > 0 ) {
-                               inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 );
+                               // Do not chop off halves of surrogate pairs
+                               chopOff = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test( inpParts[ 1 ] ) ? 2 : 1;
+                               inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -chopOff );
                        }
                } else {
                        while ( $.byteLength( inpParts.join( '' ) ) > byteLimit ) {
-                               inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 );
+                               // Do not chop off halves of surrogate pairs
+                               chopOff = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test( inpParts[ 1 ] ) ? 2 : 1;
+                               inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -chopOff );
                        }
                }
 
index ca4b6fb..a13f059 100644 (file)
@@ -19,9 +19,9 @@
                 * @return {number} plural form index
                 */
                getPluralForm: function ( number, pluralRules ) {
-                       var i;
+                       var i, pluralRuleParser = require( 'mediawiki.libs.pluralruleparser' );
                        for ( i = 0; i < pluralRules.length; i++ ) {
-                               if ( mw.libs.pluralRuleParser( pluralRules[ i ], number ) ) {
+                               if ( pluralRuleParser( pluralRules[ i ], number ) ) {
                                        break;
                                }
                        }
index bb29b36..eda8c0d 100644 (file)
                        }
                }
 
+               if ( this.isSticky() ) {
+                       // If this group is sticky, then change the default according to the
+                       // current selection.
+                       this.defaultParams = this.getParamRepresentation( this.getSelectedState() );
+               }
+
                if (
                        changed ||
                        this.active !== active ||
                        this.currSelected !== item
                ) {
-                       if ( this.isSticky() ) {
-                               // If this group is sticky, then change the default according to the
-                               // current selection.
-                               this.defaultParams = this.getParamRepresentation( this.getSelectedState() );
-                       }
-
                        this.active = active;
                        this.currSelected = item;
 
index 9af7ab2..de5ab87 100644 (file)
@@ -6,7 +6,6 @@
  * @singleton
  */
 
-/* eslint-disable no-use-before-define */
 /* global Uint8Array */
 
 ( function ( mw, $ ) {
                        return mw.msg( sizeMsgs[ 0 ], Math.round( s ) );
                }
 
+               /**
+                * Start loading a file into memory; when complete, pass it as a
+                * data URL to the callback function. If the callbackBinary is set it will
+                * first be read as binary and afterwards as data URL. Useful if you want
+                * to do preprocessing on the binary data first.
+                *
+                * @param {File} file
+                * @param {Function} callback
+                * @param {Function} callbackBinary
+                */
+               function fetchPreview( file, callback, callbackBinary ) {
+                       var reader = new FileReader();
+                       if ( callbackBinary && 'readAsBinaryString' in reader ) {
+                               // To fetch JPEG metadata we need a binary string; start there.
+                               // TODO
+                               reader.onload = function () {
+                                       callbackBinary( reader.result );
+
+                                       // Now run back through the regular code path.
+                                       fetchPreview( file, callback );
+                               };
+                               reader.readAsBinaryString( file );
+                       } else if ( callbackBinary && 'readAsArrayBuffer' in reader ) {
+                               // readAsArrayBuffer replaces readAsBinaryString
+                               // However, our JPEG metadata library wants a string.
+                               // So, this is going to be an ugly conversion.
+                               reader.onload = function () {
+                                       var i,
+                                               buffer = new Uint8Array( reader.result ),
+                                               string = '';
+                                       for ( i = 0; i < buffer.byteLength; i++ ) {
+                                               string += String.fromCharCode( buffer[ i ] );
+                                       }
+                                       callbackBinary( string );
+
+                                       // Now run back through the regular code path.
+                                       fetchPreview( file, callback );
+                               };
+                               reader.readAsArrayBuffer( file );
+                       } else if ( 'URL' in window && 'createObjectURL' in window.URL ) {
+                               // Supported in Firefox 4.0 and above <https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL>
+                               // WebKit has it in a namespace for now but that's ok. ;)
+                               //
+                               // Lifetime of this URL is until document close, which is fine
+                               // for Special:Upload -- if this code gets used on longer-running
+                               // pages, add a revokeObjectURL() when it's no longer needed.
+                               //
+                               // Prefer this over readAsDataURL for Firefox 7 due to bug reading
+                               // some SVG files from data URIs <https://bugzilla.mozilla.org/show_bug.cgi?id=694165>
+                               callback( window.URL.createObjectURL( file ) );
+                       } else {
+                               // This ends up decoding the file to base-64 and back again, which
+                               // feels horribly inefficient.
+                               reader.onload = function () {
+                                       callback( reader.result );
+                               };
+                               reader.readAsDataURL( file );
+                       }
+               }
+
+               /**
+                * Clear the file upload preview area.
+                */
+               function clearPreview() {
+                       $( '#mw-upload-thumbnail' ).remove();
+               }
+
                /**
                 * Show a thumbnail preview of PNG, JPEG, GIF, and SVG files prior to upload
                 * in browsers supporting HTML5 FileAPI.
                        } : null );
                }
 
-               /**
-                * Start loading a file into memory; when complete, pass it as a
-                * data URL to the callback function. If the callbackBinary is set it will
-                * first be read as binary and afterwards as data URL. Useful if you want
-                * to do preprocessing on the binary data first.
-                *
-                * @param {File} file
-                * @param {Function} callback
-                * @param {Function} callbackBinary
-                */
-               function fetchPreview( file, callback, callbackBinary ) {
-                       var reader = new FileReader();
-                       if ( callbackBinary && 'readAsBinaryString' in reader ) {
-                               // To fetch JPEG metadata we need a binary string; start there.
-                               // TODO
-                               reader.onload = function () {
-                                       callbackBinary( reader.result );
-
-                                       // Now run back through the regular code path.
-                                       fetchPreview( file, callback );
-                               };
-                               reader.readAsBinaryString( file );
-                       } else if ( callbackBinary && 'readAsArrayBuffer' in reader ) {
-                               // readAsArrayBuffer replaces readAsBinaryString
-                               // However, our JPEG metadata library wants a string.
-                               // So, this is going to be an ugly conversion.
-                               reader.onload = function () {
-                                       var i,
-                                               buffer = new Uint8Array( reader.result ),
-                                               string = '';
-                                       for ( i = 0; i < buffer.byteLength; i++ ) {
-                                               string += String.fromCharCode( buffer[ i ] );
-                                       }
-                                       callbackBinary( string );
-
-                                       // Now run back through the regular code path.
-                                       fetchPreview( file, callback );
-                               };
-                               reader.readAsArrayBuffer( file );
-                       } else if ( 'URL' in window && 'createObjectURL' in window.URL ) {
-                               // Supported in Firefox 4.0 and above <https://developer.mozilla.org/en/DOM/window.URL.createObjectURL>
-                               // WebKit has it in a namespace for now but that's ok. ;)
-                               //
-                               // Lifetime of this URL is until document close, which is fine
-                               // for Special:Upload -- if this code gets used on longer-running
-                               // pages, add a revokeObjectURL() when it's no longer needed.
-                               //
-                               // Prefer this over readAsDataURL for Firefox 7 due to bug reading
-                               // some SVG files from data URIs <https://bugzilla.mozilla.org/show_bug.cgi?id=694165>
-                               callback( window.URL.createObjectURL( file ) );
-                       } else {
-                               // This ends up decoding the file to base-64 and back again, which
-                               // feels horribly inefficient.
-                               reader.onload = function () {
-                                       callback( reader.result );
-                               };
-                               reader.readAsDataURL( file );
-                       }
-               }
-
-               /**
-                * Clear the file upload preview area.
-                */
-               function clearPreview() {
-                       $( '#mw-upload-thumbnail' ).remove();
-               }
-
                /**
                 * Check if the file does not exceed the maximum size
                 *
index 5678a80..a810c98 100644 (file)
@@ -1,8 +1,12 @@
 /**
- * Add a visible byte limit label to a TextInputWidget
- *
- * Uses jQuery.byteLimit to enforce the limit.
+ * @class mw.widgets
+ */
 
+/**
+ * Add a visible byte limit label to a TextInputWidget.
+ *
+ * Uses jQuery#byteLimit to enforce the limit.
+ *
  * @param {OO.ui.TextInputWidget} textInputWidget Text input widget
  * @param {number} [limit] Byte limit, defaults to $input's maxlength
  */
index 4d56940..177861e 100644 (file)
         * @return {string}
         */
        ForeignStructuredUpload.prototype.getDescriptions = function () {
+               var upload = this;
                return this.descriptions.map( function ( desc ) {
-                       return this.config.format.description
+                       return upload.config.format.description
                                .replace( '$LANGUAGE', desc.language )
                                .replace( '$TEXT', desc.text );
                } ).join( '\n' );
index 9db2771..6a4ebb1 100644 (file)
@@ -1,11 +1,9 @@
 /*!
  * @author Neil Kandalgaonkar, 2010
- * @author Timo Tijhof, 2011-2013
+ * @author Timo Tijhof
  * @since 1.18
  */
 
-/* eslint-disable no-use-before-define */
-
 ( function ( mw, $ ) {
        /**
         * Parse titles into an object structure. Note that when using the constructor
         *     mw.Title.makeTitle( NS_TEMPLATE, 'Template:Foo' ).getPrefixedText();   // => 'Template:Template:Foo'
         *
         * @class mw.Title
-        * @constructor
-        * @param {string} title Title of the page. If no second argument given,
-        *  this will be searched for a namespace
-        * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
-        * @throws {Error} When the title is invalid
         */
-       function Title( title, namespace ) {
-               var parsed = parse( title, namespace );
-               if ( !parsed ) {
-                       throw new Error( 'Unable to parse title' );
-               }
-
-               this.namespace = parsed.namespace;
-               this.title = parsed.title;
-               this.ext = parsed.ext;
-               this.fragment = parsed.fragment;
-       }
 
        /* Private members */
 
-       // eslint-disable-next-line vars-on-top
        var
                namespaceIds = mw.config.get( 'wgNamespaceIds' ),
 
                 * @return {string}
                 */
                trimToByteLength = function ( s, length ) {
-                       var byteLength, chopOffChars, chopOffBytes;
-
-                       // bytelength is always greater or equal to the length in characters
-                       s = s.substr( 0, length );
-                       while ( ( byteLength = $.byteLength( s ) ) > length ) {
-                               // Calculate how many characters can be safely removed
-                               // First, we need to know how many bytes the string exceeds the threshold
-                               chopOffBytes = byteLength - length;
-                               // A character in UTF-8 is at most 4 bytes
-                               // One character must be removed in any case because the
-                               // string is too long
-                               chopOffChars = Math.max( 1, Math.floor( chopOffBytes / 4 ) );
-                               s = s.substr( 0, s.length - chopOffChars );
-                       }
-                       return s;
+                       return $.trimByteLength( '', s, length ).newVal;
                },
 
                /**
                        return trimToByteLength( name, FILENAME_MAX_BYTES - extension.length - 1 ) + '.' + extension;
                };
 
+       /**
+        * @method constructor
+        * @param {string} title Title of the page. If no second argument given,
+        *  this will be searched for a namespace
+        * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
+        * @throws {Error} When the title is invalid
+        */
+       function Title( title, namespace ) {
+               var parsed = parse( title, namespace );
+               if ( !parsed ) {
+                       throw new Error( 'Unable to parse title' );
+               }
+
+               this.namespace = parsed.namespace;
+               this.title = parsed.title;
+               this.ext = parsed.ext;
+               this.fragment = parsed.fragment;
+       }
+
        /* Static members */
 
        /**
index 104f699..a2e071e 100644 (file)
@@ -53,7 +53,7 @@
        }
 
        function defineFallbacks() {
-               // <https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Set>
+               // <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set>
                StringSet = window.Set || ( function () {
                        /**
                         * @private
                                 *         OO.compare( [ 1 ], [ 1 ] );
                                 *     } );
                                 *
+                                * Example of inline dependency obtained via `require()`:
+                                *
+                                *     mw.loader.using( [ 'mediawiki.util' ], function ( require ) {
+                                *         var util = require( 'mediawiki.util' );
+                                *     } );
+                                *
                                 * Since MediaWiki 1.23 this also returns a promise.
                                 *
                                 * Since MediaWiki 1.28 the promise is resolved with a `require` function.
                                /**
                                 * Get the exported value of a module.
                                 *
-                                * Modules may provide this via their local `module.exports`.
+                                * This static method is publicly exposed for debugging purposes
+                                * only and must not be used in production code. In production code,
+                                * please use the dynamically provided `require()` function instead.
                                 *
-                                * @protected
+                                * In case of lazy-loaded modules via mw.loader#using(), the returned
+                                * Promise provides the function, see #using() for examples.
+                                *
+                                * @private
                                 * @since 1.27
                                 * @param {string} moduleName Module name
                                 * @return {Mixed} Exported value
index 596c118..fe0b029 100644 (file)
@@ -34,7 +34,7 @@ window.mwNow = ( function () {
  * - Firefox 4+
  * - Safari 5+
  * - Opera 15+
- * - Mobile Safari 5.1+ (iOS 5+)
+ * - Mobile Safari 6.0+ (iOS 6+)
  * - Android 4.1+
  *
  * Browsers we support in our no-javascript run-time (Grade C):
index cc769d7..262eb35 100644 (file)
@@ -2,7 +2,7 @@
 
 use Wikimedia\TestingAccessWrapper;
 
-abstract class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
+abstract class MWHttpRequestTestCase extends PHPUnit\Framework\TestCase {
        protected static $httpEngine;
        protected $oldHttpEngine;
 
index 598c715..c69fa73 100644 (file)
@@ -9,7 +9,7 @@ use MediaWiki\Shell\Shell;
  * as long as firejail and sudo has similar config.
  * @group Shell
  */
-class FirejailCommandIntegrationTest extends PHPUnit_Framework_TestCase {
+class FirejailCommandIntegrationTest extends PHPUnit\Framework\TestCase {
 
        public function setUp() {
                parent::setUp();
index 61aa0d7..fbeed97 100644 (file)
@@ -25,11 +25,11 @@ class ParserTestResultNormalizer {
                // guaranteed to give accurate results. For example, it may introduce
                // differences in the number of line breaks in <pre> tags.
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                if ( !$this->doc->loadXML( '<html><body>' . $text . '</body></html>' ) ) {
                        $this->invalid = true;
                }
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                $this->xpath = new DOMXPath( $this->doc );
                $this->body = $this->xpath->query( '//body' )->item( 0 );
        }
index 4dd4bc6..4f6f6b6 100644 (file)
@@ -889,7 +889,7 @@ class ParserTestRunner {
                if ( isset( $output ) && isset( $opts['showflags'] ) ) {
                        $actualFlags = array_keys( TestingAccessWrapper::newFromObject( $output )->mFlags );
                        sort( $actualFlags );
-                       $out .= "\nflags=" . join( ', ', $actualFlags );
+                       $out .= "\nflags=" . implode( ', ', $actualFlags );
                }
 
                ScopedCallback::consume( $teardownGuard );
index 2f82ca7..1a2cfc9 100644 (file)
@@ -3,7 +3,7 @@
 class PhpunitTestRecorder extends TestRecorder {
        private $testCase;
 
-       public function setTestCase( PHPUnit_Framework_TestCase $testCase ) {
+       public function setTestCase( PHPUnit\Framework\TestCase $testCase ) {
                $this->testCase = $testCase;
        }
 
index cb430f2..3e18370 100644 (file)
@@ -62,10 +62,9 @@ class ParserEditTests extends Maintenance {
        }
 
        protected function setupFileData() {
-               global $wgParserTestFiles;
                $this->testFiles = [];
                $this->testCount = 0;
-               foreach ( $wgParserTestFiles as $file ) {
+               foreach ( ParserTestRunner::getParserTestFiles() as $file ) {
                        $fileInfo = TestFileReader::read( $file );
                        $this->testFiles[$file] = $fileInfo;
                        $this->testCount += count( $fileInfo['tests'] );
index 9a2a9c9..eb4181c 100644 (file)
@@ -165,9 +165,9 @@ class ParserFuzzTest extends Maintenance {
        function guessVarSize( $var ) {
                $length = 0;
                try {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $length = strlen( serialize( $var ) );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                } catch ( Exception $e ) {
                }
                return $length;
index dd606d8..0a162a2 100644 (file)
@@ -11,7 +11,7 @@ class MediaWikiPHPUnitTestListener
        protected function getTestName( PHPUnit_Framework_Test $test ) {
                $name = get_class( $test );
 
-               if ( $test instanceof PHPUnit_Framework_TestCase ) {
+               if ( $test instanceof PHPUnit\Framework\TestCase ) {
                        $name .= '::' . $test->getName( true );
                }
 
index 01a34b8..652b1ee 100644 (file)
@@ -14,7 +14,7 @@ use Wikimedia\TestingAccessWrapper;
 /**
  * @since 1.18
  */
-abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
+abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
@@ -1597,9 +1597,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param string $function
         */
        public function hideDeprecated( $function ) {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                wfDeprecated( $function );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
        }
 
        /**
@@ -1893,9 +1893,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                # This check may also protect against code injection in
                # case of broken installations.
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( !$haveDiff3 ) {
                        $this->markTestSkipped( "Skip test, since diff3 is not configured" );
index 9719862..514150c 100644 (file)
@@ -87,7 +87,6 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        protected $dependencies = [];
        protected $group = null;
        protected $source = 'local';
-       protected $position = 'bottom';
        protected $script = '';
        protected $styles = '';
        protected $skipFunction = null;
@@ -126,9 +125,6 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        public function getSource() {
                return $this->source;
        }
-       public function getPosition() {
-               return $this->position;
-       }
 
        public function getType() {
                return $this->type;
diff --git a/tests/phpunit/data/registration/bad_spdx.json b/tests/phpunit/data/registration/bad_spdx.json
new file mode 100644 (file)
index 0000000..383ab04
--- /dev/null
@@ -0,0 +1,6 @@
+{
+       "name": "FooBar",
+       "license-name": "not a license identifier",
+       "manifest_version": 1
+}
+
diff --git a/tests/phpunit/data/registration/good.json b/tests/phpunit/data/registration/good.json
new file mode 100644 (file)
index 0000000..ad16c5e
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "name": "FooBar",
+       "manifest_version": 1
+}
diff --git a/tests/phpunit/data/registration/invalid.json b/tests/phpunit/data/registration/invalid.json
new file mode 100644 (file)
index 0000000..4d1fa58
--- /dev/null
@@ -0,0 +1,5 @@
+{
+       "name": "FooBar",
+       "license-name": [ "array" ],
+       "manifest_version": 1
+}
diff --git a/tests/phpunit/data/registration/newer_manifest_version.json b/tests/phpunit/data/registration/newer_manifest_version.json
new file mode 100644 (file)
index 0000000..29c668e
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "name": "FooBar",
+       "manifest_version": 999999
+}
diff --git a/tests/phpunit/data/registration/no_manifest_version.json b/tests/phpunit/data/registration/no_manifest_version.json
new file mode 100644 (file)
index 0000000..1a6119f
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "name": "FooBar"
+}
diff --git a/tests/phpunit/data/registration/notjson.txt b/tests/phpunit/data/registration/notjson.txt
new file mode 100644 (file)
index 0000000..d47b460
--- /dev/null
@@ -0,0 +1 @@
+This is definitely not JSON.
diff --git a/tests/phpunit/data/registration/old_manifest_version.json b/tests/phpunit/data/registration/old_manifest_version.json
new file mode 100644 (file)
index 0000000..f50faa1
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "name": "FooBar",
+       "manifest_version": -2
+}
index 84e1f32..e332cdd 100644 (file)
@@ -648,8 +648,8 @@ class CommentStoreTest extends MediaWikiLangTestCase {
        }
 
        public function testGetCommentErrors() {
-               MediaWiki\suppressWarnings();
-               $reset = new ScopedCallback( 'MediaWiki\restoreWarnings' );
+               Wikimedia\suppressWarnings();
+               $reset = new ScopedCallback( 'Wikimedia\restoreWarnings' );
 
                $store = $this->makeStore( MIGRATION_OLD );
                $res = $store->getComment( 'dummy', [ 'dummy' => 'comment' ] );
index f6ccbc7..9f8bb38 100644 (file)
@@ -2,7 +2,7 @@
 
 use MediaWiki\Session\SessionManager;
 
-class FauxRequestTest extends PHPUnit_Framework_TestCase {
+class FauxRequestTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 9d56150..ee4819f 100644 (file)
@@ -711,9 +711,9 @@ class GlobalTest extends MediaWikiTestCase {
        public function testWfMkdirParents() {
                // Should not return true if file exists instead of directory
                $fname = $this->getNewTempFile();
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $ok = wfMkdirParents( $fname );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                $this->assertFalse( $ok );
        }
 
index 8adb55f..1011a37 100644 (file)
@@ -5,7 +5,7 @@
  * @covers ::wfArrayFilter
  * @covers ::wfArrayFilterByKey
  */
-class WfArrayFilterTest extends \PHPUnit_Framework_TestCase {
+class WfArrayFilterTest extends \PHPUnit\Framework\TestCase {
        public function testWfArrayFilter() {
                $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ];
                $filtered = wfArrayFilter( $arr, function ( $val, $key ) {
index 6aa9849..87a7dff 100644 (file)
@@ -10,7 +10,7 @@
  *
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-class MediaWikiVersionFetcherTest extends PHPUnit_Framework_TestCase {
+class MediaWikiVersionFetcherTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index be28e43..88c585f 100644 (file)
@@ -266,9 +266,9 @@ class OutputPageTest extends MediaWikiTestCase {
                        'UploadPath' => $uploadPath,
                ] );
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $actual = OutputPage::transformResourcePath( $conf, $path );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $this->assertEquals( $expected ?: $path, $actual );
        }
index b36fd7d..b05a742 100644 (file)
@@ -903,7 +903,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                        'text_id' => 123456789, // not in the test DB
                ] );
 
-               MediaWiki\suppressWarnings(); // bad text_id will trigger a warning.
+               Wikimedia\suppressWarnings(); // bad text_id will trigger a warning.
 
                $this->assertNull( $rev->getContent(),
                        "getContent() should return null if the revision's text blob could not be loaded." );
@@ -912,7 +912,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                $this->assertNull( $rev->getContent(),
                        "getContent() should return null if the revision's text blob could not be loaded." );
 
-               MediaWiki\suppressWarnings( 'end' );
+               Wikimedia\restoreWarnings();
        }
 
        public function provideGetSize() {
index 57c0531..8eac064 100644 (file)
@@ -86,10 +86,10 @@ class RevisionTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionStore::newMutableRevisionFromArray
         */
        public function testConstructFromArrayWithBadPageId() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $rev = new Revision( [ 'page' => 77777777 ] );
                $this->assertSame( 77777777, $rev->getPage() );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
        }
 
        public function provideConstructFromArray_userSetAsExpected() {
@@ -320,10 +320,10 @@ class RevisionTest extends MediaWikiTestCase {
        public function testConstructFromRowWithBadPageId() {
                $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
                $this->overrideMwServices();
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $rev = new Revision( (object)[ 'rev_page' => 77777777 ] );
                $this->assertSame( 77777777, $rev->getPage() );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
        }
 
        public function provideGetRevisionText() {
index c7e15ea..c4e4308 100644 (file)
@@ -5,7 +5,7 @@
  * @todo all test methods in this class should be refactored and...
  *    use a single test method and a single data provider...
  */
-class SanitizerValidateEmailTest extends PHPUnit_Framework_TestCase {
+class SanitizerValidateEmailTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index cdbf9fd..56bde5d 100644 (file)
@@ -11,9 +11,10 @@ class SiteStatsTest extends MediaWikiTestCase {
                $cache = \MediaWiki\MediaWikiServices::getInstance()->getMainWANObjectCache();
                $jobq = JobQueueGroup::singleton();
 
-               // Delete EditPage jobs that might have been left behind by other tests
+               // Delete jobs that might have been left behind by other tests
                $jobq->get( 'htmlCacheUpdate' )->delete();
                $jobq->get( 'recentChangesUpdate' )->delete();
+               $jobq->get( 'userGroupExpiry' )->delete();
                $cache->delete( $cache->makeKey( 'SiteStats', 'jobscount' ) );
 
                $jobq->push( new NullJob( Title::newMainPage(), [] ) );
index 63956c1..af49ecf 100644 (file)
@@ -4,7 +4,7 @@
  * @author Addshore
  * @covers TitleArrayFromResult
  */
-class TitleArrayFromResultTest extends PHPUnit_Framework_TestCase {
+class TitleArrayFromResultTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index dc2e9ae..e4b21ce 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers WikiReference
  */
-class WikiReferenceTest extends PHPUnit_Framework_TestCase {
+class WikiReferenceTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index dec7bf3..c7975ef 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @group Xml
  */
-class XmlJsTest extends PHPUnit_Framework_TestCase {
+class XmlJsTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index d47481c..aa579ab 100644 (file)
@@ -575,11 +575,11 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
        }
 
        public static function provideGetMessageFromException() {
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $usageException = new UsageException(
                        '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ]
                );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                return [
                        'Normal exception' => [
index 83eba54..67d323f 100644 (file)
@@ -500,9 +500,9 @@ class ApiMainTest extends ApiTestCase {
                        MWExceptionHandler::getRedactedTraceAsString( $dbex )
                )->inLanguage( 'en' )->useDatabase( false )->text();
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $usageEx = new UsageException( 'Usage exception!', 'ue', 0, [ 'foo' => 'bar' ] );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $apiEx1 = new ApiUsageException( null,
                        StatusValue::newFatal( new ApiRawMessage( 'An error', 'sv-error1' ) ) );
index 10bdfa7..b9e4645 100644 (file)
@@ -108,7 +108,7 @@ class ApiPageSetTest extends ApiTestCase {
                $userName = $user->getName();
                $userDbkey = str_replace( ' ', '_', $userName );
                $request = new FauxRequest( [
-                       'titles' => join( '|', [
+                       'titles' => implode( '|', [
                                'Special:MyContributions',
                                'Special:MyPage',
                                'Special:MyTalk/subpage',
index 6b60409..345f196 100644 (file)
@@ -456,9 +456,9 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $chunkSessionKey = false;
                $resultOffset = 0;
                // Open the file:
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $handle = fopen( $filePath, "r" );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                if ( $handle === false ) {
                        $this->markTestIncomplete( "could not open file: $filePath" );
@@ -466,9 +466,9 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                while ( !feof( $handle ) ) {
                        // Get the current chunk
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $chunkData = fread( $handle, $chunkSize );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
 
                        // Upload the current chunk into the $_FILE object:
                        $this->fakeUploadChunk( 'chunk', 'blob', $mimeType, $chunkData );
index 2371eea..d2bdb49 100644 (file)
@@ -157,7 +157,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 
        /**
         * Recursively merge the new result returned from the query to the previous results.
-        * @param mixed $results
+        * @param mixed &$results
         * @param mixed $newResult
         * @param bool $numericIds If true, treat keys as ids to be merged instead of appending
         */
index dd02793..1a7ed12 100644 (file)
@@ -5,7 +5,7 @@ namespace MediaWiki\Auth;
 use Psr\Log\LoggerInterface;
 use Wikimedia\TestingAccessWrapper;
 
-class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Framework_TestCase {
+class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit\Framework\TestCase {
        public function testConstructor() {
                $config = new \HashConfig( [
                        'EnableEmail' => true,
index d638d0f..ab42696 100644 (file)
@@ -52,9 +52,9 @@ class RecentChangeTest extends MediaWikiTestCase {
                $row->rc_deleted = 'bar';
                $row->rc_comment = 'comment';
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $rc = RecentChange::newFromRow( $row );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $expected = [
                        'rc_foo' => 'AAA',
index 9ade892..c607ae5 100644 (file)
@@ -7,7 +7,7 @@
  *
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
+class ComposerVersionNormalizerTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 379eebd..c833934 100644 (file)
@@ -2,7 +2,7 @@
 
 use Wikimedia\TestingAccessWrapper;
 
-class EtcdConfigTest extends PHPUnit_Framework_TestCase {
+class EtcdConfigTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 369aa83..2de35a7 100644 (file)
@@ -6,8 +6,6 @@ use Wikimedia\Rdbms\DatabaseSqlite;
 use Wikimedia\Rdbms\ResultWrapper;
 
 class DatabaseSqliteMock extends DatabaseSqlite {
-       private $lastQuery;
-
        public static function newInstance( array $p = [] ) {
                $p['dbFilePath'] = ':memory:';
                $p['schema'] = false;
@@ -16,8 +14,6 @@ class DatabaseSqliteMock extends DatabaseSqlite {
        }
 
        function query( $sql, $fname = '', $tempIgnore = false ) {
-               $this->lastQuery = $sql;
-
                return true;
        }
 
index fa9898d..606c12d 100644 (file)
@@ -108,7 +108,7 @@ class DatabaseTestHelper extends Database {
 
        public function tableExists( $table, $fname = __METHOD__ ) {
                $tableRaw = $this->tableName( $table, 'raw' );
-               if ( isset( $this->mSessionTempTables[$tableRaw] ) ) {
+               if ( isset( $this->sessionTempTables[$tableRaw] ) ) {
                        return true; // already known to exist
                }
 
index 356ebe5..2892283 100644 (file)
@@ -194,12 +194,12 @@ class LBFactoryTest extends MediaWikiTestCase {
         * @covers \Wikimedia\Rdbms\ChronologyProtector
         */
        public function testChronologyProtector() {
-               // (a) First HTTP request
-               $m1Pos = new MySQLMasterPos( 'db1034-bin.000976', '843431247' );
-               $m2Pos = new MySQLMasterPos( 'db1064-bin.002400', '794074907' );
-
                $now = microtime( true );
 
+               // (a) First HTTP request
+               $m1Pos = new MySQLMasterPos( 'db1034-bin.000976/843431247', $now );
+               $m2Pos = new MySQLMasterPos( 'db1064-bin.002400/794074907', $now );
+
                // Master DB 1
                $mockDB1 = $this->getMockBuilder( DatabaseMysqli::class )
                        ->disableOriginalConstructor()
@@ -506,9 +506,9 @@ class LBFactoryTest extends MediaWikiTestCase {
                        $this->assertInstanceOf( \Wikimedia\Rdbms\DBConnectionError::class, $e );
                        $this->assertFalse( $db->isOpen() );
                } else {
-                       \MediaWiki\suppressWarnings();
+                       \Wikimedia\suppressWarnings();
                        $this->assertFalse( $db->selectDB( 'garbage-db' ) );
-                       \MediaWiki\restoreWarnings();
+                       \Wikimedia\restoreWarnings();
                }
 
                $lb->reuseConnection( $db ); // don't care
index 372f732..6f0b1db 100644 (file)
@@ -11,13 +11,13 @@ class MWDebugTest extends MediaWikiTestCase {
        public static function setUpBeforeClass() {
                parent::setUpBeforeClass();
                MWDebug::init();
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
        }
 
        public static function tearDownAfterClass() {
                parent::tearDownAfterClass();
                MWDebug::deinit();
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
        }
 
        /**
index 915a186..baa4df7 100644 (file)
@@ -50,9 +50,9 @@ class AvroFormatterTest extends MediaWikiTestCase {
                // disable conversion of notices
                PHPUnit_Framework_Error_Notice::$enabled = false;
                // have to keep the user notice from being output
-               \MediaWiki\suppressWarnings();
+               \Wikimedia\suppressWarnings();
                $res = $formatter->format( [ 'channel' => 'marty' ] );
-               \MediaWiki\restoreWarnings();
+               \Wikimedia\restoreWarnings();
                PHPUnit_Framework_Error_Notice::$enabled = $noticeEnabled;
                $this->assertNull( $res );
        }
index 8086b4b..1ee188e 100644 (file)
@@ -2,7 +2,7 @@
 
 namespace MediaWiki\Logger\Monolog;
 
-class LogstashFormatterTest extends \PHPUnit_Framework_TestCase {
+class LogstashFormatterTest extends \PHPUnit\Framework\TestCase {
        /**
         * @dataProvider provideV1
         * @param array $record The input record.
index 6977aef..3ab9b56 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers MWCallableUpdate
  */
-class MWCallableUpdateTest extends PHPUnit_Framework_TestCase {
+class MWCallableUpdateTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 1261c24..693897e 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers TransactionRoundDefiningUpdate
  */
-class TransactionRoundDefiningUpdateTest extends PHPUnit_Framework_TestCase {
+class TransactionRoundDefiningUpdateTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index dcdb1cd..b706fac 100644 (file)
@@ -10,8 +10,10 @@ class BadTitleErrorTest extends MediaWikiTestCase {
                try {
                        throw new BadTitleError();
                } catch ( BadTitleError $e ) {
+                       ob_start();
                        $e->report();
-                       $this->assertTrue( true );
+                       $text = ob_get_clean();
+                       $this->assertContains( $e->getText(), $text );
                }
        }
 
index 15f0896..5214b6d 100644 (file)
@@ -11,8 +11,10 @@ class ThrottledErrorTest extends MediaWikiTestCase {
                try {
                        throw new ThrottledError();
                } catch ( ThrottledError $e ) {
+                       ob_start();
                        $e->report();
-                       $this->assertTrue( true );
+                       $text = ob_get_clean();
+                       $this->assertContains( $e->getText(), $text );
                }
        }
 
index d43e04a..f762693 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers ExternalStoreFactory
  */
-class ExternalStoreFactoryTest extends PHPUnit_Framework_TestCase {
+class ExternalStoreFactoryTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 31ad1ba..2cd4ba6 100644 (file)
@@ -2584,9 +2584,9 @@ class FileBackendTest extends MediaWikiTestCase {
                        ]
                ];
 
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $actual = $be->sanitizeOpHeaders( $input );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
 
                $this->assertEquals( $expected, $actual, "Header sanitized properly" );
        }
index 75c93be..c4290e1 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers HTMLRestrictionsField
  */
-class HTMLRestrictionsFieldTest extends PHPUnit_Framework_TestCase {
+class HTMLRestrictionsFieldTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index d5a267e..b5d6144 100644 (file)
@@ -8,7 +8,7 @@
  * @licence GNU GPL v2+
  * @author Thiemo Kreuz
  */
-class JobQueueMemoryTest extends PHPUnit_Framework_TestCase {
+class JobQueueMemoryTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 8831265..4fbbc99 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @group Database
  */
-class ArrayUtilsTest extends PHPUnit_Framework_TestCase {
+class ArrayUtilsTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index c995840..c9cdf58 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers DeferredStringifier
  */
-class DeferredStringifierTest extends PHPUnit_Framework_TestCase {
+class DeferredStringifierTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 264cc00..1b3397c 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers DnsSrvDiscoverer
  */
-class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase {
+class DnsSrvDiscovererTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 3e8aaeb..a7cf755 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-abstract class GenericArrayObjectTest extends PHPUnit_Framework_TestCase {
+abstract class GenericArrayObjectTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 040bebf..ba28828 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @group HashRing
  */
-class HashRingTest extends PHPUnit_Framework_TestCase {
+class HashRingTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index eb601e7..c5e87e4 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers HtmlArmor
  */
-class HtmlArmorTest extends PHPUnit_Framework_TestCase {
+class HtmlArmorTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 8192f01..03c7b0c 100644 (file)
@@ -5,7 +5,7 @@
  * @todo tests below for findIE6Extension should be split into...
  *    ...a dataprovider and test method.
  */
-class IEUrlExtensionTest extends PHPUnit_Framework_TestCase {
+class IEUrlExtensionTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index a36b259..6a75181 100644 (file)
@@ -8,7 +8,7 @@
  * @todo Test methods in this call should be split into a method and a
  * dataprovider.
  */
-class IPTest extends PHPUnit_Framework_TestCase {
+class IPTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 6734976..6105678 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
+class JavaScriptMinifierTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
@@ -190,9 +190,9 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                // JSMin+'s parser will throw an exception if output is not valid JS.
                // suppression of warnings needed for stupid crap
                if ( $expectedValid ) {
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $parser = new JSParser();
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
                        $parser->parse( $minified, 'minify-test.js', 1 );
                }
 
index 57c9831..695a734 100644 (file)
@@ -3,7 +3,7 @@
  * PHP Unit tests for MWMessagePack
  * @covers MWMessagePack
  */
-class MWMessagePackTest extends PHPUnit_Framework_TestCase {
+class MWMessagePackTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 363b081..2a962b7 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * @group Cache
  */
-class MapCacheLRUTest extends PHPUnit_Framework_TestCase {
+class MapCacheLRUTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index d09171c..d64ba3d 100644 (file)
@@ -24,7 +24,7 @@ class ArrayBackedMemoizedCallable extends MemoizedCallable {
  * PHP Unit tests for MemoizedCallable class.
  * @covers MemoizedCallable
  */
-class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
+class MemoizedCallableTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index ddb7bfa..c8940e5 100644 (file)
@@ -9,7 +9,7 @@
  *
  * @group Cache
  */
-class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
+class ProcessCacheLRUTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index d0e404b..85b8c62 100644 (file)
@@ -6,7 +6,7 @@ use Liuggio\StatsdClient\Sender\SenderInterface;
 /**
  * @covers SamplingStatsdClient
  */
-class SamplingStatsdClientTest extends PHPUnit_Framework_TestCase {
+class SamplingStatsdClientTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 3e5ccac..fcfa53e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class StringUtilsTest extends PHPUnit_Framework_TestCase {
+class StringUtilsTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 7e166f8..581a518 100644 (file)
@@ -19,7 +19,7 @@
  * @author Ori Livneh <ori@wikimedia.org>
  */
 
-class TimingTest extends PHPUnit_Framework_TestCase {
+class TimingTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index d226227..1cbd86f 100644 (file)
@@ -24,7 +24,7 @@
  * @copyright © 2014 Wikimedia Foundation and contributors
  * @since 1.25
  */
-class XhprofDataTest extends PHPUnit_Framework_TestCase {
+class XhprofDataTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index e2723b9..0ea1328 100644 (file)
@@ -18,7 +18,7 @@
  * @file
  */
 
-class XhprofTest extends PHPUnit_Framework_TestCase {
+class XhprofTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 8a11d87..8616b41 100644 (file)
@@ -5,7 +5,7 @@
  * @group Xml
  * @covers XMLTypeCheck
  */
-class XmlTypeCheckTest extends PHPUnit_Framework_TestCase {
+class XmlTypeCheckTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 10dca7d..02eac11 100644 (file)
@@ -7,7 +7,7 @@ use Wikimedia\Http\HttpAcceptNegotiator;
  *
  * @author Daniel Kinzler
  */
-class HttpAcceptNegotiatorTest extends \PHPUnit_Framework_TestCase {
+class HttpAcceptNegotiatorTest extends \PHPUnit\Framework\TestCase {
 
        public function provideGetFirstSupportedValue() {
                return [
index 788c297..e4b47b4 100644 (file)
@@ -7,7 +7,7 @@ use Wikimedia\Http\HttpAcceptParser;
  *
  * @author Daniel Kinzler
  */
-class HttpAcceptParserTest extends \PHPUnit_Framework_TestCase {
+class HttpAcceptParserTest extends \PHPUnit\Framework\TestCase {
 
        public function provideParseWeights() {
                return [
index 1f3cae5..fbe5a2b 100644 (file)
@@ -3,7 +3,7 @@
  * @group Media
  * @covers MimeAnalyzer
  */
-class MimeAnalyzerTest extends PHPUnit_Framework_TestCase {
+class MimeAnalyzerTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index d71b16c..d0360a9 100644 (file)
@@ -5,7 +5,7 @@ use Wikimedia\TestingAccessWrapper;
 /**
  * @group BagOStuff
  */
-class CachedBagOStuffTest extends PHPUnit_Framework_TestCase {
+class CachedBagOStuffTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 9eb3409..332e23b 100644 (file)
@@ -5,7 +5,7 @@ use Wikimedia\TestingAccessWrapper;
 /**
  * @group BagOStuff
  */
-class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
+class HashBagOStuffTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index ca78f65..77198f9 100644 (file)
@@ -16,7 +16,7 @@ use Wikimedia\TestingAccessWrapper;
  * @covers WANObjectCache::getInterimValue
  * @covers WANObjectCache::setInterimValue
  */
-class WANObjectCacheTest extends PHPUnit_Framework_TestCase {
+class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 25613fe..538d625 100644 (file)
@@ -6,7 +6,7 @@ use Psr\Log\LoggerInterface;
 /**
  * @covers \Wikimedia\Rdbms\TransactionProfiler
  */
-class TransactionProfilerTest extends PHPUnit_Framework_TestCase {
+class TransactionProfilerTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 2a707d3..dd86a73 100644 (file)
@@ -12,7 +12,7 @@ use Wikimedia\Rdbms\ConnectionManager;
  *
  * @author Daniel Kinzler
  */
-class ConnectionManagerTest extends \PHPUnit_Framework_TestCase {
+class ConnectionManagerTest extends \PHPUnit\Framework\TestCase {
 
        /**
         * @return IDatabase|PHPUnit_Framework_MockObject_MockObject
index 20ce095..8d7d104 100644 (file)
@@ -12,7 +12,7 @@ use Wikimedia\Rdbms\SessionConsistentConnectionManager;
  *
  * @author Daniel Kinzler
  */
-class SessionConsistentConnectionManagerTest extends \PHPUnit_Framework_TestCase {
+class SessionConsistentConnectionManagerTest extends \PHPUnit\Framework\TestCase {
 
        /**
         * @return IDatabase|PHPUnit_Framework_MockObject_MockObject
index e660265..d1f961a 100644 (file)
@@ -10,7 +10,7 @@ use Wikimedia\Rdbms\ResultWrapper;
 /**
  * @covers Wikimedia\Rdbms\DBConnRef
  */
-class DBConnRefTest extends PHPUnit_Framework_TestCase {
+class DBConnRefTest extends PHPUnit\Framework\TestCase {
 
        /**
         * @return ILoadBalancer
index 4e5f735..b13e8fc 100644 (file)
@@ -5,7 +5,7 @@ use Wikimedia\Rdbms\DatabaseDomain;
 /**
  * @covers Wikimedia\Rdbms\DatabaseDomain
  */
-class DatabaseDomainTest extends PHPUnit_Framework_TestCase {
+class DatabaseDomainTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index caf1281..b9f57b5 100644 (file)
@@ -109,7 +109,7 @@ class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
        }
 }
 
-class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase {
+class DatabaseMysqlBaseTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
@@ -216,17 +216,32 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase {
                        $db->listViews( '' ) );
        }
 
+       public function testBinLogName() {
+               $pos = new MySQLMasterPos( "db1052.2424/4643", 1 );
+
+               $this->assertEquals( "db1052", $pos->binlog );
+               $this->assertEquals( "db1052.2424", $pos->getLogFile() );
+               $this->assertEquals( [ 2424, 4643 ], $pos->pos );
+       }
+
        /**
         * @dataProvider provideComparePositions
         * @covers Wikimedia\Rdbms\MySQLMasterPos
         */
-       public function testHasReached( MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos, $match ) {
+       public function testHasReached(
+               MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos, $match, $hetero
+       ) {
                if ( $match ) {
                        $this->assertTrue( $lowerPos->channelsMatch( $higherPos ) );
 
-                       $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
-                       $this->assertTrue( $higherPos->hasReached( $higherPos ) );
+                       if ( $hetero ) {
+                               // Each position is has one channel higher than the other
+                               $this->assertFalse( $higherPos->hasReached( $lowerPos ) );
+                       } else {
+                               $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
+                       }
                        $this->assertTrue( $lowerPos->hasReached( $lowerPos ) );
+                       $this->assertTrue( $higherPos->hasReached( $higherPos ) );
                        $this->assertFalse( $lowerPos->hasReached( $higherPos ) );
                } else { // channels don't match
                        $this->assertFalse( $lowerPos->channelsMatch( $higherPos ) );
@@ -237,53 +252,100 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase {
        }
 
        public static function provideComparePositions() {
+               $now = microtime( true );
+
                return [
                        // Binlog style
                        [
-                               new MySQLMasterPos( 'db1034-bin.000976', '843431247' ),
-                               new MySQLMasterPos( 'db1034-bin.000976', '843431248' ),
-                               true
+                               new MySQLMasterPos( 'db1034-bin.000976/843431247', $now ),
+                               new MySQLMasterPos( 'db1034-bin.000976/843431248', $now ),
+                               true,
+                               false
                        ],
                        [
-                               new MySQLMasterPos( 'db1034-bin.000976', '999' ),
-                               new MySQLMasterPos( 'db1034-bin.000976', '1000' ),
-                               true
+                               new MySQLMasterPos( 'db1034-bin.000976/999', $now ),
+                               new MySQLMasterPos( 'db1034-bin.000976/1000', $now ),
+                               true,
+                               false
                        ],
                        [
-                               new MySQLMasterPos( 'db1034-bin.000976', '999' ),
-                               new MySQLMasterPos( 'db1035-bin.000976', '1000' ),
+                               new MySQLMasterPos( 'db1034-bin.000976/999', $now ),
+                               new MySQLMasterPos( 'db1035-bin.000976/1000', $now ),
+                               false,
                                false
                        ],
                        // MySQL GTID style
                        [
-                               new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:23' ),
-                               new MySQLMasterPos( 'db1-bin.2', '2', '3E11FA47-71CA-11E1-9E33-C80AA9429562:24' ),
-                               true
+                               new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:23', $now ),
+                               new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:24', $now ),
+                               true,
+                               false
                        ],
                        [
-                               new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ),
-                               new MySQLMasterPos( 'db1-bin.2', '2', '3E11FA47-71CA-11E1-9E33-C80AA9429562:100' ),
-                               true
+                               new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:99', $now ),
+                               new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:100', $now ),
+                               true,
+                               false
                        ],
                        [
-                               new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ),
-                               new MySQLMasterPos( 'db1-bin.2', '2', '1E11FA47-71CA-11E1-9E33-C80AA9429562:100' ),
+                               new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:99', $now ),
+                               new MySQLMasterPos( '1E11FA47-71CA-11E1-9E33-C80AA9429562:100', $now ),
+                               false,
                                false
                        ],
                        // MariaDB GTID style
                        [
-                               new MySQLMasterPos( 'db1-bin.2', '1', '255-11-23' ),
-                               new MySQLMasterPos( 'db1-bin.2', '2', '255-11-24' ),
-                               true
+                               new MySQLMasterPos( '255-11-23', $now ),
+                               new MySQLMasterPos( '255-11-24', $now ),
+                               true,
+                               false
+                       ],
+                       [
+                               new MySQLMasterPos( '255-11-99', $now ),
+                               new MySQLMasterPos( '255-11-100', $now ),
+                               true,
+                               false
+                       ],
+                       [
+                               new MySQLMasterPos( '255-11-999', $now ),
+                               new MySQLMasterPos( '254-11-1000', $now ),
+                               false,
+                               false
+                       ],
+                       [
+                               new MySQLMasterPos( '255-11-23,256-12-50', $now ),
+                               new MySQLMasterPos( '255-11-24', $now ),
+                               true,
+                               false
+                       ],
+                       [
+                               new MySQLMasterPos( '255-11-99,256-12-50,257-12-50', $now ),
+                               new MySQLMasterPos( '255-11-1000', $now ),
+                               true,
+                               false
+                       ],
+                       [
+                               new MySQLMasterPos( '255-11-23,256-12-50', $now ),
+                               new MySQLMasterPos( '255-11-24,155-52-63', $now ),
+                               true,
+                               false
+                       ],
+                       [
+                               new MySQLMasterPos( '255-11-99,256-12-50,257-12-50', $now ),
+                               new MySQLMasterPos( '255-11-1000,256-12-51', $now ),
+                               true,
+                               false
                        ],
                        [
-                               new MySQLMasterPos( 'db1-bin.2', '1', '255-11-99' ),
-                               new MySQLMasterPos( 'db1-bin.2', '2', '255-11-100' ),
+                               new MySQLMasterPos( '255-11-99,256-12-50', $now ),
+                               new MySQLMasterPos( '255-13-1000,256-14-49', $now ),
+                               true,
                                true
                        ],
                        [
-                               new MySQLMasterPos( 'db1-bin.2', '1', '255-11-999' ),
-                               new MySQLMasterPos( 'db1-bin.2', '2', '254-11-1000' ),
+                               new MySQLMasterPos( '253-11-999,255-11-999', $now ),
+                               new MySQLMasterPos( '254-11-1000', $now ),
+                               false,
                                false
                        ],
                ];
@@ -296,33 +358,70 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase {
        public function testChannelsMatch( MySQLMasterPos $pos1, MySQLMasterPos $pos2, $matches ) {
                $this->assertEquals( $matches, $pos1->channelsMatch( $pos2 ) );
                $this->assertEquals( $matches, $pos2->channelsMatch( $pos1 ) );
+
+               $roundtripPos = new MySQLMasterPos( (string)$pos1, 1 );
+               $this->assertEquals( (string)$pos1, (string)$roundtripPos );
        }
 
        public static function provideChannelPositions() {
+               $now = microtime( true );
+
                return [
                        [
-                               new MySQLMasterPos( 'db1034-bin.000876', '44' ),
-                               new MySQLMasterPos( 'db1034-bin.000976', '74' ),
+                               new MySQLMasterPos( 'db1034-bin.000876/44', $now ),
+                               new MySQLMasterPos( 'db1034-bin.000976/74', $now ),
                                true
                        ],
                        [
-                               new MySQLMasterPos( 'db1052-bin.000976', '999' ),
-                               new MySQLMasterPos( 'db1052-bin.000976', '1000' ),
+                               new MySQLMasterPos( 'db1052-bin.000976/999', $now ),
+                               new MySQLMasterPos( 'db1052-bin.000976/1000', $now ),
                                true
                        ],
                        [
-                               new MySQLMasterPos( 'db1066-bin.000976', '9999' ),
-                               new MySQLMasterPos( 'db1035-bin.000976', '10000' ),
+                               new MySQLMasterPos( 'db1066-bin.000976/9999', $now ),
+                               new MySQLMasterPos( 'db1035-bin.000976/10000', $now ),
                                false
                        ],
                        [
-                               new MySQLMasterPos( 'db1066-bin.000976', '9999' ),
-                               new MySQLMasterPos( 'trump2016.000976', '10000' ),
+                               new MySQLMasterPos( 'db1066-bin.000976/9999', $now ),
+                               new MySQLMasterPos( 'trump2016.000976/10000', $now ),
                                false
                        ],
                ];
        }
 
+       /**
+        * @dataProvider provideCommonDomainGTIDs
+        * @covers Wikimedia\Rdbms\MySQLMasterPos
+        */
+       public function testCommonGtidDomains( MySQLMasterPos $pos, MySQLMasterPos $ref, $gtids ) {
+               $this->assertEquals( $gtids, MySQLMasterPos::getCommonDomainGTIDs( $pos, $ref ) );
+       }
+
+       public static function provideCommonDomainGTIDs() {
+               return [
+                       [
+                               new MySQLMasterPos( '255-13-99,256-12-50,257-14-50', 1 ),
+                               new MySQLMasterPos( '255-11-1000', 1 ),
+                               [ '255-13-99' ]
+                       ],
+                       [
+                               new MySQLMasterPos(
+                                       '2E11FA47-71CA-11E1-9E33-C80AA9429562:5,' .
+                                       '3E11FA47-71CA-11E1-9E33-C80AA9429562:99,' .
+                                       '7E11FA47-71CA-11E1-9E33-C80AA9429562:30',
+                                       1
+                               ),
+                               new MySQLMasterPos(
+                                       '1E11FA47-71CA-11E1-9E33-C80AA9429562:100,' .
+                                       '3E11FA47-71CA-11E1-9E33-C80AA9429562:66',
+                                       1
+                               ),
+                               [ '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ]
+                       ]
+               ];
+       }
+
        /**
         * @dataProvider provideLagAmounts
         * @covers Wikimedia\Rdbms\DatabaseMysqlBase::getLag
index d8ebeff..ebf6e45 100644 (file)
@@ -6,7 +6,7 @@ use Wikimedia\Rdbms\LikeMatch;
  * Test the parts of the Database abstract class that deal
  * with creating SQL text.
  */
-class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
+class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
@@ -559,11 +559,11 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
                                        'uniqueIndexes' => [ 'field' ],
                                        'rows' => [ 'field' => 'text', 'field2' => 'text2' ],
                                ],
-                               "DELETE FROM replace_table " .
+                               "BEGIN; DELETE FROM replace_table " .
                                        "WHERE (field = 'text'); " .
                                        "INSERT INTO replace_table " .
                                        "(field,field2) " .
-                                       "VALUES ('text','text2')"
+                                       "VALUES ('text','text2'); COMMIT"
                        ],
                        [
                                [
@@ -575,11 +575,11 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
                                                'md_deps' => 'deps',
                                        ],
                                ],
-                               "DELETE FROM module_deps " .
+                               "BEGIN; DELETE FROM module_deps " .
                                        "WHERE (md_module = 'module' AND md_skin = 'skin'); " .
                                        "INSERT INTO module_deps " .
                                        "(md_module,md_skin,md_deps) " .
-                                       "VALUES ('module','skin','deps')"
+                                       "VALUES ('module','skin','deps'); COMMIT"
                        ],
                        [
                                [
@@ -597,7 +597,7 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
                                                ],
                                        ],
                                ],
-                               "DELETE FROM module_deps " .
+                               "BEGIN; DELETE FROM module_deps " .
                                        "WHERE (md_module = 'module' AND md_skin = 'skin'); " .
                                        "INSERT INTO module_deps " .
                                        "(md_module,md_skin,md_deps) " .
@@ -606,7 +606,7 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
                                        "WHERE (md_module = 'module2' AND md_skin = 'skin2'); " .
                                        "INSERT INTO module_deps " .
                                        "(md_module,md_skin,md_deps) " .
-                                       "VALUES ('module2','skin2','deps2')"
+                                       "VALUES ('module2','skin2','deps2'); COMMIT"
                        ],
                        [
                                [
@@ -624,7 +624,7 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
                                                ],
                                        ],
                                ],
-                               "DELETE FROM module_deps " .
+                               "BEGIN; DELETE FROM module_deps " .
                                        "WHERE (md_module = 'module') OR (md_skin = 'skin'); " .
                                        "INSERT INTO module_deps " .
                                        "(md_module,md_skin,md_deps) " .
@@ -633,7 +633,7 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
                                        "WHERE (md_module = 'module2') OR (md_skin = 'skin2'); " .
                                        "INSERT INTO module_deps " .
                                        "(md_module,md_skin,md_deps) " .
-                                       "VALUES ('module2','skin2','deps2')"
+                                       "VALUES ('module2','skin2','deps2'); COMMIT"
                        ],
                        [
                                [
@@ -645,9 +645,9 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
                                                'md_deps' => 'deps',
                                        ],
                                ],
-                               "INSERT INTO module_deps " .
+                               "BEGIN; INSERT INTO module_deps " .
                                        "(md_module,md_skin,md_deps) " .
-                                       "VALUES ('module','skin','deps')"
+                                       "VALUES ('module','skin','deps'); COMMIT"
                        ],
                ];
        }
index e131506..542470d 100644 (file)
@@ -5,7 +5,7 @@ use Wikimedia\Rdbms\LBFactorySingle;
 use Wikimedia\Rdbms\TransactionProfiler;
 use Wikimedia\TestingAccessWrapper;
 
-class DatabaseTest extends PHPUnit_Framework_TestCase {
+class DatabaseTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
@@ -370,10 +370,34 @@ class DatabaseTest extends PHPUnit_Framework_TestCase {
                $this->assertFalse( (bool)$db->trxLevel(), "Transaction cleared." );
        }
 
+       /**
+        * @covers Wikimedia\Rdbms\Database::getScopedLockAndFlush
+        * @covers Wikimedia\Rdbms\Database::lock
+        * @covers Wikimedia\Rdbms\Database::unlock
+        * @covers Wikimedia\Rdbms\Database::lockIsFree
+        */
        public function testGetScopedLock() {
                $db = $this->getMockDB( [ 'isOpen' ] );
                $db->method( 'isOpen' )->willReturn( true );
 
+               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
+               $this->assertEquals( true, $db->lock( 'x', __METHOD__ ) );
+               $this->assertEquals( false, $db->lockIsFree( 'x', __METHOD__ ) );
+               $this->assertEquals( true, $db->unlock( 'x', __METHOD__ ) );
+               $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
+               $this->assertEquals( 0, $db->trxLevel() );
+
+               $db->setFlag( DBO_TRX );
+               $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
+               $this->assertEquals( true, $db->lock( 'x', __METHOD__ ) );
+               $this->assertEquals( false, $db->lockIsFree( 'x', __METHOD__ ) );
+               $this->assertEquals( true, $db->unlock( 'x', __METHOD__ ) );
+               $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
+               $db->clearFlag( DBO_TRX );
+
+               $this->assertEquals( 0, $db->trxLevel() );
+
                $db->setFlag( DBO_TRX );
                try {
                        $this->badLockingMethodImplicit( $db );
index 7becad2..73fd471 100644 (file)
@@ -4,7 +4,7 @@
  * @group Media
  * @covers XMPReader
  */
-class XMPTest extends PHPUnit_Framework_TestCase {
+class XMPTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 0785920..746f68a 100644 (file)
@@ -5,7 +5,7 @@ use Psr\Log\NullLogger;
 /**
  * @group Media
  */
-class XMPValidateTest extends PHPUnit_Framework_TestCase {
+class XMPValidateTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 6e8c9ce..df5614d 100644 (file)
@@ -5,7 +5,7 @@ use Wikimedia\TestingAccessWrapper;
 /**
  * @group BagOStuff
  */
-class RedisBagOStuffTest extends PHPUnit_Framework_TestCase {
+class RedisBagOStuffTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 0390aeb..0e1605a 100644 (file)
@@ -23,8 +23,10 @@ use Wikimedia\ScopedCallback;
  * @covers DateFormatter
  * @covers LinkHolderArray
  * @covers StripState
+ * @covers ParserOptions
+ * @covers ParserOutput
  */
-class ParserIntegrationTest extends PHPUnit_Framework_TestCase {
+class ParserIntegrationTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index d55372c..e2ed1d5 100644 (file)
@@ -141,23 +141,6 @@ class ParserOptionsTest extends MediaWikiTestCase {
                $confstr .= '!onPageRenderingHash';
        }
 
-       // Test weird historical behavior is still weird
-       public function testOptionsHashEditSection() {
-               $popt = ParserOptions::newCanonical();
-               $popt->registerWatcher( function ( $name ) {
-                       $this->assertNotEquals( 'editsection', $name );
-               } );
-
-               $this->assertTrue( $popt->getEditSection() );
-               $this->assertSame( 'canonical', $popt->optionsHash( [] ) );
-               $this->assertSame( 'canonical', $popt->optionsHash( [ 'editsection' ] ) );
-
-               $popt->setEditSection( false );
-               $this->assertFalse( $popt->getEditSection() );
-               $this->assertSame( 'canonical', $popt->optionsHash( [] ) );
-               $this->assertSame( 'editsection=0', $popt->optionsHash( [ 'editsection' ] ) );
-       }
-
        /**
         * @expectedException InvalidArgumentException
         * @expectedExceptionMessage Unknown parser option bogus
index efcc4e0..b08ba6c 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 
-use Wikimedia\TestingAccessWrapper;
-
 /**
  * @group Database
  *        ^--- trigger DB shadowing because we are using Title magic
@@ -95,31 +93,17 @@ class ParserOutputTest extends MediaWikiTestCase {
         * @covers ParserOutput::getText
         * @dataProvider provideGetText
         * @param array $options Options to getText()
-        * @param array $poState ParserOptions state fields to set
         * @param string $text Parser text
         * @param string $expect Expected output
         */
-       public function testGetText( $options, $poState, $text, $expect ) {
+       public function testGetText( $options, $text, $expect ) {
                $this->setMwGlobals( [
                        'wgArticlePath' => '/wiki/$1',
                        'wgScriptPath' => '/w',
                        'wgScript' => '/w/index.php',
                ] );
-               $this->hideDeprecated( 'ParserOutput stateful allowTOC' );
-               $this->hideDeprecated( 'ParserOutput stateful enableSectionEditLinks' );
 
                $po = new ParserOutput( $text );
-
-               // Emulate Parser
-               $po->setEditSectionTokens( true );
-
-               if ( $poState ) {
-                       $wrap = TestingAccessWrapper::newFromObject( $po );
-                       foreach ( $poState as $key => $value ) {
-                               $wrap->$key = $value;
-                       }
-               }
-
                $actual = $po->getText( $options );
                $this->assertSame( $expect, $actual );
        }
@@ -155,90 +139,22 @@ class ParserOutputTest extends MediaWikiTestCase {
 </p></div>
 EOF;
 
-               return [
-                       'No stateless options, default state' => [
-                               [], [], $text, <<<EOF
-<div class="mw-parser-output"><p>Test document.
-</p>
-<div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
-</ul>
-</div>
-
-<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p>One
-</p>
-<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p>Two
-</p>
-<h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=3" title="Edit section: Section 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<p>Two point one
-</p>
-<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=4" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p>Three
-</p></div>
-EOF
-                       ],
-                       'No stateless options, TOC statefully disabled' => [
-                               [], [ 'mTOCEnabled' => false ], $text, <<<EOF
-<div class="mw-parser-output"><p>Test document.
-</p>
-
-<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p>One
-</p>
-<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p>Two
-</p>
-<h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=3" title="Edit section: Section 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<p>Two point one
-</p>
-<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=4" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p>Three
-</p></div>
-EOF
-                       ],
-                       'No stateless options, section edits statefully disabled' => [
-                               [], [ 'mEditSectionTokens' => false ], $text, <<<EOF
-<div class="mw-parser-output"><p>Test document.
-</p>
-<div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
-</ul>
-</div>
+               $dedupText = <<<EOF
+<p>This is a test document.</p>
+<style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
+<style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
+<style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
+<style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
+<style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
+<style data-mw-not-deduplicate="duplicate1">.Duplicate1 {}</style>
+<style data-mw-deduplicate="duplicate1">.Same-attribute-different-content {}</style>
+<style data-mw-deduplicate="duplicate3">.Duplicate1 {}</style>
+<style>.Duplicate1 {}</style>
+EOF;
 
-<h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
-<p>One
-</p>
-<h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
-<p>Two
-</p>
-<h3><span class="mw-headline" id="Section_2.1">Section 2.1</span></h3>
-<p>Two point one
-</p>
-<h2><span class="mw-headline" id="Section_3">Section 3</span></h2>
-<p>Three
-</p></div>
-EOF
-                       ],
-                       'Stateless options override stateful settings' => [
-                               [ 'allowTOC' => true, 'enableSectionEditLinks' => true ],
-                               [ 'mTOCEnabled' => false, 'mEditSectionTokens' => false ],
-                               $text, <<<EOF
+               return [
+                       'No options' => [
+                               [], $text, <<<EOF
 <div class="mw-parser-output"><p>Test document.
 </p>
 <div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
@@ -267,8 +183,8 @@ EOF
 </p></div>
 EOF
                        ],
-                       'Statelessly disable section edit links' => [
-                               [ 'enableSectionEditLinks' => false ], [], $text, <<<EOF
+                       'Disable section edit links' => [
+                               [ 'enableSectionEditLinks' => false ], $text, <<<EOF
 <div class="mw-parser-output"><p>Test document.
 </p>
 <div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
@@ -297,8 +213,8 @@ EOF
 </p></div>
 EOF
                        ],
-                       'Statelessly disable TOC' => [
-                               [ 'allowTOC' => false ], [], $text, <<<EOF
+                       'Disable TOC' => [
+                               [ 'allowTOC' => false ], $text, <<<EOF
 <div class="mw-parser-output"><p>Test document.
 </p>
 
@@ -316,8 +232,8 @@ EOF
 </p></div>
 EOF
                        ],
-                       'Statelessly unwrap text' => [
-                               [ 'unwrap' => true ], [], $text, <<<EOF
+                       'Unwrap text' => [
+                               [ 'unwrap' => true ], $text, <<<EOF
 <p>Test document.
 </p>
 <div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
@@ -347,7 +263,29 @@ EOF
 EOF
                        ],
                        'Unwrap without a mw-parser-output wrapper' => [
-                               [ 'unwrap' => true ], [], '<div class="foobar">Content</div>', '<div class="foobar">Content</div>'
+                               [ 'unwrap' => true ], '<div class="foobar">Content</div>', '<div class="foobar">Content</div>'
+                       ],
+                       'Unwrap with extra comment at end' => [
+                               [ 'unwrap' => true ], '<div class="mw-parser-output"><p>Test document.</p></div>
+<!-- Saved in parser cache... -->', '<p>Test document.</p>
+<!-- Saved in parser cache... -->'
+                       ],
+                       'Style deduplication' => [
+                               [], $dedupText, <<<EOF
+<p>This is a test document.</p>
+<style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
+<link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
+<style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
+<link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
+<link rel="mw-deduplicated-inline-style" href="mw-data:duplicate2"/>
+<style data-mw-not-deduplicate="duplicate1">.Duplicate1 {}</style>
+<link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
+<style data-mw-deduplicate="duplicate3">.Duplicate1 {}</style>
+<style>.Duplicate1 {}</style>
+EOF
+                       ],
+                       'Style deduplication disabled' => [
+                               [ 'deduplicateStyles' => false ], $dedupText, $dedupText
                        ],
                ];
                // phpcs:enable
diff --git a/tests/phpunit/includes/registration/ExtensionJsonValidatorTest.php b/tests/phpunit/includes/registration/ExtensionJsonValidatorTest.php
new file mode 100644 (file)
index 0000000..d69ad59
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Copyright (C) 2018 Kunal Mehta <legoktm@member.fsf.org>
+ *
+ * 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.
+ *
+ */
+
+/**
+ * @covers ExtensionJsonValidator
+ */
+class ExtensionJsonValidatorTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideValidate
+        */
+       public function testValidate( $file, $expected ) {
+               // If a dependency is missing, skip this test.
+               $validator = new ExtensionJsonValidator( function ( $msg ) {
+                       $this->markTestSkipped( $msg );
+               } );
+
+               if ( is_string( $expected ) ) {
+                       $this->setExpectedException(
+                               ExtensionJsonValidationError::class,
+                               $expected
+                       );
+               }
+
+               $dir = __DIR__ . '/../../data/registration/';
+               $this->assertSame(
+                       $expected,
+                       $validator->validate( $dir . $file )
+               );
+       }
+
+       public function provideValidate() {
+               return [
+                       [
+                               'notjson.txt',
+                               'notjson.txt is not valid JSON'
+                       ],
+                       [
+                               'no_manifest_version.json',
+                               'no_manifest_version.json does not have manifest_version set.'
+                       ],
+                       [
+                               'old_manifest_version.json',
+                               'old_manifest_version.json is using a non-supported schema version'
+                       ],
+                       [
+                               'newer_manifest_version.json',
+                               'newer_manifest_version.json is using a non-supported schema version'
+                       ],
+                       [
+                               'bad_spdx.json',
+                               "bad_spdx.json did not pass validation.
+[license-name] Invalid SPDX license identifier, see <https://spdx.org/licenses/>"
+                       ],
+                       [
+                               'invalid.json',
+                               "invalid.json did not pass validation.
+[license-name] Array value found, but a string is required"
+                       ],
+                       [
+                               'good.json',
+                               true
+                       ],
+               ];
+       }
+
+}
index 4282652..d9e091d 100644 (file)
@@ -2,6 +2,9 @@
 
 use Wikimedia\TestingAccessWrapper;
 
+/**
+ * @covers ExtensionProcessor
+ */
 class ExtensionProcessorTest extends MediaWikiTestCase {
 
        private $dir, $dirname;
@@ -21,9 +24,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                'name' => 'FooBar',
        ];
 
-       /**
-        * @covers ExtensionProcessor::extractInfo
-        */
        public function testExtractInfo() {
                // Test that attributes that begin with @ are ignored
                $processor = new ExtensionProcessor();
@@ -31,6 +31,8 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                        '@metadata' => [ 'foobarbaz' ],
                        'AnAttribute' => [ 'omg' ],
                        'AutoloadClasses' => [ 'FooBar' => 'includes/FooBar.php' ],
+                       'SpecialPages' => [ 'Foo' => 'SpecialFoo' ],
+                       'callback' => 'FooBar::onRegistration',
                ], 1 );
 
                $extracted = $processor->getExtractedInfo();
@@ -38,12 +40,17 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $this->assertArrayHasKey( 'AnAttribute', $attributes );
                $this->assertArrayNotHasKey( '@metadata', $attributes );
                $this->assertArrayNotHasKey( 'AutoloadClasses', $attributes );
+               $this->assertSame(
+                       [ 'FooBar' => 'FooBar::onRegistration' ],
+                       $extracted['callbacks']
+               );
+               $this->assertSame(
+                       [ 'Foo' => 'SpecialFoo' ],
+                       $extracted['globals']['wgSpecialPages']
+               );
        }
 
-       /**
-        * @covers ExtensionProcessor::extractInfo
-        */
-       public function testExtractInfo_namespaces() {
+       public function testExtractNamespaces() {
                // Test that namespace IDs can be overwritten
                if ( !defined( 'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_X' ) ) {
                        define( 'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_X', 123456 );
@@ -56,13 +63,20 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                                        'id' => 332200,
                                        'constant' => 'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_A',
                                        'name' => 'Test_A',
-                                       'content' => 'TestModel'
+                                       'defaultcontentmodel' => 'TestModel',
+                                       'gender' => [
+                                               'male' => 'Male test',
+                                               'female' => 'Female test',
+                                       ],
+                                       'subpages' => true,
+                                       'content' => true,
+                                       'protection' => 'userright',
                                ],
                                [ // Test_X will use ID 123456 not 334400
                                        'id' => 334400,
                                        'constant' => 'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_X',
                                        'name' => 'Test_X',
-                                       'content' => 'TestModel'
+                                       'defaultcontentmodel' => 'TestModel'
                                ],
                        ]
                ], 1 );
@@ -90,6 +104,13 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
 
                $this->assertSame( 'Test_X', $extracted['attributes']['ExtensionNamespaces'][123456] );
                $this->assertSame( 'Test_A', $extracted['attributes']['ExtensionNamespaces'][332200] );
+               $this->assertSame(
+                       [ 'male' => 'Male test', 'female' => 'Female test' ],
+                       $extracted['globals']['wgExtraGenderNamespaces'][332200]
+               );
+               // A has subpages, X does not
+               $this->assertTrue( $extracted['globals']['wgNamespacesWithSubpages'][332200] );
+               $this->assertArrayNotHasKey( 123456, $extracted['globals']['wgNamespacesWithSubpages'] );
        }
 
        public static function provideRegisterHooks() {
@@ -152,7 +173,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers ExtensionProcessor::extractHooks
         * @dataProvider provideRegisterHooks
         */
        public function testRegisterHooks( $pre, $info, $expected ) {
@@ -162,9 +182,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $extracted['globals']['wgHooks'] );
        }
 
-       /**
-        * @covers ExtensionProcessor::extractConfig1
-        */
        public function testExtractConfig1() {
                $processor = new ExtensionProcessor;
                $info = [
@@ -191,9 +208,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
        }
 
-       /**
-        * @covers ExtensionProcessor::extractConfig2
-        */
        public function testExtractConfig2() {
                $processor = new ExtensionProcessor;
                $info = [
@@ -201,6 +215,13 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                                'Bar' => [ 'value' => 'somevalue' ],
                                'Foo' => [ 'value' => 10 ],
                                'Path' => [ 'value' => 'foo.txt', 'path' => true ],
+                               'Namespaces' => [
+                                       'value' => [
+                                               '10' => true,
+                                               '12' => false,
+                                       ],
+                                       'merge_strategy' => 'array_plus',
+                               ],
                        ],
                ] + self::$default;
                $info2 = [
@@ -218,10 +239,13 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $this->assertEquals( "{$this->dirname}/foo.txt", $extracted['globals']['wgPath'] );
                // Custom prefix:
                $this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
+               $this->assertSame(
+                       [ 10 => true, 12 => false, ExtensionRegistry::MERGE_STRATEGY => 'array_plus' ],
+                       $extracted['globals']['wgNamespaces']
+               );
        }
 
        /**
-        * @covers ExtensionProcessor::addConfigGlobal()
         * @expectedException RuntimeException
         */
        public function testDuplicateConfigKey1() {
@@ -242,7 +266,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers ExtensionProcessor::addConfigGlobal()
         * @expectedException RuntimeException
         */
        public function testDuplicateConfigKey2() {
@@ -287,7 +310,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers ExtensionProcessor::extractExtensionMessagesFiles
         * @dataProvider provideExtractExtensionMessagesFiles
         */
        public function testExtractExtensionMessagesFiles( $input, $expected ) {
@@ -314,7 +336,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers ExtensionProcessor::extractMessagesDirs
         * @dataProvider provideExtractMessagesDirs
         */
        public function testExtractMessagesDirs( $input, $expected ) {
@@ -326,9 +347,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * @covers ExtensionProcessor::extractCredits
-        */
        public function testExtractCredits() {
                $processor = new ExtensionProcessor();
                $processor->extractInfo( $this->dir, self::$default, 1 );
@@ -337,7 +355,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers ExtensionProcessor::extractResourceLoaderModules
         * @dataProvider provideExtractResourceLoaderModules
         */
        public function testExtractResourceLoaderModules( $input, $expected ) {
@@ -380,8 +397,8 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                                // Input
                                [
                                        'ResourceFileModulePaths' => [
-                                               'localBasePath' => '',
-                                               'remoteExtPath' => 'FooBar',
+                                               'localBasePath' => 'modules',
+                                               'remoteExtPath' => 'FooBar/modules',
                                        ],
                                        'ResourceModules' => [
                                                // No paths
@@ -412,8 +429,8 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                                        'wgResourceModules' => [
                                                'test.foo' => [
                                                        'styles' => 'foo.js',
-                                                       'localBasePath' => $dir,
-                                                       'remoteExtPath' => 'FooBar',
+                                                       'localBasePath' => "$dir/modules",
+                                                       'remoteExtPath' => 'FooBar/modules',
                                                ],
                                                'test.bar' => [
                                                        'styles' => 'bar.js',
@@ -423,14 +440,14 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                                                'test.class' => [
                                                        'class' => 'FooBarModule',
                                                        'extra' => 'argument',
-                                                       'localBasePath' => $dir,
-                                                       'remoteExtPath' => 'FooBar',
+                                                       'localBasePath' => "$dir/modules",
+                                                       'remoteExtPath' => 'FooBar/modules',
                                                ],
                                                'test.class.with.path' => [
                                                        'class' => 'FooBarPathModule',
                                                        'extra' => 'argument',
                                                        'localBasePath' => $dir,
-                                                       'remoteExtPath' => 'FooBar',
+                                                       'remoteExtPath' => 'FooBar/modules',
                                                ]
                                        ],
                                ],
@@ -543,9 +560,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
 
        /**
         * Attributes under manifest_version 2
-        *
-        * @covers ExtensionProcessor::extractAttributes
-        * @covers ExtensionProcessor::getExtractedInfo
         */
        public function testExtractAttributes() {
                $processor = new ExtensionProcessor();
@@ -581,8 +595,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
 
        /**
         * Attributes under manifest_version 1
-        *
-        * @covers ExtensionProcessor::extractInfo
         */
        public function testAttributes1() {
                $processor = new ExtensionProcessor();
@@ -599,12 +611,97 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                        ],
                        1
                );
+               $processor->extractInfo(
+                       $this->dir,
+                       [
+                               'name' => 'FooBar2',
+                               'FizzBuzzMorePlugins' => [
+                                       'ext.bar.fizzbuzz',
+                               ]
+                       ],
+                       1
+               );
 
                $info = $processor->getExtractedInfo();
                $this->assertArrayHasKey( 'FooBarPlugins', $info['attributes'] );
                $this->assertSame( [ 'ext.baz.foobar' ], $info['attributes']['FooBarPlugins'] );
                $this->assertArrayHasKey( 'FizzBuzzMorePlugins', $info['attributes'] );
-               $this->assertSame( [ 'ext.baz.fizzbuzz' ], $info['attributes']['FizzBuzzMorePlugins'] );
+               $this->assertSame(
+                       [ 'ext.baz.fizzbuzz', 'ext.bar.fizzbuzz' ],
+                       $info['attributes']['FizzBuzzMorePlugins']
+               );
+       }
+
+       public function testAttributes1_notarray() {
+               $processor = new ExtensionProcessor();
+               $this->setExpectedException(
+                       InvalidArgumentException::class,
+                       "The value for 'FooBarPlugins' should be an array (from {$this->dir})"
+               );
+               $processor->extractInfo(
+                       $this->dir,
+                       [
+                               'FooBarPlugins' => 'ext.baz.foobar',
+                       ] + self::$default,
+                       1
+               );
+       }
+
+       public function testExtractPathBasedGlobal() {
+               $processor = new ExtensionProcessor();
+               $processor->extractInfo(
+                       $this->dir,
+                       [
+                               'ParserTestFiles' => [
+                                       'tests/parserTests.txt',
+                                       'tests/extraParserTests.txt',
+                               ],
+                               'ServiceWiringFiles' => [
+                                       'includes/ServiceWiring.php'
+                               ],
+                       ] + self::$default,
+                       1
+               );
+               $globals = $processor->getExtractedInfo()['globals'];
+               $this->assertArrayHasKey( 'wgParserTestFiles', $globals );
+               $this->assertSame( [
+                       "{$this->dirname}/tests/parserTests.txt",
+                       "{$this->dirname}/tests/extraParserTests.txt"
+               ], $globals['wgParserTestFiles'] );
+               $this->assertArrayHasKey( 'wgServiceWiringFiles', $globals );
+               $this->assertSame( [
+                       "{$this->dirname}/includes/ServiceWiring.php"
+               ], $globals['wgServiceWiringFiles'] );
+       }
+
+       public function testGetRequirements() {
+               $info = self::$default + [
+                       'requires' => [
+                               'MediaWiki' => '>= 1.25.0',
+                               'extensions' => [
+                                       'Bar' => '*'
+                               ]
+                       ]
+               ];
+               $processor = new ExtensionProcessor();
+               $this->assertSame(
+                       $info['requires'],
+                       $processor->getRequirements( $info )
+               );
+               $this->assertSame(
+                       [],
+                       $processor->getRequirements( [] )
+               );
+       }
+
+       public function testGetExtraAutoloaderPaths() {
+               $processor = new ExtensionProcessor();
+               $this->assertSame(
+                       [ "{$this->dirname}/vendor/autoload.php" ],
+                       $processor->getExtraAutoloaderPaths( $this->dirname, [
+                               'load_composer_autoloader' => true,
+                       ] )
+               );
        }
 
        /**
index a6f69b6..67bc088 100644 (file)
@@ -1,9 +1,57 @@
 <?php
 
+/**
+ * @covers ExtensionRegistry
+ */
 class ExtensionRegistryTest extends MediaWikiTestCase {
 
+       private $dataDir;
+
+       public function setUp() {
+               parent::setUp();
+               $this->dataDir = __DIR__ . '/../../data/registration';
+       }
+
+       public function testQueue_invalid() {
+               $registry = new ExtensionRegistry();
+               $path = __DIR__ . '/doesnotexist.json';
+               $this->setExpectedException(
+                       Exception::class,
+                       "$path does not exist!"
+               );
+               $registry->queue( $path );
+       }
+
+       public function testQueue() {
+               $registry = new ExtensionRegistry();
+               $path = "{$this->dataDir}/good.json";
+               $registry->queue( $path );
+               $this->assertArrayHasKey(
+                       $path,
+                       $registry->getQueue()
+               );
+               $registry->clearQueue();
+               $this->assertEmpty( $registry->getQueue() );
+       }
+
+       public function testLoadFromQueue_empty() {
+               $registry = new ExtensionRegistry();
+               $registry->loadFromQueue();
+               $this->assertEmpty( $registry->getAllThings() );
+       }
+
+       public function testLoadFromQueue_late() {
+               $registry = new ExtensionRegistry();
+               $registry->finish();
+               $registry->queue( "{$this->dataDir}/good.json" );
+               $this->setExpectedException(
+                       MWException::class,
+                       "The following paths tried to load late: {$this->dataDir}/good.json"
+               );
+               $registry->loadFromQueue();
+       }
+
        /**
-        * @covers ExtensionRegistry::exportExtractedData
         * @dataProvider provideExportExtractedDataGlobals
         */
        public function testExportExtractedDataGlobals( $desc, $before, $globals, $expected ) {
index 6f0de16..929ff0f 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers VersionChecker
  */
-class VersionCheckerTest extends PHPUnit_Framework_TestCase {
+class VersionCheckerTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
@@ -54,6 +54,7 @@ class VersionCheckerTest extends PHPUnit_Framework_TestCase {
                                'FakeDependency' => [
                                        'version' => '1.0.0',
                                ],
+                               'NoVersionGiven' => [],
                        ] );
                $this->assertEquals( $expected, $checker->checkArray( [
                        'FakeExtension' => $given,
@@ -78,6 +79,39 @@ class VersionCheckerTest extends PHPUnit_Framework_TestCase {
                                ],
                                []
                        ],
+                       [
+                               [
+                                       'extensions' => [
+                                               'NoVersionGiven' => '*'
+                                       ]
+                               ],
+                               [],
+                       ],
+                       [
+                               [
+                                       'extensions' => [
+                                               'NoVersionGiven' => '1.0',
+                                       ]
+                               ],
+                               [ 'NoVersionGiven does not expose its version, but FakeExtension requires: 1.0.' ],
+                       ],
+                       [
+                               [
+                                       'extensions' => [
+                                               'Missing' => '*',
+                                       ]
+                               ],
+                               [ 'FakeExtension requires Missing to be installed.' ],
+                       ],
+                       [
+                               [
+                                       'extensions' => [
+                                               'FakeDependency' => '2.0.0',
+                                       ]
+                               ],
+                               // phpcs:ignore Generic.Files.LineLength.TooLong
+                               [ 'FakeExtension is not compatible with the current installed version of FakeDependency (1.0.0), it requires: 2.0.0.' ],
+                       ]
                ];
        }
 
index db1fb64..e4f58eb 100644 (file)
@@ -4,7 +4,7 @@
  * @group ResourceLoader
  * @covers DerivativeResourceLoaderContext
  */
-class DerivativeResourceLoaderContextTest extends PHPUnit_Framework_TestCase {
+class DerivativeResourceLoaderContextTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index c00432e..fa4d804 100644 (file)
@@ -6,7 +6,7 @@ use Wikimedia\TestingAccessWrapper;
  * @group Cache
  * @covers MessageBlobStore
  */
-class MessageBlobStoreTest extends PHPUnit_Framework_TestCase {
+class MessageBlobStoreTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index c83f500..7bfd769 100644 (file)
@@ -5,7 +5,7 @@ use Wikimedia\TestingAccessWrapper;
 /**
  * @group ResourceLoader
  */
-class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
+class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
@@ -42,9 +42,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
        protected static function makeSampleModules() {
                $modules = [
                        'test' => [],
-                       'test.top' => [ 'position' => 'top' ],
-                       'test.private.top' => [ 'group' => 'private', 'position' => 'top' ],
-                       'test.private.bottom' => [ 'group' => 'private', 'position' => 'bottom' ],
+                       'test.private' => [ 'group' => 'private' ],
                        'test.shouldembed.empty' => [ 'shouldEmbed' => true, 'isKnownEmpty' => true ],
                        'test.shouldembed' => [ 'shouldEmbed' => true ],
 
@@ -75,7 +73,6 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                        ],
 
                        'test.scripts' => [],
-                       'test.scripts.top' => [ 'position' => 'top' ],
                        'test.scripts.user' => [ 'group' => 'user' ],
                        'test.scripts.user.empty' => [ 'group' => 'user', 'isKnownEmpty' => true ],
                        'test.scripts.raw' => [ 'isRaw' => true ],
@@ -115,9 +112,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                $client = new ResourceLoaderClientHtml( $context );
                $client->setModules( [
                        'test',
-                       'test.private.bottom',
-                       'test.private.top',
-                       'test.top',
+                       'test.private',
                        'test.shouldembed.empty',
                        'test.shouldembed',
                        'test.unregistered',
@@ -133,15 +128,13 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                $client->setModuleScripts( [
                        'test.scripts',
                        'test.scripts.user.empty',
-                       'test.scripts.top',
                        'test.scripts.shouldembed',
                        'test.unregistered.scripts',
                ] );
 
                $expected = [
                        'states' => [
-                               'test.private.top' => 'loading',
-                               'test.private.bottom' => 'loading',
+                               'test.private' => 'loading',
                                'test.shouldembed.empty' => 'ready',
                                'test.shouldembed' => 'loading',
                                'test.styles.pure' => 'ready',
@@ -149,27 +142,23 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                                'test.styles.private' => 'ready',
                                'test.styles.shouldembed' => 'ready',
                                'test.scripts' => 'loading',
-                               'test.scripts.top' => 'loading',
                                'test.scripts.user.empty' => 'ready',
                                'test.scripts.shouldembed' => 'loading',
                        ],
                        'general' => [
                                'test',
-                               'test.top',
                        ],
                        'styles' => [
                                'test.styles.pure',
                        ],
                        'scripts' => [
                                'test.scripts',
-                               'test.scripts.top',
                                'test.scripts.shouldembed',
                        ],
                        'embed' => [
                                'styles' => [ 'test.styles.private', 'test.styles.shouldembed' ],
                                'general' => [
-                                       'test.private.bottom',
-                                       'test.private.top',
+                                       'test.private',
                                        'test.shouldembed',
                                ],
                        ],
@@ -193,15 +182,15 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                $client = new ResourceLoaderClientHtml( $context );
                $client->setConfig( [ 'key' => 'value' ] );
                $client->setModules( [
-                       'test.top',
-                       'test.private.top',
+                       'test',
+                       'test.private',
                ] );
                $client->setModuleStyles( [
                        'test.styles.pure',
                        'test.styles.private',
                ] );
                $client->setModuleScripts( [
-                       'test.scripts.top',
+                       'test.scripts',
                ] );
                $client->setExemptStates( [
                        'test.exempt' => 'ready',
@@ -211,10 +200,10 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                $expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
                        . '<script>(window.RLQ=window.RLQ||[]).push(function(){'
                        . 'mw.config.set({"key":"value"});'
-                       . 'mw.loader.state({"test.exempt":"ready","test.private.top":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.scripts.top":"loading"});'
-                       . 'mw.loader.implement("test.private.top@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
-                       . 'mw.loader.load(["test.top"]);'
-                       . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts.top\u0026only=scripts\u0026skin=fallback");'
+                       . 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.scripts":"loading"});'
+                       . 'mw.loader.implement("test.private@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
+                       . 'mw.loader.load(["test"]);'
+                       . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts\u0026only=scripts\u0026skin=fallback");'
                        . '});</script>' . "\n"
                        . '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.pure&amp;only=styles&amp;skin=fallback"/>' . "\n"
                        . '<style>.private{}</style>' . "\n"
@@ -266,9 +255,9 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                        ],
                        [
                                'context' => [],
-                               'modules' => [ 'test.private.top' ],
+                               'modules' => [ 'test.private' ],
                                'only' => ResourceLoaderModule::TYPE_COMBINED,
-                               'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.implement("test.private.top@{blankVer}",function($,jQuery,require,module){},{"css":[]});});</script>',
+                               'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.implement("test.private@{blankVer}",function($,jQuery,require,module){},{"css":[]});});</script>',
                        ],
                        [
                                'context' => [],
index f848556..b226ee1 100644 (file)
@@ -8,7 +8,7 @@
  * @group Cache
  * @covers ResourceLoaderContext
  */
-class ResourceLoaderContextTest extends PHPUnit_Framework_TestCase {
+class ResourceLoaderContextTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 0718af6..a1b1422 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @group ResourceLoader
  */
-class ResourceLoaderSkinModuleTest extends PHPUnit_Framework_TestCase {
+class ResourceLoaderSkinModuleTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 28c69fa..54533a7 100644 (file)
@@ -19,7 +19,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-class SearchSuggestionSetTest extends \PHPUnit_Framework_TestCase {
+class SearchSuggestionSetTest extends \PHPUnit\Framework\TestCase {
        /**
         * Test that adding a new suggestion at the end
         * will keep proper score ordering
index 768ed91..1e8175e 100644 (file)
@@ -6,7 +6,7 @@ use MediaWiki\Services\ServiceContainer;
  *
  * @group MediaWiki
  */
-class ServiceContainerTest extends PHPUnit_Framework_TestCase {
+class ServiceContainerTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 54a31b5..28fc04a 100644 (file)
@@ -130,9 +130,9 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                );
                $wrap->setEnableFlags( 'warn' );
 
-               \MediaWiki\suppressWarnings();
+               \Wikimedia\suppressWarnings();
                ini_set( 'session.serialize_handler', $handler );
-               \MediaWiki\restoreWarnings();
+               \Wikimedia\restoreWarnings();
                if ( ini_get( 'session.serialize_handler' ) !== $handler ) {
                        $this->markTestSkipped( "Cannot set session.serialize_handler to \"$handler\"" );
                }
index e460960..ae19278 100644 (file)
@@ -900,7 +900,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $manager->globalSessionRequest = $request;
 
                session_id( self::SESSIONID );
-               \MediaWiki\quietCall( 'session_start' );
+               \Wikimedia\quietCall( 'session_start' );
                $_SESSION['foo'] = __METHOD__;
                $backend->resetId();
                $this->assertNotEquals( self::SESSIONID, $backend->getId() );
@@ -938,7 +938,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $manager->globalSessionRequest = $request;
 
                session_id( self::SESSIONID . 'x' );
-               \MediaWiki\quietCall( 'session_start' );
+               \Wikimedia\quietCall( 'session_start' );
                $backend->unpersist();
                $this->assertSame( self::SESSIONID . 'x', session_id() );
 
index adf0f5d..f84d435 100644 (file)
@@ -365,9 +365,9 @@ class SessionTest extends MediaWikiTestCase {
                $hmac = hash_hmac( 'sha256', $sealed, $hmacKey, true );
                $encrypted = base64_encode( $hmac ) . '.' . $sealed;
                $session->set( 'test', $encrypted );
-               \MediaWiki\suppressWarnings();
+               \Wikimedia\suppressWarnings();
                $this->assertEquals( 'defaulted', $session->getSecret( 'test', 'defaulted' ) );
-               \MediaWiki\restoreWarnings();
+               \Wikimedia\restoreWarnings();
        }
 
 }
index cb2669f..b031431 100644 (file)
@@ -9,7 +9,7 @@ use Wikimedia\TestingAccessWrapper;
 /**
  * @group Shell
  */
-class CommandFactoryTest extends PHPUnit_Framework_TestCase {
+class CommandFactoryTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 2ba7bdc..3862cc2 100644 (file)
@@ -7,7 +7,7 @@ use Wikimedia\TestingAccessWrapper;
  * @covers \MediaWiki\Shell\Command
  * @group Shell
  */
-class CommandTest extends PHPUnit_Framework_TestCase {
+class CommandTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 1585375..199393c 100644 (file)
@@ -23,7 +23,7 @@ use MediaWiki\Shell\FirejailCommand;
 use MediaWiki\Shell\Shell;
 use Wikimedia\TestingAccessWrapper;
 
-class FirejailCommandTest extends PHPUnit_Framework_TestCase {
+class FirejailCommandTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 986a665..8162bc0 100644 (file)
@@ -6,7 +6,7 @@ use MediaWiki\Shell\Shell;
  * @covers \MediaWiki\Shell\Shell
  * @group Shell
  */
-class ShellTest extends PHPUnit_Framework_TestCase {
+class ShellTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 05aa6d3..69e0e38 100644 (file)
@@ -27,7 +27,7 @@
  *
  * @author Katie Filbert < aude.wiki@gmail.com >
  */
-class FileBasedSiteLookupTest extends PHPUnit_Framework_TestCase {
+class FileBasedSiteLookupTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index d230550..2ac2714 100644 (file)
@@ -27,7 +27,7 @@ use MediaWiki\Site\MediaWikiPageNameNormalizer;
  *
  * @author Marius Hoch
  */
-class MediaWikiPageNameNormalizerTest extends PHPUnit_Framework_TestCase {
+class MediaWikiPageNameNormalizerTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 3a41b5f..279bbb2 100644 (file)
@@ -29,7 +29,7 @@
  *
  * @author Daniel Kinzler
  */
-class SiteExporterTest extends PHPUnit_Framework_TestCase {
+class SiteExporterTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 373dcc2..7c949ac 100644 (file)
@@ -29,7 +29,7 @@
  *
  * @author Daniel Kinzler
  */
-class SiteImporterTest extends PHPUnit_Framework_TestCase {
+class SiteImporterTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index c411ed8..8c84ce5 100644 (file)
@@ -27,7 +27,7 @@
  *
  * @author Katie Filbert < aude.wiki@gmail.com >
  */
-class SitesCacheFileBuilderTest extends PHPUnit_Framework_TestCase {
+class SitesCacheFileBuilderTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
diff --git a/tests/phpunit/includes/sparql/SparqlClientTest.php b/tests/phpunit/includes/sparql/SparqlClientTest.php
new file mode 100644 (file)
index 0000000..cfaf49b
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+namespace MediaWiki\Sparql;
+
+use Http;
+use MediaWiki\Http\HttpRequestFactory;
+use MWHttpRequest;
+
+/**
+ * @covers \MediaWiki\Sparql\SparqlClient
+ */
+class SparqlClientTest extends \PHPUnit\Framework\TestCase {
+
+       private function getRequestFactory( $request ) {
+               $requestFactory = $this->getMock( HttpRequestFactory::class );
+               $requestFactory->method( 'create' )->willReturn( $request );
+               return $requestFactory;
+       }
+
+       private function getRequestMock( $content ) {
+               $request = $this->getMockBuilder( MWHttpRequest::class )->disableOriginalConstructor()->getMock();
+               $request->method( 'execute' )->willReturn( \Status::newGood( 200 ) );
+               $request->method( 'getContent' )->willReturn( $content );
+               return $request;
+       }
+
+       public function testQuery() {
+               $json = <<<JSON
+{
+  "head" : {
+    "vars" : [ "x", "y", "z" ]
+  },
+  "results" : {
+    "bindings" : [ {
+      "x" : {
+        "type" : "uri",
+        "value" : "http://wikiba.se/ontology#Dump"
+      },
+      "y" : {
+        "type" : "uri",
+        "value" : "http://creativecommons.org/ns#license"
+      },
+      "z" : {
+        "type" : "uri",
+        "value" : "http://creativecommons.org/publicdomain/zero/1.0/"
+      }
+    }, {
+      "x" : {
+        "type" : "uri",
+        "value" : "http://wikiba.se/ontology#Dump"
+      },
+      "z" : {
+        "type" : "literal",
+        "value" : "0.1.0"
+      }
+    } ]
+  }
+}
+JSON;
+
+               $request = $this->getRequestMock( $json );
+               $client = new SparqlClient( 'http://acme.test/', $this->getRequestFactory( $request ) );
+
+               // values only
+               $result = $client->query( "TEST SPARQL" );
+               $this->assertCount( 2, $result );
+               $this->assertEquals( 'http://wikiba.se/ontology#Dump', $result[0]['x'] );
+               $this->assertEquals( 'http://creativecommons.org/ns#license', $result[0]['y'] );
+               $this->assertEquals( '0.1.0', $result[1]['z'] );
+               $this->assertNull( $result[1]['y'] );
+               // raw data format
+               $result = $client->query( "TEST SPARQL 2", true );
+               $this->assertCount( 2, $result );
+               $this->assertEquals( 'uri', $result[0]['x']['type'] );
+               $this->assertEquals( 'http://wikiba.se/ontology#Dump', $result[0]['x']['value'] );
+               $this->assertEquals( 'literal', $result[1]['z']['type'] );
+               $this->assertEquals( '0.1.0', $result[1]['z']['value'] );
+               $this->assertNull( $result[1]['y'] );
+       }
+
+       /**
+        * @expectedException \Mediawiki\Sparql\SparqlException
+        */
+       public function testBadQuery() {
+               $request = $this->getMockBuilder( MWHttpRequest::class )->disableOriginalConstructor()->getMock();
+               $client = new SparqlClient( 'http://acme.test/', $this->getRequestFactory( $request ) );
+
+               $request->method( 'execute' )->willReturn( \Status::newFatal( "Bad query" ) );
+               $result = $client->query( "TEST SPARQL 3" );
+       }
+
+       public function optionsProvider() {
+               return [
+                       'defaults' => [
+                               'TEST тест SPARQL 4 ',
+                               null,
+                               null,
+                               [
+                                       'http://acme.test/',
+                                       'query=TEST+%D1%82%D0%B5%D1%81%D1%82+SPARQL+4+',
+                                       'format=json',
+                                       'maxQueryTimeMillis=30000',
+                               ],
+                               [
+                                       'method' => 'GET',
+                                       'userAgent' => Http::userAgent() ." SparqlClient",
+                                       'timeout' => 30
+                               ]
+                       ],
+                       'big query' => [
+                               str_repeat( 'ZZ', SparqlClient::MAX_GET_SIZE ),
+                               null,
+                               null,
+                               [
+                                       'format=json',
+                                       'maxQueryTimeMillis=30000',
+                               ],
+                               [
+                                       'method' => 'POST',
+                                       'postData' => 'query=' . str_repeat( 'ZZ', SparqlClient::MAX_GET_SIZE ),
+                               ]
+                       ],
+                       'timeout 1s' => [
+                               'TEST SPARQL 4',
+                               null,
+                               1,
+                               [
+                                       'maxQueryTimeMillis=1000',
+                               ],
+                               [
+                                       'timeout' => 1
+                               ]
+                       ],
+                       'more options' => [
+                               'TEST SPARQL 5',
+                               [
+                                       'userAgent' => 'My Test',
+                                       'randomOption' => 'duck',
+                               ],
+                               null,
+                               [],
+                               [
+                                       'userAgent' => 'My Test',
+                                       'randomOption' => 'duck',
+                               ]
+                       ],
+
+               ];
+       }
+
+       /**
+        * @dataProvider  optionsProvider
+        * @param string $sparql
+        * @param array|null $options
+        * @param int|null $timeout
+        * @param array $expectedUrl
+        * @param array $expectedOptions
+        */
+       public function testOptions( $sparql, $options, $timeout, $expectedUrl, $expectedOptions ) {
+               $requestFactory = $this->getMock( HttpRequestFactory::class );
+               $client = new SparqlClient( 'http://acme.test/',  $requestFactory );
+
+               $request = $this->getRequestMock( '{}' );
+
+               $requestFactory->method( 'create' )->willReturnCallback(
+                       function ( $url, $options ) use ( $request, $expectedUrl, $expectedOptions ) {
+                               foreach ( $expectedUrl as $eurl ) {
+                                       $this->assertContains( $eurl, $url );
+                               }
+                               foreach ( $expectedOptions as $ekey => $evalue ) {
+                                       $this->assertArrayHasKey( $ekey, $options );
+                                       $this->assertEquals( $options[$ekey], $evalue );
+                               }
+                               return $request;
+                       }
+               );
+
+               if ( !is_null( $options ) ) {
+                       $client->setClientOptions( $options );
+               }
+               if ( !is_null( $timeout ) ) {
+                       $client->setTimeout( $timeout );
+               }
+
+               $result = $client->query( $sparql );
+       }
+
+}
index caeeaab..12d2574 100644 (file)
@@ -12,7 +12,7 @@
 /**
  * @covers AvroValidator
  */
-class AvroValidatorTest extends PHPUnit_Framework_TestCase {
+class AvroValidatorTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 796d459..9e5163f 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers ClassCollector
  */
-class ClassCollectorTest extends PHPUnit_Framework_TestCase {
+class ClassCollectorTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index b3885bd..316d9f4 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @covers FileContentsHasherTest
  */
-class FileContentsHasherTest extends PHPUnit_Framework_TestCase {
+class FileContentsHasherTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 66c8d00..94705bf 100644 (file)
@@ -5,7 +5,7 @@
  *
  * @covers MWCryptHash
  */
-class MWCryptHashTest extends PHPUnit_Framework_TestCase {
+class MWCryptHashTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index c411e53..abdfbb1 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-class MWRestrictionsTest extends PHPUnit_Framework_TestCase {
+class MWRestrictionsTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index c6b8bdd..d335a93 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
+class UIDGeneratorTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 09a0676..9f18e5a 100644 (file)
@@ -4,7 +4,7 @@
  * @covers ZipDirectoryReader
  * NOTE: this test is more like an integration test than a unit test
  */
-class ZipDirectoryReaderTest extends PHPUnit_Framework_TestCase {
+class ZipDirectoryReaderTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 5e36e94..b6cf239 100644 (file)
@@ -57,7 +57,7 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
                        )
                        ->will( $this->returnCallback( function ( $a, $conj ) {
                                $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
-                               return join( $sqlConj, array_map( function ( $s ) {
+                               return implode( $sqlConj, array_map( function ( $s ) {
                                        return '(' . $s . ')';
                                }, $a
                                ) );
@@ -1572,7 +1572,7 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
                        )
                        ->will( $this->returnCallback( function ( $a, $conj ) {
                                $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
-                               return join( $sqlConj, array_map( function ( $s ) {
+                               return implode( $sqlConj, array_map( function ( $s ) {
                                        return '(' . $s . ')';
                                }, $a
                                ) );
index 52e653c..9485170 100644 (file)
@@ -443,7 +443,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        )
                        ->will( $this->returnCallback( function ( $a, $conj ) {
                                $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
-                               return join( $sqlConj, array_map( function ( $s ) {
+                               return implode( $sqlConj, array_map( function ( $s ) {
                                        return '(' . $s . ')';
                                }, $a
                                ) );
@@ -540,7 +540,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        )
                        ->will( $this->returnCallback( function ( $a, $conj ) {
                                $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
-                               return join( $sqlConj, array_map( function ( $s ) {
+                               return implode( $sqlConj, array_map( function ( $s ) {
                                        return '(' . $s . ')';
                                }, $a
                                ) );
index d77291a..544a063 100644 (file)
@@ -6,7 +6,7 @@
  *
  * @author Thiemo Kreuz
  */
-class LanguageCodeTest extends PHPUnit_Framework_TestCase {
+class LanguageCodeTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 0b8d0d9..c15d789 100644 (file)
@@ -4,13 +4,12 @@ namespace MediaWiki\Tests\Maintenance;
 
 use Benchmarker;
 use MediaWikiCoversValidator;
-use PHPUnit_Framework_TestCase;
 use Wikimedia\TestingAccessWrapper;
 
 /**
  * @covers Benchmarker
  */
-class BenchmarkerTest extends PHPUnit_Framework_TestCase {
+class BenchmarkerTest extends \PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 14dfb44..97e0c88 100644 (file)
@@ -215,7 +215,7 @@ class FetchTextTest extends MediaWikiTestCase {
 
        function testExistingSeveral() {
                $this->assertFilter(
-                       join( "\n", [
+                       implode( "\n", [
                                self::$textId1,
                                self::$textId5,
                                self::$textId3,
index 7203777..fa249b2 100755 (executable)
@@ -21,6 +21,7 @@ class PHPUnitMaintClass extends Maintenance {
                'use-bagostuff' => false,
                'use-jobqueue' => false,
                'use-normal-tables' => false,
+               'mwdebug' => false,
                'reuse-db' => false,
                'wiki' => false,
                'profiler' => false,
@@ -112,7 +113,7 @@ class PHPUnitMaintClass extends Maintenance {
                        }
                }
 
-               if ( !class_exists( 'PHPUnit_Framework_TestCase' ) ) {
+               if ( !class_exists( 'PHPUnit\\Framework\\TestCase' ) ) {
                        echo "PHPUnit not found. Please install it and other dev dependencies by
                running `composer install` in MediaWiki root directory.\n";
                        exit( 1 );
index 6d86551..d0126f2 100644 (file)
@@ -20,11 +20,9 @@ class ApiStructureTest extends MediaWikiTestCase {
        private static $testGlobals = [
                [
                        'MiserMode' => false,
-                       'AllowCategorizedRecentChanges' => false,
                ],
                [
                        'MiserMode' => true,
-                       'AllowCategorizedRecentChanges' => true,
                ],
        ];
 
index d45a58c..217232e 100644 (file)
@@ -58,9 +58,9 @@ class AutoLoaderTest extends MediaWikiTestCase {
                                continue;
                        }
 
-                       MediaWiki\suppressWarnings();
+                       Wikimedia\suppressWarnings();
                        $contents = file_get_contents( $filePath );
-                       MediaWiki\restoreWarnings();
+                       Wikimedia\restoreWarnings();
 
                        if ( $contents === false ) {
                                $actual[$class] = "[couldn't read file '$filePath']";
index 4ab0c2c..6c2ff02 100644 (file)
@@ -6,7 +6,7 @@
  *
  * @author Marius Hoch < hoo@online.de >
  */
-class AvailableRightsTest extends PHPUnit_Framework_TestCase {
+class AvailableRightsTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 0cf4659..60c97cc 100644 (file)
@@ -20,7 +20,7 @@
  * Validates all loaded extensions and skins using the ExtensionRegistry
  * against the extension.json schema in the docs/ folder.
  */
-class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase {
+class ExtensionJsonValidationTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
 
index 9016cb7..3543463 100644 (file)
@@ -25,6 +25,7 @@ class StructureTest extends MediaWikiTestCase {
                        'MediaWikiTestCase',
                        'ResourceLoaderTestCase',
                        'PHPUnit_Framework_TestCase',
+                       '\\?PHPUnit\\Framework\\TestCase',
                        'DumpTestCase',
                ] );
                $testClassRegex = "^class .* extends ($testClassRegex)";
index b168754..8390ab3 100644 (file)
@@ -33,7 +33,6 @@ return [
                        'mediawiki.page.startup',
                        'test.sinonjs',
                ],
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
index 8555a7e..d3233da 100644 (file)
@@ -1,5 +1,5 @@
 ( function ( $, mw ) {
-       var simpleSample, U_20AC, mbSample;
+       var simpleSample, U_20AC, poop, mbSample;
 
        QUnit.module( 'jquery.byteLimit', QUnit.newMwEnvironment() );
 
@@ -9,6 +9,9 @@
        // 3 bytes (euro-symbol)
        U_20AC = '\u20AC';
 
+       // Outside of the BMP (pile of poo emoji)
+       poop = '\uD83D\uDCA9'; // "💩"
+
        // Multi-byte sample (22 chars, 26 bytes)
        mbSample = '1234567890' + U_20AC + '1234567890' + U_20AC;
 
                expected: '1234567890' + U_20AC + '1'
        } );
 
+       byteLimitTest( {
+               description: 'Limit using a custom value (multibyte, outside BMP)',
+               $input: $( '<input>' ).attr( 'type', 'text' )
+                       .byteLimit( 3 ),
+               sample: poop,
+               expected: ''
+       } );
+
        byteLimitTest( {
                description: 'Limit using a custom value (multibyte) overlapping a byte',
                $input: $( '<input>' ).attr( 'type', 'text' )
                                return 'prefix' + text;
                        } ),
                sample: simpleSample,
-               hasLimit: true,
-               limit: 6, // 'prefix' length
                expected: ''
        } );
 
 
                assert.strictEqual( $el.val(), 'abc', 'Trim from the insertion point (at 1), not the end' );
        } );
+
+       QUnit.test( 'Do not cut up false matching substrings in emoji insertions', function ( assert ) {
+               var $el,
+                       oldVal = '\uD83D\uDCA9\uD83D\uDCA9', // "💩💩"
+                       newVal = '\uD83D\uDCA9\uD83D\uDCB9\uD83E\uDCA9\uD83D\uDCA9', // "💩💹🢩💩"
+                       expected = '\uD83D\uDCA9\uD83D\uDCB9\uD83D\uDCA9'; // "💩💹💩"
+
+               // Possible bad results:
+               // * With no surrogate support:
+               //   '\uD83D\uDCA9\uD83D\uDCB9\uD83E\uDCA9' "💩💹🢩"
+               // * With correct trimming but bad detection of inserted text:
+               //   '\uD83D\uDCA9\uD83D\uDCB9\uDCA9' "💩💹�"
+
+               $el = $( '<input>' ).attr( 'type', 'text' )
+                       .appendTo( '#qunit-fixture' )
+                       .byteLimit( 12 )
+                       .val( oldVal ).trigger( 'change' )
+                       .val( newVal ).trigger( 'change' );
+
+               assert.strictEqual( $el.val(), expected, 'Pasted emoji correctly trimmed at the end' );
+       } );
+
+       byteLimitTest( {
+               description: 'Unpaired surrogates do not crash',
+               $input: $( '<input>' ).attr( 'type', 'text' ).byteLimit( 4 ),
+               sample: '\uD800\uD800\uDFFF',
+               expected: '\uD800'
+       } );
+
 }( jQuery, mediaWiki ) );
index c4b40dc..3b71413 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -235,9 +235,9 @@ function wfStreamThumb( array $params ) {
                // Fix IE brokenness
                $imsString = preg_replace( '/;.*$/', '', $_SERVER["HTTP_IF_MODIFIED_SINCE"] );
                // Calculate time
-               MediaWiki\suppressWarnings();
+               Wikimedia\suppressWarnings();
                $imsUnix = strtotime( $imsString );
-               MediaWiki\restoreWarnings();
+               Wikimedia\restoreWarnings();
                if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
                        HttpStatus::header( 304 );
                        return;