Merge "Add CSS class .mw-code (matching <pre>)"
authorTimo Tijhof <ttijhof@wikimedia.org>
Wed, 9 May 2012 14:40:34 +0000 (14:40 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 9 May 2012 14:40:34 +0000 (14:40 +0000)
548 files changed:
CREDITS
INSTALL
RELEASE-NOTES-1.19
RELEASE-NOTES-1.20
api.php
docs/code-coverage/README
docs/hooks.txt
includes/Article.php
includes/AutoLoader.php
includes/Block.php
includes/CacheHelper.php [new file with mode: 0644]
includes/ChangesFeed.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Exception.php
includes/Export.php
includes/ExternalEdit.php
includes/ForkController.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/HttpFunctions.php
includes/ImageGallery.php
includes/ImagePage.php
includes/Linker.php
includes/Namespace.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/PageQueryPage.php
includes/PathRouter.php
includes/QueryPage.php
includes/Skin.php
includes/Title.php
includes/User.php
includes/UserMailer.php
includes/WebRequest.php
includes/WikiPage.php
includes/actions/CachedAction.php [new file with mode: 0644]
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiFeedContributions.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiImport.php
includes/api/ApiMain.php
includes/api/ApiOptions.php [new file with mode: 0644]
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php [new file with mode: 0644]
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php [new file with mode: 0644]
includes/api/ApiQueryAllPages.php [new file with mode: 0644]
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryAllimages.php [deleted file]
includes/api/ApiQueryAllmessages.php [deleted file]
includes/api/ApiQueryAllpages.php [deleted file]
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/GenderCache.php
includes/cache/HTMLCacheUpdate.php
includes/cache/HTMLFileCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/MemcachedSessions.php
includes/cache/MessageCache.php
includes/cache/ObjectFileCache.php
includes/cache/ResourceFileCache.php
includes/cache/SquidUpdate.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseIbm_db2.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/LBFactory.php
includes/db/LBFactory_Multi.php
includes/db/LBFactory_Single.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/db/ORMResult.php [new file with mode: 0644]
includes/db/ORMRow.php [new file with mode: 0644]
includes/db/ORMTable.php [new file with mode: 0644]
includes/debug/Debug.php
includes/diff/DifferenceEngine.php
includes/filerepo/FSRepo.php
includes/filerepo/FileRepo.php
includes/filerepo/FileRepoStatus.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/NullRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/backend/FSFile.php
includes/filerepo/backend/FSFileBackend.php
includes/filerepo/backend/FileBackend.php
includes/filerepo/backend/FileBackendGroup.php
includes/filerepo/backend/FileBackendMultiWrite.php
includes/filerepo/backend/FileBackendStore.php
includes/filerepo/backend/FileOp.php
includes/filerepo/backend/SwiftFileBackend.php
includes/filerepo/backend/TempFSFile.php
includes/filerepo/backend/filejournal/DBFileJournal.php
includes/filerepo/backend/filejournal/FileJournal.php
includes/filerepo/backend/lockmanager/DBLockManager.php
includes/filerepo/backend/lockmanager/FSLockManager.php
includes/filerepo/backend/lockmanager/LSLockManager.php
includes/filerepo/backend/lockmanager/LockManager.php
includes/filerepo/backend/lockmanager/LockManagerGroup.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/filerepo/file/UnregisteredLocalFile.php
includes/installer/CliInstaller.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Ibm_db2Installer.php
includes/installer/Ibm_db2Updater.php
includes/installer/InstallDocFormatter.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/interwiki/Interwiki.php
includes/job/DoubleRedirectJob.php
includes/job/EmaillingJob.php
includes/job/EnotifNotifyJob.php
includes/job/JobQueue.php
includes/job/RefreshLinksJob.php
includes/job/UploadFromUrlJob.php
includes/json/FormatJson.php
includes/libs/CSSJanus.php
includes/libs/CSSMin.php
includes/libs/HttpStatus.php
includes/libs/IEContentAnalyzer.php
includes/libs/IEUrlExtension.php
includes/libs/JavaScriptMinifier.php
includes/libs/jsminplus.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/PatrolLog.php
includes/media/BMP.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.php
includes/media/Bitmap_ClientOnly.php
includes/media/DjVu.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/GIF.php
includes/media/GIFMetadataExtractor.php
includes/media/Generic.php
includes/media/IPTC.php
includes/media/Jpeg.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaTransformOutput.php
includes/media/PNG.php
includes/media/PNGMetadataExtractor.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/Tiff.php
includes/media/XCF.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/objectcache/APCBagOStuff.php
includes/objectcache/BagOStuff.php
includes/objectcache/DBABagOStuff.php
includes/objectcache/EhcacheBagOStuff.php
includes/objectcache/EmptyBagOStuff.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPhpBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/objectcache/WinCacheBagOStuff.php
includes/objectcache/XCacheBagOStuff.php
includes/parser/CoreLinkFunctions.php
includes/parser/CoreParserFunctions.php
includes/parser/CoreTagHooks.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_DiffTest.php
includes/parser/Parser_LinkHooks.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/Preprocessor_HipHop.hphp
includes/parser/StripState.php
includes/parser/Tidy.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimple.php
includes/profiler/ProfilerSimpleText.php
includes/profiler/ProfilerSimpleTrace.php
includes/profiler/ProfilerSimpleUDP.php
includes/profiler/ProfilerStub.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderFilePageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderNoscriptModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchUpdate.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCachedPage.php [new file with mode: 0644]
includes/specials/SpecialCategories.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDisambiguations.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/tidy.conf
includes/upload/UploadBase.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
index.php
languages/Language.php
languages/Names.php
languages/messages/MessagesAeb.php
languages/messages/MessagesAf.php
languages/messages/MessagesAm.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAz.php
languages/messages/MessagesBa.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGsw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLi.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLt.php
languages/messages/MessagesLus.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMwl.php
languages/messages/MessagesMyv.php
languages/messages/MessagesNan.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSa.php
languages/messages/MessagesSat.php [new file with mode: 0644]
languages/messages/MessagesScn.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSimple.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesStq.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTly.php
languages/messages/MessagesTr.php
languages/messages/MessagesTs.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUdm.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVo.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
load.php
maintenance/Maintenance.php
maintenance/archives/patch-ipb-parent-block-id-index.sql [new file with mode: 0644]
maintenance/archives/patch-ipb-parent-block-id.sql [new file with mode: 0644]
maintenance/backupTextPass.inc
maintenance/cleanupImages.php
maintenance/copyFileBackend.php [new file with mode: 0644]
maintenance/dumpBackup.php
maintenance/dumpTextPass.php
maintenance/ibm_db2/tables.sql
maintenance/install.php
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/language/rebuildLanguage.php
maintenance/language/writeMessagesArray.inc
maintenance/mctest.php
maintenance/mssql/tables.sql
maintenance/oracle/tables.sql
maintenance/populateParentId.php
maintenance/postgres/tables.sql
maintenance/refreshLinks.php
maintenance/tables.sql
maintenance/update.php
resources/Resources.php
resources/jquery.effects/jquery.effects.blind.js
resources/jquery.effects/jquery.effects.bounce.js
resources/jquery.effects/jquery.effects.clip.js
resources/jquery.effects/jquery.effects.core.js
resources/jquery.effects/jquery.effects.drop.js
resources/jquery.effects/jquery.effects.explode.js
resources/jquery.effects/jquery.effects.fade.js
resources/jquery.effects/jquery.effects.fold.js
resources/jquery.effects/jquery.effects.highlight.js
resources/jquery.effects/jquery.effects.pulsate.js
resources/jquery.effects/jquery.effects.scale.js
resources/jquery.effects/jquery.effects.shake.js
resources/jquery.effects/jquery.effects.slide.js
resources/jquery.effects/jquery.effects.transfer.js
resources/jquery.ui/i18n/jquery.ui.datepicker-de.js
resources/jquery.ui/i18n/jquery.ui.datepicker-et.js
resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js
resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js
resources/jquery.ui/i18n/jquery.ui.datepicker-hi.js
resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js
resources/jquery.ui/jquery.ui.accordion.js
resources/jquery.ui/jquery.ui.autocomplete.js
resources/jquery.ui/jquery.ui.button.js
resources/jquery.ui/jquery.ui.core.js
resources/jquery.ui/jquery.ui.datepicker.js
resources/jquery.ui/jquery.ui.dialog.js
resources/jquery.ui/jquery.ui.draggable.js
resources/jquery.ui/jquery.ui.droppable.js
resources/jquery.ui/jquery.ui.mouse.js
resources/jquery.ui/jquery.ui.position.js
resources/jquery.ui/jquery.ui.progressbar.js
resources/jquery.ui/jquery.ui.resizable.js
resources/jquery.ui/jquery.ui.selectable.js
resources/jquery.ui/jquery.ui.slider.js
resources/jquery.ui/jquery.ui.sortable.js
resources/jquery.ui/jquery.ui.tabs.js
resources/jquery.ui/jquery.ui.widget.js
resources/jquery.ui/themes/default/jquery.ui.accordion.css
resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
resources/jquery.ui/themes/default/jquery.ui.button.css
resources/jquery.ui/themes/default/jquery.ui.core.css
resources/jquery.ui/themes/default/jquery.ui.datepicker.css
resources/jquery.ui/themes/default/jquery.ui.dialog.css
resources/jquery.ui/themes/default/jquery.ui.progressbar.css
resources/jquery.ui/themes/default/jquery.ui.resizable.css
resources/jquery.ui/themes/default/jquery.ui.selectable.css
resources/jquery.ui/themes/default/jquery.ui.slider.css
resources/jquery.ui/themes/default/jquery.ui.tabs.css
resources/jquery.ui/themes/default/jquery.ui.theme.css
resources/jquery.ui/themes/vector/jquery.ui.dialog.css
resources/jquery.ui/themes/vector/jquery.ui.resizable.css
resources/jquery/jquery.suggestions.js
resources/mediawiki.special/mediawiki.special.upload.js
resources/mediawiki/mediawiki.js
skins/Vector.php
skins/common/commonElements.css
skins/vector/screen-hd.css [new file with mode: 0644]
skins/vector/screen.css
tests/jasmine/SpecRunner.html
tests/jasmine/spec/mediawiki.Uri.spec.js [deleted file]
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/bootstrap.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/RevisionStorageTest.php [new file with mode: 0644]
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/WikiPageTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiOptionsTest.php [new file with mode: 0644]
tests/phpunit/includes/cache/GenderCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/filerepo/FileBackendTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php [new file with mode: 0644]
tests/phpunit/maintenance/backupPrefetchTest.php [new file with mode: 0644]
tests/phpunit/maintenance/backupTextPassTest.php [new file with mode: 0644]
tests/phpunit/maintenance/backup_LogTest.php [new file with mode: 0644]
tests/phpunit/maintenance/backup_PageTest.php [new file with mode: 0644]
tests/phpunit/maintenance/fetchTextTest.php [new file with mode: 0644]
tests/phpunit/maintenance/getSlaveServerTest.php [new file with mode: 0644]
tests/phpunit/phpunit.php
tests/qunit/data/styleTest.css.php
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/selenium/SeleniumConfig.php

diff --git a/CREDITS b/CREDITS
index bac7391..5b876f1 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -135,6 +135,7 @@ following names for their contribution to the product.
 * Manuel Menal
 * Marcin Cieślak
 * Marcus Buck
+* Mark A. Pelletier
 * Marooned
 * Mathias Ertl
 * Matthew Britton
diff --git a/INSTALL b/INSTALL
index 3a2860f..c4bb8be 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
 "in-place", as long as you have the necessary prerequisites available.
 
 Required software:
-* Web server with PHP 5.2.3 or higher.
+* Web server with PHP 5.3.2 or higher.
 * A SQL server, the following types are supported
 ** MySQL 5.0.2 or higher
 ** PostgreSQL 8.3 or higher
index 94f034c..6c7fa6d 100644 (file)
@@ -5,39 +5,45 @@ setting since version 1.2.0. If you have it on, turn it '''off''' if you can.
 
 == MediaWiki 1.19 ==
 
-THIS IS NOT A RELEASE YET
+MediaWiki 1.19 is a large release that contains many new features and bug
+fixes. This is a summary of the major changes of interest to users.
+You can consult the RELEASE-NOTES-1.19 file for the full list of changes in
+this version.
 
-This is a beta release of the MediaWiki 1.19 branch. Please test it and let us
-know what you think of it. Beta releases are not recommended for use in
-production.
+Our thanks go to everyone who helped to improve MediaWiki by testing the beta
+release and submitting bug reports.
 
 === Changes since 1.19 beta 2 ===
-* Special:Watchlist no longer sets links to feed when the user is anonymous
-* (bug 35565) Special:Log/patrol doesn't indicate whether patrolling was
-  automatic
+* Special:Watchlist no longer sets links to feed when the user is anonymous.
+* (bug 35961) Hash comparison should always be strict.
+* Fix broken email confirmation expiration caused by MWCryptRand changes.
+* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
+  on line 598.
+* (bug 36042) 'show' causes a fatal in blocks API.
 
 === Changes since 1.19 beta 1 ===
 * (bug 35014) Including a special page no longer sets the page's title to the
-  included page.
-* (bug 35019) Edit summaries are no longer transformed in notification e-mails.
-* (bug 35152) Help message for e-mail is shown again in user preferences.
+  included page
+* (bug 35019) Edit summaries are no longer transformed in notification e-mails
+* (bug 35152) Help message for e-mail is shown again in user preferences
 * (bug 34887) $3 and $4 parameters are now substituted correctly in message
-  "movepage-moved".
+  "movepage-moved"
 * (bug 34841) Edit links are no longer displayed when display old page versions
-* (bug 34889) User name should be normalized on Special:Contributions.
-* (bug 35051) If heading has a trailing space after == then its name is not
-  preloaded into edit summary on section edit.
+* (bug 34889) User name should be normalized on Special:Contributions
+* (bug 35051) If heading has a trailing space after == then its name is not 
+  preloaded into edit summary on section edit
 * (bug 31417) New ID mw-content-text around the actual page text, without categories,
   contentSub, ... The same div often also contains the class mw-content-ltr/rtl.
 * (bug 35303) Proxy and DNS blacklist blocking works again
-* (bug 35294) jquery.byteLimit shouldn't set element specific variables outside
-  the "return this.each" loop.
 * (bug 22555) Remove or skip strip markers from tag hooks like &lt;nowiki&gt; in 
   core parser functions which operate on strings, such as padleft.
 * (bug 18295) Don't expose strip markers when a tag appears inside a link 
   inside a heading.
+* (bug 34212) ApiBlock/ApiUnblock allow action to take place without a token
+  parameter present.
 * (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
-  CSRF attacks
+  CSRF attacks.
+* (bug 35317) CSRF in Special:Upload.
 
 === Configuration changes in 1.19 ===
 * Removed SkinTemplateSetupPageCss hook; use BeforePageDisplay instead.
@@ -52,7 +58,7 @@ production.
 * (bug 32239) Removed $wgEnableTooltipsAndAccesskeys.
 * Removed $wgVectorShowVariantName.
 * Removed $wgExtensionAliasesFiles. Use $wgExtensionMessagesFiles.
-* Removed $wgResourceLoaderInlinePrivateModules, now always enabled.
+* Removed $wgResourceLoaderInlinePrivateModules , now always enabled.
 
 === New features in 1.19 ===
 * (bug 19838) Add ability to get all interwiki prefixes also if the interwiki
@@ -136,8 +142,8 @@ production.
   200 status code instead of 404 for nonexistent articles.
 * (bug 33447) Link to the broken image tracking category from Special:Wantedfiles.
 * (bug 27724) Add timestamp to job queue.
-* (bug 30339) Implement SpecialPage for running javascript tests. Disabled by default,
-  due to tests potentially being harmful, not to be run on a production wiki.
+* (bug 30339) Implement SpecialPage for running javascript tests. Disabled by default, due to
+  tests potentially being harmful, not to be run on a production wiki.
   Enable by setting $wgEnableJavaScriptTest to true.
 * Extensions can use the RequestContextCreateSkin hook to override what skin is
   loaded in some contexts.
@@ -154,8 +160,6 @@ production.
 * Special:MovePage now has a dropdown menu for namespaces.
 * (bug 34420) Special:Version now shows git HEAD sha1 when available.
 * (bug 33952) Refactor mw.toolbar to allow dynamic additions at any time.
-* Now possible to specify separate section title and edit summary when adding
-  a new section to a page via the edit API action.
 
 === Bug fixes in 1.19 ===
 * $wgUploadNavigationUrl should be used for file redlinks if.
@@ -288,12 +292,11 @@ production.
 * (bug 28936, bug 5280) Broken or invalid titles can't be removed from watchlist.
 * (bug 34600) Older skins using useHeadElement=false were broken in 1.18.
 * (bug 34604) [mw.config] wgActionPaths should be an object instead of a numeral
-  array.
+  array.* (bug 12262) Indents and lists are now aligned
 * (bug 29753) mw.util.tooltipAccessKeyPrefix should be alt-shift for Chrome
    on Windows
 * (bug 25095) Special:Categories should also include the first relevant item
    when "from" is filled.
-* (bug 12262) Indents and lists are now aligned
 * (bug 34972) An error occurred while changing your watchlist settings for 
   [[Special:WhatLinksHere/Example]]
 
@@ -332,8 +335,8 @@ production.
   calling action=purge&forcelinkupdate.
 * (bug 34377) action=watch now parses messages using the correct title instead
   of "API".
-* (bug 35036) ResourceLoaderWikiModule should auto-update when messages (created
-  or overwritten) in the MediaWiki namespace change.
+* (bug 35036) WikiLove messages were not automatically updated in JavaScript
+  after having been changed on-wiki due to a bug in core
 
 === Languages updated in 1.19 ===
 
@@ -386,7 +389,6 @@ changes to languages because of Bugzilla reports.
   amount of user/site scripts that are lacking dependency information. In the short to
   medium term these user/site scripts should be fixed by adding the used modules to the
   dependencies in the module registry and/or wrapping them in a callback to mw.loader.using.
-* MediaWiki now requires MySQL 5.0.2 or later when using a MySQL database.
 
 == Compatibility ==
 
index 07145ae..78c7c95 100644 (file)
@@ -10,7 +10,13 @@ THIS IS NOT A RELEASE YET
 MediaWiki 1.20 is an alpha-quality branch and is not recommended for use in
 production.
 
+=== PHP 5.3 now required ===
+Since 1.20, the lowest supported version of PHP is now 5.3.2. Please
+upgrade PHP if you have not done so prior to upgrading MediaWiki.
+
 === Configuration changes in 1.20 ===
+* $wgGitRepositoryViewers defines a mapping from Git remote repository to the
+  Gitweb instance URL used in Special:Version
 * `$wgUsePathInfo = true;` is no longer needed to make $wgArticlePath work on servers
   using like nginx, lighttpd, and apache over fastcgi. MediaWiki now always extracts
   path info from REQUEST_URI if it's available.
@@ -38,6 +44,18 @@ production.
 * (bug 23006) create #speciale parser function.
 * generateSitemap can now optionally skip redirect pages.
 * (bug 27757) new API command just for retrieving tokens (not page-based)
+* Added GitViewers hook for extensions using external git repositories to have a web-based
+  repository viewer linked to from Special:Version.
+* Memcached debug logs can now be sent to their own file logs by setting
+  $wgDebugLogFile['memcached'] to some filepath.
+* (bug 35685) api.php URL and other entry point URLs are now listed on
+  Special:Version
+* Edit notices can now be translated.
+* (bug 22887) Add warning and tracking category for preprocessor errors
+* (bug 31704) Allow selection of associated namespace on the watchlist
+* (bug 5445) Now remove autoblocks when a user is unblocked.
+* Added $wgLogExceptionBacktrace, on by default, to allow logging of exception
+  backtraces.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -48,7 +66,7 @@ production.
 * (bug 12021) Added user talk link on Special:Listusers.
 * (bug 34445) section edit and TOC hide/show links are excluded from selection and
   copy/paste on supporting browsers.
-* (bug 34428) Fixed incorrect hash mismatch errors in the DiffHistoryBlob 
+* (bug 34428) Fixed incorrect hash mismatch errors in the DiffHistoryBlob
   history compression method.
 * (bug 34702) Localised parentheses are now used in more special pages.
 * (bug 34723) When editing a script page on a RTL wiki the textbox should be LTR.
@@ -56,7 +74,7 @@ production.
 * (bug 34863) Show deletion log extract on non-existent file pages if applicable.
 * (bug 28019) Let ?preloadtitle=foo be passed on to target of
   Special:MyPage and Special:MyTalk.
-* (bug 34929) Show the correct diff when a section edit is rejected by the spam 
+* (bug 34929) Show the correct diff when a section edit is rejected by the spam
   filter.
 * (bug 15816) Add a switch for SETting the search_path (Postgres).
 * (bug 34521) Returning to the previous page after logging in loses any array-
@@ -72,7 +90,7 @@ production.
 * (bug 31236) "Next" and "Previous" buttons are shown incorrectly in
   an RTL environment.
 * (bug 35680) jQuery upgraded to 1.7.2.
-* (bug 35681) jQuery UI upgraded to 1.8.18.
+* jQuery UI upgraded to 1.8.19.
 * (bug 35705) QUnit upgraded from 1.2.0 to 1.5.0
 * (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
   Subversion when invoked with the --modified option.
@@ -81,6 +99,10 @@ production.
 * (bug 18704) Add a unique CSS class or ID to the tagfilter table row at RecentChanges
 * (bug 33564) transwiki import sometimes result in invalid title.
 * (bug 35572) Blocks appear to succeed even if query fails due to wrong DB structure
+* (bug 31757) Add a word-separator between help-messages in HTMLForm
+* (bug 30410) Removed deprecated $wgFilterCallback and the 'filtered' API error.
+* (bug 32604) Some messages needs escaping of wikitext inside username
+* (bug 36537) Rename wfArrayToCGI to wfArrayToCgi for consistency with wfCgiToArray.
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
@@ -91,6 +113,11 @@ production.
 * (bug 32492) API now allows editing using pageid
 * (bug 32497) API now allows changing of protection level using pageid
 * (bug 32498) API now allows comparing pages using pageids
+* (bug 30975) API import of pages with invalid characters in this wiki leads to Fatal Error
+* (bug 30488) API now allows listing of backlinks/embeddedin/imageusage per pageid
+* (bug 34927) Output media_type for list=filearchive
+* (bug 28814) add properties to output of action=parse
+* (bug 33224) add variants of content language to meta=siteinfo
 
 === Languages updated in 1.20 ===
 
@@ -98,9 +125,12 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Bugzilla reports.
 
+* Mizo (lus) added.
+* Santali (sat) added.
 * (bug 34192) Namespace gender aliases for Albanian languages (sq & aln).
 * (bug 35541) Namespace gender aliases for Croatian (hr).
-* Mizo (lus) added.
+* (bug 36012) Space in $separatorTransformTable should be non-breaking in
+  Portuguese, Esperanto and Udmurt.
 
 === Other changes in 1.20 ===
 * The user_token field is now left empty until a user attempts to login and
@@ -112,7 +142,7 @@ changes to languages because of Bugzilla reports.
 
 == Compatibility ==
 
-MediaWiki 1.20 requires PHP 5.2.3. PHP 4 is no longer supported.
+MediaWiki 1.20 requires PHP 5.3.2. PHP 4 is no longer supported.
 
 MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
 support for them is somewhat less mature. There is experimental support for IBM
diff --git a/api.php b/api.php
index 889c5f1..3691ac6 100644 (file)
--- a/api.php
+++ b/api.php
@@ -38,7 +38,7 @@
 define( 'MW_API', true );
 
 // Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'api.php' );
 }
index 7bc55ce..76ce9bd 100644 (file)
@@ -1,2 +1,2 @@
 This directory is for the auto-generated phpunit code coverage.
-Run 'make coverage' in the maintenance/tests/phpunit subdirectory to build.
+Run 'make coverage' in the tests/phpunit subdirectory to build.
index b02c305..33db1c5 100644 (file)
@@ -395,6 +395,11 @@ In this data array, the key-value-pair identified by the apiLink key is
 required.
 &$apis: array of services
 
+'ApiTokensGetTokenTypes': use this hook to extend action=tokens with new
+token types.
+&$tokenTypes: supported token types in format 'type' => callback function
+used to retrieve this type of tokens.
+
 'ArticleAfterFetchContent': after fetching content of an article from
 the database
 $article: the article (object) being loaded from the database
@@ -899,6 +904,12 @@ $article: in case all revisions of the file are deleted a reference to the
 $user: user who performed the deletion
 $reason: reason
 
+'FileTransformed': When a file is transformed and moved into storage
+$file: reference to the File object
+$thumb: the MediaTransformOutput object
+$tmpThumbPath: The temporary file system path of the transformed file
+$thumbPath: The permanent storage path of the transformed file
+
 'FileUpload': When a file upload occurs
 $file : Image object representing the file that was uploaded
 $reupload : Boolean indicating if there was a previously another image there or not (since 1.17)
@@ -997,6 +1008,11 @@ $result: User permissions error to add. If none, return true.
 'getUserPermissionsErrorsExpensive': Absolutely the same, but is called only
        if expensive checks are enabled.
 
+'GitViewers': called when generating the list of git viewers for Special:Version, use
+       this to change the list.
+&$extTypes: associative array of repo URLS to viewer URLs.
+
+
 'ImageBeforeProduceHTML': Called before producing the HTML created by a wiki
        image insertion.  You can skip the default logic entirely by returning
        false, or just modify a few things using call-by-reference.
index 393f770..6a3e41c 100644 (file)
@@ -191,8 +191,6 @@ class Article extends Page {
         * @return string Return the text of this revision
         */
        public function getContent() {
-               global $wgUser;
-
                wfProfileIn( __METHOD__ );
 
                if ( $this->mPage->getID() === 0 ) {
@@ -204,7 +202,7 @@ class Article extends Page {
                                        $text = '';
                                }
                        } else {
-                               $text = wfMsgExt( $wgUser->isLoggedIn() ? 'noarticletext' : 'noarticletextanon', 'parsemag' );
+                               $text = wfMsgExt( $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon', 'parsemag' );
                        }
                        wfProfileOut( __METHOD__ );
 
@@ -235,11 +233,10 @@ class Article extends Page {
         * @return int The old id for the request
         */
        public function getOldIDFromRequest() {
-               global $wgRequest;
-
                $this->mRedirectUrl = false;
 
-               $oldid = $wgRequest->getIntOrNull( 'oldid' );
+               $request = $this->getContext()->getRequest();
+               $oldid = $request->getIntOrNull( 'oldid' );
 
                if ( $oldid === null ) {
                        return 0;
@@ -262,7 +259,7 @@ class Article extends Page {
                        }
                }
 
-               if ( $wgRequest->getVal( 'direction' ) == 'next' ) {
+               if ( $request->getVal( 'direction' ) == 'next' ) {
                        $nextid = $this->getTitle()->getNextRevisionID( $oldid );
                        if ( $nextid ) {
                                $oldid = $nextid;
@@ -270,7 +267,7 @@ class Article extends Page {
                        } else {
                                $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
                        }
-               } elseif ( $wgRequest->getVal( 'direction' ) == 'prev' ) {
+               } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
                        $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
                        if ( $previd ) {
                                $oldid = $previd;
@@ -404,8 +401,7 @@ class Article extends Page {
         * page of the given title.
         */
        public function view() {
-               global $wgUser, $wgOut, $wgRequest, $wgParser;
-               global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
+               global $wgParser, $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
 
                wfProfileIn( __METHOD__ );
 
@@ -415,17 +411,19 @@ class Article extends Page {
                # the first call of this method even if $oldid is used way below.
                $oldid = $this->getOldID();
 
+               $user = $this->getContext()->getUser();
                # Another whitelist check in case getOldID() is altering the title
-               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $wgUser );
+               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
                if ( count( $permErrors ) ) {
                        wfDebug( __METHOD__ . ": denied on secondary read check\n" );
                        wfProfileOut( __METHOD__ );
                        throw new PermissionsError( 'read', $permErrors );
                }
 
+               $outputPage = $this->getContext()->getOutput();
                # getOldID() may as well want us to redirect somewhere else
                if ( $this->mRedirectUrl ) {
-                       $wgOut->redirect( $this->mRedirectUrl );
+                       $outputPage->redirect( $this->mRedirectUrl );
                        wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
                        wfProfileOut( __METHOD__ );
 
@@ -433,7 +431,7 @@ class Article extends Page {
                }
 
                # If we got diff in the query, we want to see a diff page instead of the article.
-               if ( $wgRequest->getCheck( 'diff' ) ) {
+               if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
                        wfDebug( __METHOD__ . ": showing diff page\n" );
                        $this->showDiffPage();
                        wfProfileOut( __METHOD__ );
@@ -442,17 +440,17 @@ class Article extends Page {
                }
 
                # Set page title (may be overridden by DISPLAYTITLE)
-               $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
+               $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
 
-               $wgOut->setArticleFlag( true );
+               $outputPage->setArticleFlag( true );
                # Allow frames by default
-               $wgOut->allowClickjacking();
+               $outputPage->allowClickjacking();
 
                $parserCache = ParserCache::singleton();
 
                $parserOptions = $this->getParserOptions();
                # Render printable version, use printable version cache
-               if ( $wgOut->isPrintable() ) {
+               if ( $outputPage->isPrintable() ) {
                        $parserOptions->setIsPrintable( true );
                        $parserOptions->setEditSection( false );
                } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit' ) ) {
@@ -462,11 +460,11 @@ class Article extends Page {
                # Try client and file cache
                if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
                        if ( $wgUseETag ) {
-                               $wgOut->setETag( $parserCache->getETag( $this, $parserOptions ) );
+                               $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
                        }
 
                        # Is it client cached?
-                       if ( $wgOut->checkLastModified( $this->mPage->getTouched() ) ) {
+                       if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
                                wfDebug( __METHOD__ . ": done 304\n" );
                                wfProfileOut( __METHOD__ );
 
@@ -475,8 +473,8 @@ class Article extends Page {
                        } elseif ( $wgUseFileCache && $this->tryFileCache() ) {
                                wfDebug( __METHOD__ . ": done file cache\n" );
                                # tell wgOut that output is taken care of
-                               $wgOut->disable();
-                               $this->mPage->doViewUpdates( $wgUser );
+                               $outputPage->disable();
+                               $this->mPage->doViewUpdates( $user );
                                wfProfileOut( __METHOD__ );
 
                                return;
@@ -486,7 +484,7 @@ class Article extends Page {
                # Should the parser cache be used?
                $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
                wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
-               if ( $wgUser->getStubThreshold() ) {
+               if ( $user->getStubThreshold() ) {
                        wfIncrStats( 'pcache_miss_stub' );
                }
 
@@ -524,14 +522,14 @@ class Article extends Page {
                                                        } else {
                                                                wfDebug( __METHOD__ . ": showing parser cache contents\n" );
                                                        }
-                                                       $wgOut->addParserOutput( $this->mParserOutput );
+                                                       $outputPage->addParserOutput( $this->mParserOutput );
                                                        # Ensure that UI elements requiring revision ID have
                                                        # the correct version information.
-                                                       $wgOut->setRevisionId( $this->mPage->getLatest() );
+                                                       $outputPage->setRevisionId( $this->mPage->getLatest() );
                                                        # Preload timestamp to avoid a DB hit
                                                        $cachedTimestamp = $this->mParserOutput->getTimestamp();
                                                        if ( $cachedTimestamp !== null ) {
-                                                               $wgOut->setRevisionTimestamp( $cachedTimestamp );
+                                                               $outputPage->setRevisionTimestamp( $cachedTimestamp );
                                                                $this->mPage->setTimestamp( $cachedTimestamp );
                                                        }
                                                        $outputDone = true;
@@ -555,16 +553,16 @@ class Article extends Page {
 
                                        # Ensure that UI elements requiring revision ID have
                                        # the correct version information.
-                                       $wgOut->setRevisionId( $this->getRevIdFetched() );
+                                       $outputPage->setRevisionId( $this->getRevIdFetched() );
                                        # Preload timestamp to avoid a DB hit
-                                       $wgOut->setRevisionTimestamp( $this->getTimestamp() );
+                                       $outputPage->setRevisionTimestamp( $this->getTimestamp() );
 
                                        # Pages containing custom CSS or JavaScript get special treatment
                                        if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
                                                wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
                                                $this->showCssOrJsPage();
                                                $outputDone = true;
-                                       } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $wgOut ) ) ) {
+                                       } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
                                                # Allow extensions do their own custom view for certain pages
                                                $outputDone = true;
                                        } else {
@@ -573,10 +571,10 @@ class Article extends Page {
                                                if ( $rt ) {
                                                        wfDebug( __METHOD__ . ": showing redirect=no page\n" );
                                                        # Viewing a redirect page (e.g. with parameter redirect=no)
-                                                       $wgOut->addHTML( $this->viewRedirect( $rt ) );
+                                                       $outputPage->addHTML( $this->viewRedirect( $rt ) );
                                                        # Parse just to get categories, displaytitle, etc.
                                                        $this->mParserOutput = $wgParser->parse( $text, $this->getTitle(), $parserOptions );
-                                                       $wgOut->addParserOutputNoText( $this->mParserOutput );
+                                                       $outputPage->addParserOutputNoText( $this->mParserOutput );
                                                        $outputDone = true;
                                                }
                                        }
@@ -591,12 +589,12 @@ class Article extends Page {
                                        if ( !$poolArticleView->execute() ) {
                                                $error = $poolArticleView->getError();
                                                if ( $error ) {
-                                                       $wgOut->clearHTML(); // for release() errors
-                                                       $wgOut->enableClientCache( false );
-                                                       $wgOut->setRobotPolicy( 'noindex,nofollow' );
+                                                       $outputPage->clearHTML(); // for release() errors
+                                                       $outputPage->enableClientCache( false );
+                                                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
 
                                                        $errortext = $error->getWikiText( false, 'view-pool-error' );
-                                                       $wgOut->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+                                                       $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
                                                }
                                                # Connection or timeout error
                                                wfProfileOut( __METHOD__ );
@@ -604,12 +602,12 @@ class Article extends Page {
                                        }
 
                                        $this->mParserOutput = $poolArticleView->getParserOutput();
-                                       $wgOut->addParserOutput( $this->mParserOutput );
+                                       $outputPage->addParserOutput( $this->mParserOutput );
 
                                        # Don't cache a dirty ParserOutput object
                                        if ( $poolArticleView->getIsDirty() ) {
-                                               $wgOut->setSquidMaxage( 0 );
-                                               $wgOut->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
+                                               $outputPage->setSquidMaxage( 0 );
+                                               $outputPage->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
                                        }
 
                                        $outputDone = true;
@@ -638,17 +636,17 @@ class Article extends Page {
                if ( $this->getTitle()->isMainPage() ) {
                        $msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
                        if ( !$msg->isDisabled() ) {
-                               $wgOut->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
+                               $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
                        }
                }
 
                # Check for any __NOINDEX__ tags on the page using $pOutput
                $policy = $this->getRobotPolicy( 'view', $pOutput );
-               $wgOut->setIndexPolicy( $policy['index'] );
-               $wgOut->setFollowPolicy( $policy['follow'] );
+               $outputPage->setIndexPolicy( $policy['index'] );
+               $outputPage->setFollowPolicy( $policy['follow'] );
 
                $this->showViewFooter();
-               $this->mPage->doViewUpdates( $wgUser );
+               $this->mPage->doViewUpdates( $user );
 
                wfProfileOut( __METHOD__ );
        }
@@ -658,11 +656,10 @@ class Article extends Page {
         * @param $pOutput ParserOutput
         */
        public function adjustDisplayTitle( ParserOutput $pOutput ) {
-               global $wgOut;
                # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
                $titleText = $pOutput->getTitleText();
                if ( strval( $titleText ) !== '' ) {
-                       $wgOut->setPageTitle( $titleText );
+                       $this->getContext()->getOutput()->setPageTitle( $titleText );
                }
        }
 
@@ -671,13 +668,13 @@ class Article extends Page {
         * Article::view() only, other callers should use the DifferenceEngine class.
         */
        public function showDiffPage() {
-               global $wgRequest, $wgUser;
-
-               $diff = $wgRequest->getVal( 'diff' );
-               $rcid = $wgRequest->getVal( 'rcid' );
-               $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
-               $purge = $wgRequest->getVal( 'action' ) == 'purge';
-               $unhide = $wgRequest->getInt( 'unhide' ) == 1;
+               $request = $this->getContext()->getRequest();
+               $user = $this->getContext()->getUser();
+               $diff = $request->getVal( 'diff' );
+               $rcid = $request->getVal( 'rcid' );
+               $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
+               $purge = $request->getVal( 'action' ) == 'purge';
+               $unhide = $request->getInt( 'unhide' ) == 1;
                $oldid = $this->getOldID();
 
                $de = new DifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
@@ -687,7 +684,7 @@ class Article extends Page {
 
                if ( $diff == 0 || $diff == $this->mPage->getLatest() ) {
                        # Run view updates for current revision only
-                       $this->mPage->doViewUpdates( $wgUser );
+                       $this->mPage->doViewUpdates( $user );
                }
        }
 
@@ -699,22 +696,21 @@ class Article extends Page {
         * page views.
         */
        protected function showCssOrJsPage() {
-               global $wgOut;
-
                $dir = $this->getContext()->getLanguage()->getDir();
                $lang = $this->getContext()->getLanguage()->getCode();
 
-               $wgOut->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
                        'clearyourcache' );
 
                // Give hooks a chance to customise the output
-               if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->getTitle(), $wgOut ) ) ) {
+               if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
                        // Wrap the whole lot in a <pre> and don't parse
                        $m = array();
                        preg_match( '!\.(css|js)$!u', $this->getTitle()->getText(), $m );
-                       $wgOut->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
-                       $wgOut->addHTML( htmlspecialchars( $this->mContent ) );
-                       $wgOut->addHTML( "\n</pre>\n" );
+                       $outputPage->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
+                       $outputPage->addHTML( htmlspecialchars( $this->mContent ) );
+                       $outputPage->addHTML( "\n</pre>\n" );
                }
        }
 
@@ -726,8 +722,7 @@ class Article extends Page {
         * TODO: actions other than 'view'
         */
        public function getRobotPolicy( $action, $pOutput ) {
-               global $wgOut, $wgArticleRobotPolicies, $wgNamespaceRobotPolicies;
-               global $wgDefaultRobotPolicy, $wgRequest;
+               global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
 
                $ns = $this->getTitle()->getNamespace();
 
@@ -749,13 +744,13 @@ class Article extends Page {
                                'index'  => 'noindex',
                                'follow' => 'nofollow'
                        );
-               } elseif ( $wgOut->isPrintable() ) {
+               } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
                        # Discourage indexing of printable versions, but encourage following
                        return array(
                                'index'  => 'noindex',
                                'follow' => 'follow'
                        );
-               } elseif ( $wgRequest->getInt( 'curid' ) ) {
+               } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
                        # For ?curid=x urls, disallow indexing
                        return array(
                                'index'  => 'noindex',
@@ -824,15 +819,16 @@ class Article extends Page {
 
        /**
         * If this request is a redirect view, send "redirected from" subtitle to
-        * $wgOut. Returns true if the header was needed, false if this is not a
-        * redirect view. Handles both local and remote redirects.
+        * the output. Returns true if the header was needed, false if this is not
+        * redirect view. Handles both local and remote redirects.
         *
         * @return boolean
         */
        public function showRedirectedFromHeader() {
-               global $wgOut, $wgRequest, $wgRedirectSources;
+               global $wgRedirectSources;
+               $outputPage = $this->getContext()->getOutput();
 
-               $rdfrom = $wgRequest->getVal( 'rdfrom' );
+               $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
 
                if ( isset( $this->mRedirectedFrom ) ) {
                        // This is an internally redirected page view.
@@ -845,21 +841,21 @@ class Article extends Page {
                                        array( 'redirect' => 'no' )
                                );
 
-                               $wgOut->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
 
                                // Set the fragment if one was specified in the redirect
                                if ( strval( $this->getTitle()->getFragment() ) != '' ) {
                                        $fragment = Xml::escapeJsString( $this->getTitle()->getFragmentForURL() );
-                                       $wgOut->addInlineScript( "redirectToFragment(\"$fragment\");" );
+                                       $outputPage->addInlineScript( "redirectToFragment(\"$fragment\");" );
                                }
 
                                // Add a <link rel="canonical"> tag
-                               $wgOut->addLink( array( 'rel' => 'canonical',
+                               $outputPage->addLink( array( 'rel' => 'canonical',
                                        'href' => $this->getTitle()->getLocalURL() )
                                );
 
-                               // Tell $wgOut the user arrived at this article through a redirect
-                               $wgOut->setRedirectedFrom( $this->mRedirectedFrom );
+                               // Tell the output object that the user arrived at this article through a redirect
+                               $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
 
                                return true;
                        }
@@ -868,7 +864,7 @@ class Article extends Page {
                        // If it was reported from a trusted site, supply a backlink.
                        if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
                                $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
-                               $wgOut->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
 
                                return true;
                        }
@@ -882,11 +878,9 @@ class Article extends Page {
         * [[MediaWiki:Talkpagetext]]. For Article::view().
         */
        public function showNamespaceHeader() {
-               global $wgOut;
-
                if ( $this->getTitle()->isTalkPage() ) {
                        if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
-                               $wgOut->wrapWikiMsg( "<div class=\"mw-talkpageheader\">\n$1\n</div>", array( 'talkpageheader' ) );
+                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class=\"mw-talkpageheader\">\n$1\n</div>", array( 'talkpageheader' ) );
                        }
                }
        }
@@ -895,11 +889,9 @@ class Article extends Page {
         * Show the footer section of an ordinary page view
         */
        public function showViewFooter() {
-               global $wgOut;
-
                # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
                if ( $this->getTitle()->getNamespace() == NS_USER_TALK && IP::isValid( $this->getTitle()->getText() ) ) {
-                       $wgOut->addWikiMsg( 'anontalkpagetext' );
+                       $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
                }
 
                # If we have been passed an &rcid= parameter, we want to give the user a
@@ -916,18 +908,19 @@ class Article extends Page {
         * desired, does nothing.
         */
        public function showPatrolFooter() {
-               global $wgOut, $wgRequest, $wgUser;
-
-               $rcid = $wgRequest->getVal( 'rcid' );
+               $request = $this->getContext()->getRequest();
+               $outputPage = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               $rcid = $request->getVal( 'rcid' );
 
                if ( !$rcid || !$this->getTitle()->quickUserCan( 'patrol' ) ) {
                        return;
                }
 
-               $token = $wgUser->getEditToken( $rcid );
-               $wgOut->preventClickjacking();
+               $token = $user->getEditToken( $rcid );
+               $outputPage->preventClickjacking();
 
-               $wgOut->addHTML(
+               $outputPage->addHTML(
                        "<div class='patrollink'>" .
                                wfMsgHtml(
                                        'markaspatrolledlink',
@@ -952,7 +945,8 @@ class Article extends Page {
         * namespace, show the default message text. To be called from Article::view().
         */
        public function showMissingArticle() {
-               global $wgOut, $wgRequest, $wgUser, $wgSend404Code;
+               global $wgSend404Code;
+               $outputPage = $this->getContext()->getOutput();
 
                # Show info in user (talk) namespace. Does the user exist? Is he blocked?
                if ( $this->getTitle()->getNamespace() == NS_USER || $this->getTitle()->getNamespace() == NS_USER_TALK ) {
@@ -962,11 +956,11 @@ class Article extends Page {
                        $ip = User::isIP( $rootPart );
 
                        if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
-                               $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
+                               $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
                                        array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
                        } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
                                LogEventsList::showLogExtract(
-                                       $wgOut,
+                                       $outputPage,
                                        'block',
                                        $user->getUserPage()->getPrefixedText(),
                                        '',
@@ -985,7 +979,7 @@ class Article extends Page {
                wfRunHooks( 'ShowMissingArticle', array( $this ) );
 
                # Show delete and move logs
-               LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->getTitle()->getPrefixedText(), '',
+               LogEventsList::showLogExtract( $outputPage, array( 'delete', 'move' ), $this->getTitle()->getPrefixedText(), '',
                        array(  'lim' => 10,
                                'conds' => array( "log_action != 'revision'" ),
                                'showIfEmpty' => false,
@@ -995,7 +989,7 @@ class Article extends Page {
                if ( !$this->mPage->hasViewableContent() && $wgSend404Code ) {
                        // If there's no backing content, send a 404 Not Found
                        // for better machine handling of broken links.
-                       $wgRequest->response()->header( "HTTP/1.1 404 Not Found" );
+                       $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
                }
 
                $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
@@ -1014,8 +1008,8 @@ class Article extends Page {
                        // Use the default message text
                        $text = $this->getTitle()->getDefaultMessageText();
                } else {
-                       $createErrors = $this->getTitle()->getUserPermissionsErrors( 'create', $wgUser );
-                       $editErrors = $this->getTitle()->getUserPermissionsErrors( 'edit', $wgUser );
+                       $createErrors = $this->getTitle()->getUserPermissionsErrors( 'create', $this->getContext()->getUser() );
+                       $editErrors = $this->getTitle()->getUserPermissionsErrors( 'edit', $this->getContext()->getUser() );
                        $errors = array_merge( $createErrors, $editErrors );
 
                        if ( !count( $errors ) ) {
@@ -1026,37 +1020,36 @@ class Article extends Page {
                }
                $text = "<div class='noarticletext'>\n$text\n</div>";
 
-               $wgOut->addWikiText( $text );
+               $outputPage->addWikiText( $text );
        }
 
        /**
         * If the revision requested for view is deleted, check permissions.
-        * Send either an error message or a warning header to $wgOut.
+        * Send either an error message or a warning header to the output.
         *
         * @return boolean true if the view is allowed, false if not.
         */
        public function showDeletedRevisionHeader() {
-               global $wgOut, $wgRequest;
-
                if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
                        // Not deleted
                        return true;
                }
 
+               $outputPage = $this->getContext()->getOutput();
                // If the user is not allowed to see it...
                if ( !$this->mRevision->userCan( Revision::DELETED_TEXT ) ) {
-                       $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                'rev-deleted-text-permission' );
 
                        return false;
                // If the user needs to confirm that they want to see it...
-               } elseif ( $wgRequest->getInt( 'unhide' ) != 1 ) {
+               } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
                        # Give explanation and add a link to view the revision...
                        $oldid = intval( $this->getOldID() );
                        $link = $this->getTitle()->getFullUrl( "oldid={$oldid}&unhide=1" );
                        $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
                                'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
-                       $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                array( $msg, $link ) );
 
                        return false;
@@ -1064,7 +1057,7 @@ class Article extends Page {
                } else {
                        $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
                                'rev-suppressed-text-view' : 'rev-deleted-text-view';
-                       $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
 
                        return true;
                }
@@ -1076,16 +1069,14 @@ class Article extends Page {
         *   Revision as of \<date\>; view current revision
         *   \<- Previous version | Next Version -\>
         *
-        * @param $oldid String: revision ID of this article revision
+        * @param $oldid int: revision ID of this article revision
         */
        public function setOldSubtitle( $oldid = 0 ) {
-               global $wgLang, $wgOut, $wgUser, $wgRequest;
-
                if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
                        return;
                }
 
-               $unhide = $wgRequest->getInt( 'unhide' ) == 1;
+               $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
 
                # Cascade unhide param in links for easy deletion browsing
                $extraParams = array();
@@ -1102,9 +1093,10 @@ class Article extends Page {
                $timestamp = $revision->getTimestamp();
 
                $current = ( $oldid == $this->mPage->getLatest() );
-               $td = $wgLang->timeanddate( $timestamp, true );
-               $tddate = $wgLang->date( $timestamp, true );
-               $tdtime = $wgLang->time( $timestamp, true );
+               $language = $this->getContext()->getLanguage();
+               $td = $language->timeanddate( $timestamp, true );
+               $tddate = $language->date( $timestamp, true );
+               $tdtime = $language->time( $timestamp, true );
 
                # Show user links if allowed to see them. If hidden, then show them only if requested...
                $userlinks = Linker::revUserTools( $revision, !$unhide );
@@ -1113,7 +1105,8 @@ class Article extends Page {
                        ? 'revision-info-current'
                        : 'revision-info';
 
-               $wgOut->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
                        $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
                        $tdtime, $revision->getUser() )->parse() . "</div>" );
 
@@ -1188,12 +1181,12 @@ class Article extends Page {
                                array( 'known', 'noclasses' )
                        );
 
-               $cdel = Linker::getRevDeleteLink( $wgUser, $revision, $this->getTitle() );
+               $cdel = Linker::getRevDeleteLink( $this->getContext()->getUser(), $revision, $this->getTitle() );
                if ( $cdel !== '' ) {
                        $cdel .= ' ';
                }
 
-               $wgOut->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
+               $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
                        wfMsgExt( 'revision-nav', array( 'escapenoentities', 'parsemag', 'replaceafter' ),
                        $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff ) . "</div>" );
        }
@@ -1207,7 +1200,7 @@ class Article extends Page {
         * @return string containing HMTL with redirect link
         */
        public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
-               global $wgOut, $wgStylePath;
+               global $wgStylePath;
 
                if ( !is_array( $target ) ) {
                        $target = array( $target );
@@ -1217,7 +1210,7 @@ class Article extends Page {
                $imageDir = $lang->getDir();
 
                if ( $appendSubtitle ) {
-                       $wgOut->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
+                       $this->getContext()->getOutput()->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
                }
 
                // the loop prepends the arrow image before the link, so the first case needs to be outside
@@ -1255,9 +1248,7 @@ class Article extends Page {
         * Handle action=render
         */
        public function render() {
-               global $wgOut;
-
-               $wgOut->setArticleBodyOnly( true );
+               $this->getContext()->getOutput()->setArticleBodyOnly( true );
                $this->view();
        }
 
@@ -1280,8 +1271,6 @@ class Article extends Page {
         * UI entry point for page deletion
         */
        public function delete() {
-               global $wgOut, $wgRequest, $wgLang;
-
                # This code desperately needs to be totally rewritten
 
                $title = $this->getTitle();
@@ -1303,13 +1292,14 @@ class Article extends Page {
                $conds = $title->pageCond();
                $latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
                if ( $latest === false ) {
-                       $wgOut->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
-                       $wgOut->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+                       $outputPage = $this->getContext()->getOutput();
+                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+                       $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
                                        array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
                                );
-                       $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+                       $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
                        LogEventsList::showLogExtract(
-                               $wgOut,
+                               $outputPage,
                                'delete',
                                $title->getPrefixedText()
                        );
@@ -1317,8 +1307,9 @@ class Article extends Page {
                        return;
                }
 
-               $deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList', 'other' );
-               $deleteReason = $wgRequest->getText( 'wpReason' );
+               $request = $this->getContext()->getRequest();
+               $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
+               $deleteReason = $request->getText( 'wpReason' );
 
                if ( $deleteReasonList == 'other' ) {
                        $reason = $deleteReason;
@@ -1329,15 +1320,15 @@ class Article extends Page {
                        $reason = $deleteReasonList;
                }
 
-               if ( $wgRequest->wasPosted() && $user->matchEditToken( $wgRequest->getVal( 'wpEditToken' ),
+               if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
                        array( 'delete', $this->getTitle()->getPrefixedText() ) ) )
                {
                        # Flag to hide all contents of the archived revisions
-                       $suppress = $wgRequest->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+                       $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
 
                        $this->doDelete( $reason, $suppress );
 
-                       if ( $wgRequest->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
+                       if ( $request->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
                                $this->doWatch();
                        } elseif ( $title->userIsWatching() ) {
                                $this->doUnwatch();
@@ -1356,8 +1347,8 @@ class Article extends Page {
                if ( $hasHistory ) {
                        $revisions = $this->mTitle->estimateRevisionCount();
                        // @todo FIXME: i18n issue/patchwork message
-                       $wgOut->addHTML( '<strong class="mw-delete-warning-revisions">' .
-                               wfMsgExt( 'historywarning', array( 'parseinline' ), $wgLang->formatNum( $revisions ) ) .
+                       $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
+                               wfMsgExt( 'historywarning', array( 'parseinline' ), $this->getContext()->getLanguage()->formatNum( $revisions ) ) .
                                wfMsgHtml( 'word-separator' ) . Linker::link( $title,
                                        wfMsgHtml( 'history' ),
                                        array( 'rel' => 'archives' ),
@@ -1367,8 +1358,8 @@ class Article extends Page {
 
                        if ( $this->mTitle->isBigDeletion() ) {
                                global $wgDeleteRevisionsLimit;
-                               $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
-                                       array( 'delete-warning-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
+                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
+                                       array( 'delete-warning-toobig', $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit ) ) );
                        }
                }
 
@@ -1381,16 +1372,15 @@ class Article extends Page {
         * @param $reason String: prefilled reason
         */
        public function confirmDelete( $reason ) {
-               global $wgOut;
-
                wfDebug( "Article::confirmDelete\n" );
 
-               $wgOut->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
-               $wgOut->addBacklinkSubtitle( $this->getTitle() );
-               $wgOut->setRobotPolicy( 'noindex,nofollow' );
-               $wgOut->addWikiMsg( 'confirmdeletetext' );
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
+               $outputPage->addBacklinkSubtitle( $this->getTitle() );
+               $outputPage->setRobotPolicy( 'noindex,nofollow' );
+               $outputPage->addWikiMsg( 'confirmdeletetext' );
 
-               wfRunHooks( 'ArticleConfirmDelete', array( $this, $wgOut, &$reason ) );
+               wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
 
                $user = $this->getContext()->getUser();
 
@@ -1474,9 +1464,9 @@ class Article extends Page {
                                $form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
                        }
 
-               $wgOut->addHTML( $form );
-               $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
-               LogEventsList::showLogExtract( $wgOut, 'delete',
+               $outputPage->addHTML( $form );
+               $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+               LogEventsList::showLogExtract( $outputPage, 'delete',
                        $this->getTitle()->getPrefixedText()
                );
        }
@@ -1487,34 +1477,33 @@ class Article extends Page {
         * @param $suppress bool
         */
        public function doDelete( $reason, $suppress = false ) {
-               global $wgOut;
-
                $error = '';
+               $outputPage = $this->getContext()->getOutput();
                if ( $this->mPage->doDeleteArticle( $reason, $suppress, 0, true, $error ) ) {
                        $deleted = $this->getTitle()->getPrefixedText();
 
-                       $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
-                       $wgOut->setRobotPolicy( 'noindex,nofollow' );
+                       $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
+                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
 
                        $loglink = '[[Special:Log/delete|' . wfMsgNoTrans( 'deletionlog' ) . ']]';
 
-                       $wgOut->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
-                       $wgOut->returnToMain( false );
+                       $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
+                       $outputPage->returnToMain( false );
                } else {
-                       $wgOut->setPageTitle( wfMessage( 'cannotdelete-title', $this->getTitle()->getPrefixedText() ) );
+                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $this->getTitle()->getPrefixedText() ) );
                        if ( $error == '' ) {
-                               $wgOut->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+                               $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
                                        array( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) )
                                );
-                               $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+                               $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
 
                                LogEventsList::showLogExtract(
-                                       $wgOut,
+                                       $outputPage,
                                        'delete',
                                        $this->getTitle()->getPrefixedText()
                                );
                        } else {
-                               $wgOut->addHTML( $error );
+                               $outputPage->addHTML( $error );
                        }
                }
        }
@@ -1587,9 +1576,7 @@ class Article extends Page {
         * @return ParserOutput or false if the given revsion ID is not found
         */
        public function getParserOutput( $oldid = null, User $user = null ) {
-               global $wgUser;
-
-               $user = is_null( $user ) ? $wgUser : $user;
+               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
                $parserOptions = $this->mPage->makeParserOptions( $user );
 
                return $this->mPage->getParserOutput( $parserOptions, $oldid );
@@ -1600,9 +1587,8 @@ class Article extends Page {
         * @return ParserOptions
         */
        public function getParserOptions() {
-               global $wgUser;
                if ( !$this->mParserOptions ) {
-                       $this->mParserOptions = $this->mPage->makeParserOptions( $wgUser );
+                       $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext()->getUser() );
                }
                // Clone to allow modifications of the return value without affecting cache
                return clone $this->mParserOptions;
@@ -1688,7 +1674,7 @@ class Article extends Page {
        }
 
        /**
-        * Add this page to $wgUser's watchlist
+        * Add this page to the current user's watchlist
         *
         * This is safe to be called multiple times
         *
@@ -1696,9 +1682,8 @@ class Article extends Page {
         * @deprecated since 1.18
         */
        public function doWatch() {
-               global $wgUser;
                wfDeprecated( __METHOD__, '1.18' );
-               return WatchAction::doWatch( $this->getTitle(), $wgUser );
+               return WatchAction::doWatch( $this->getTitle(), $this->getContext()->getUser() );
        }
 
        /**
@@ -1717,24 +1702,21 @@ class Article extends Page {
         * @deprecated since 1.18
         */
        public function doUnwatch() {
-               global $wgUser;
                wfDeprecated( __METHOD__, '1.18' );
-               return WatchAction::doUnwatch( $this->getTitle(), $wgUser );
+               return WatchAction::doUnwatch( $this->getTitle(), $this->getContext()->getUser() );
        }
 
        /**
         * Output a redirect back to the article.
         * This is typically used after an edit.
         *
-        * @deprecated in 1.18; call $wgOut->redirect() directly
+        * @deprecated in 1.18; call OutputPage::redirect() directly
         * @param $noRedir Boolean: add redirect=no
         * @param $sectionAnchor String: section to redirect to, including "#"
         * @param $extraQuery String: extra query params
         */
        public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
                wfDeprecated( __METHOD__, '1.18' );
-               global $wgOut;
-
                if ( $noRedir ) {
                        $query = 'redirect=no';
                        if ( $extraQuery )
@@ -1743,7 +1725,7 @@ class Article extends Page {
                        $query = $extraQuery;
                }
 
-               $wgOut->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
+               $this->getContext()->getOutput()->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
        }
 
        /**
@@ -1842,8 +1824,7 @@ class Article extends Page {
         * @return array
         */
        public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
-               global $wgUser;
-               $user = is_null( $user ) ? $wgUser : $user;
+               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
                return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
        }
 
@@ -1856,8 +1837,7 @@ class Article extends Page {
         * @return array
         */
        public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
-               global $wgUser;
-               $guser = is_null( $guser ) ? $wgUser : $guser;
+               $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
                return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
        }
 
index a1bbc3c..6710796 100644 (file)
@@ -27,6 +27,7 @@ $wgAutoloadLocalClasses = array(
        'BadTitleError' => 'includes/Exception.php',
        'BaseTemplate' => 'includes/SkinTemplate.php',
        'Block' => 'includes/Block.php',
+       'CacheHelper' => 'includes/CacheHelper.php',
        'Category' => 'includes/Category.php',
        'Categoryfinder' => 'includes/Categoryfinder.php',
        'CategoryPage' => 'includes/CategoryPage.php',
@@ -51,8 +52,6 @@ $wgAutoloadLocalClasses = array(
        'CookieJar' => 'includes/Cookie.php',
        'MWCryptRand' => 'includes/CryptRand.php',
        'CurlHttpRequest' => 'includes/HttpFunctions.php',
-//     'DBDataObject' => 'includes/DBDataObject.php',
-//     'DBTable' => 'includes/DBTable.php',
        'DeferrableUpdate' => 'includes/DeferredUpdates.php',
        'DeferredUpdates' => 'includes/DeferredUpdates.php',
        'DeprecatedGlobal' => 'includes/DeprecatedGlobal.php',
@@ -121,6 +120,7 @@ $wgAutoloadLocalClasses = array(
        'Http' => 'includes/HttpFunctions.php',
        'HttpError' => 'includes/Exception.php',
        'HttpRequest' => 'includes/HttpFunctions.old.php',
+       'ICacheHelper' => 'includes/CacheHelper.php',
        'IcuCollation' => 'includes/Collation.php',
        'IdentityCollation' => 'includes/Collation.php',
        'ImageGallery' => 'includes/ImageGallery.php',
@@ -260,6 +260,7 @@ $wgAutoloadLocalClasses = array(
        'ZipDirectoryReader' => 'includes/ZipDirectoryReader.php',
 
        # includes/actions
+       'CachedAction' => 'includes/actions/CachedAction.php',
        'CreditsAction' => 'includes/actions/CreditsAction.php',
        'DeleteAction' => 'includes/actions/DeleteAction.php',
        'EditAction' => 'includes/actions/EditAction.php',
@@ -315,6 +316,7 @@ $wgAutoloadLocalClasses = array(
        'ApiMain' => 'includes/api/ApiMain.php',
        'ApiMove' => 'includes/api/ApiMove.php',
        'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php',
+       'ApiOptions' => 'includes/api/ApiOptions.php',
        'ApiPageSet' => 'includes/api/ApiPageSet.php',
        'ApiParamInfo' => 'includes/api/ApiParamInfo.php',
        'ApiParse' => 'includes/api/ApiParse.php',
@@ -323,10 +325,10 @@ $wgAutoloadLocalClasses = array(
        'ApiPurge' => 'includes/api/ApiPurge.php',
        'ApiQuery' => 'includes/api/ApiQuery.php',
        'ApiQueryAllCategories' => 'includes/api/ApiQueryAllCategories.php',
-       'ApiQueryAllimages' => 'includes/api/ApiQueryAllimages.php',
+       'ApiQueryAllImages' => 'includes/api/ApiQueryAllImages.php',
        'ApiQueryAllLinks' => 'includes/api/ApiQueryAllLinks.php',
-       'ApiQueryAllmessages' => 'includes/api/ApiQueryAllmessages.php',
-       'ApiQueryAllpages' => 'includes/api/ApiQueryAllpages.php',
+       'ApiQueryAllMessages' => 'includes/api/ApiQueryAllMessages.php',
+       'ApiQueryAllPages' => 'includes/api/ApiQueryAllPages.php',
        'ApiQueryAllUsers' => 'includes/api/ApiQueryAllUsers.php',
        'ApiQueryBacklinks' => 'includes/api/ApiQueryBacklinks.php',
        'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
@@ -445,6 +447,9 @@ $wgAutoloadLocalClasses = array(
        'MySQLMasterPos' => 'includes/db/DatabaseMysql.php',
        'ORAField' => 'includes/db/DatabaseOracle.php',
        'ORAResult' => 'includes/db/DatabaseOracle.php',
+       'ORMResult' => 'includes/db/ORMResult.php',
+       'ORMRow' => 'includes/db/ORMRow.php',
+       'ORMTable' => 'includes/db/ORMTable.php',
        'PostgresField' => 'includes/db/DatabasePostgres.php',
        'ResultWrapper' => 'includes/db/DatabaseUtility.php',
        'SQLiteField' => 'includes/db/DatabaseSqlite.php',
@@ -506,10 +511,16 @@ $wgAutoloadLocalClasses = array(
        'FileBackend' => 'includes/filerepo/backend/FileBackend.php',
        'FileBackendStore' => 'includes/filerepo/backend/FileBackendStore.php',
        'FileBackendStoreShardListIterator' => 'includes/filerepo/backend/FileBackendStore.php',
+       'FileBackendStoreShardDirIterator' => 'includes/filerepo/backend/FileBackendStore.php',
+       'FileBackendStoreShardFileIterator' => 'includes/filerepo/backend/FileBackendStore.php',
        'FileBackendMultiWrite' => 'includes/filerepo/backend/FileBackendMultiWrite.php',
        'FSFileBackend' => 'includes/filerepo/backend/FSFileBackend.php',
+       'FSFileBackendList' => 'includes/filerepo/backend/FSFileBackend.php',
+       'FSFileBackendDirList' => 'includes/filerepo/backend/FSFileBackend.php',
        'FSFileBackendFileList' => 'includes/filerepo/backend/FSFileBackend.php',
        'SwiftFileBackend' => 'includes/filerepo/backend/SwiftFileBackend.php',
+       'SwiftFileBackendList' => 'includes/filerepo/backend/SwiftFileBackend.php',
+       'SwiftFileBackendDirList' => 'includes/filerepo/backend/SwiftFileBackend.php',
        'SwiftFileBackendFileList' => 'includes/filerepo/backend/SwiftFileBackend.php',
        'FileJournal' => 'includes/filerepo/backend/filejournal/FileJournal.php',
        'DBFileJournal' => 'includes/filerepo/backend/filejournal/DBFileJournal.php',
@@ -827,6 +838,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
        'SpecialBlockme' => 'includes/specials/SpecialBlockme.php',
        'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
+       'SpecialCachedPage' => 'includes/specials/SpecialCachedPage.php',
        'SpecialCategories' => 'includes/specials/SpecialCategories.php',
        'SpecialChangeEmail' => 'includes/specials/SpecialChangeEmail.php',
        'SpecialChangePassword' => 'includes/specials/SpecialChangePassword.php',
index dff1a5d..7cdc756 100644 (file)
@@ -28,7 +28,8 @@ class Block {
 
                $mBlockEmail,
                $mDisableUsertalk,
-               $mCreateAccount;
+               $mCreateAccount,
+               $mParentBlockId;
 
        /// @var User|String
        protected $target;
@@ -368,6 +369,7 @@ class Block {
                $this->mAuto = $row->ipb_auto;
                $this->mHideName = $row->ipb_deleted;
                $this->mId = $row->ipb_id;
+               $this->mParentBlockId = $row->ipb_parent_block_id;
 
                // I wish I didn't have to do this
                $db = wfGetDB( DB_SLAVE );
@@ -411,6 +413,7 @@ class Block {
                }
 
                $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'ipblocks', array( 'ipb_parent_block_id' => $this->getId() ), __METHOD__ );
                $dbw->delete( 'ipblocks', array( 'ipb_id' => $this->getId() ), __METHOD__ );
 
                return $dbw->affectedRows() > 0;
@@ -508,7 +511,8 @@ class Block {
                        'ipb_range_end'        => $this->getRangeEnd(),
                        'ipb_deleted'          => intval( $this->mHideName ), // typecast required for SQLite
                        'ipb_block_email'      => $this->prevents( 'sendemail' ),
-                       'ipb_allow_usertalk'   => !$this->prevents( 'editownusertalk' )
+                       'ipb_allow_usertalk'   => !$this->prevents( 'editownusertalk' ),
+                       'ipb_parent_block_id'            => $this->mParentBlockId
                );
 
                return $a;
@@ -666,6 +670,7 @@ class Block {
                # Continue suppressing the name if needed
                $autoblock->mHideName = $this->mHideName;
                $autoblock->prevents( 'editownusertalk', $this->prevents( 'editownusertalk' ) );
+               $autoblock->mParentBlockId = $this->mId;
 
                if ( $this->mExpiry == 'infinity' ) {
                        # Original block was indefinite, start an autoblock now
@@ -1075,8 +1080,6 @@ class Block {
         * @return array( User|String, Block::TYPE_ constant )
         */
        public static function parseTarget( $target ) {
-               $target = trim( $target );
-
                # We may have been through this before
                if( $target instanceof User ){
                        if( IP::isValid( $target->getName() ) ){
@@ -1088,6 +1091,8 @@ class Block {
                        return array( null, null );
                }
 
+               $target = trim( $target );
+
                if ( IP::isValid( $target ) ) {
                        # We can still create a User if it's an IP address, but we need to turn
                        # off validation checking (which would exclude IP addresses)
diff --git a/includes/CacheHelper.php b/includes/CacheHelper.php
new file mode 100644 (file)
index 0000000..6b6a594
--- /dev/null
@@ -0,0 +1,363 @@
+<?php
+
+/**
+ * Interface for all classes implementing CacheHelper functionality.
+ *
+ * @since 1.20
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+interface ICacheHelper {
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       function setCacheEnabled( $cacheEnabled );
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       function startCache( $cacheExpiry = null, $cacheEnabled = null );
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       function getCachedValue( $computeFunction, $args = array(), $key = null );
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       function saveCache();
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry..
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       function setExpiry( $cacheExpiry );
+
+}
+
+/**
+ * Helper class for caching various elements in a single cache entry.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * Before the first addCachedHTML call, you should call $this->startCache();
+ * After adding the last HTML that should be cached, call $this->saveCache();
+ *
+ * @since 1.20
+ *
+ * @file CacheHelper.php
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class CacheHelper implements ICacheHelper {
+
+       /**
+        * The time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        *
+        * @since 1.20
+        * @var integer
+        */
+       protected $cacheExpiry = 3600;
+
+       /**
+        * List of HTML chunks to be cached (if !hasCached) or that where cached (of hasCached).
+        * If not cached already, then the newly computed chunks are added here,
+        * if it as cached already, chunks are removed from this list as they are needed.
+        *
+        * @since 1.20
+        * @var array
+        */
+       protected $cachedChunks;
+
+       /**
+        * Indicates if the to be cached content was already cached.
+        * Null if this information is not available yet.
+        *
+        * @since 1.20
+        * @var boolean|null
+        */
+       protected $hasCached = null;
+
+       /**
+        * If the cache is enabled or not.
+        *
+        * @since 1.20
+        * @var boolean
+        */
+       protected $cacheEnabled = true;
+
+       /**
+        * Function that gets called when initialization is done.
+        *
+        * @since 1.20
+        * @var function
+        */
+       protected $onInitHandler = false;
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       public function setCacheEnabled( $cacheEnabled ) {
+               $this->cacheEnabled = $cacheEnabled;
+       }
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
+               if ( is_null( $this->hasCached ) ) {
+                       if ( !is_null( $cacheExpiry ) ) {
+                               $this->cacheExpiry = $cacheExpiry;
+                       }
+
+                       if ( !is_null( $cacheEnabled ) ) {
+                               $this->setCacheEnabled( $cacheEnabled );
+                       }
+
+                       $this->initCaching();
+               }
+       }
+
+       /**
+        * Returns a message that notifies the user he/she is looking at
+        * a cached version of the page, including a refresh link.
+        *
+        * @since 1.20
+        *
+        * @param IContextSource $context
+        * @param boolean $includePurgeLink
+        *
+        * @return string
+        */
+       public function getCachedNotice( IContextSource $context, $includePurgeLink = true ) {
+               if ( $this->cacheExpiry < 86400 * 3650 ) {
+                       $message = $context->msg(
+                               'cachedspecial-viewing-cached-ttl',
+                               $context->getLanguage()->formatDuration( $this->cacheExpiry )
+                       )->escaped();
+               }
+               else {
+                       $message = $context->msg(
+                               'cachedspecial-viewing-cached-ts'
+                       )->escaped();
+               }
+
+               if ( $includePurgeLink ) {
+                       $refreshArgs = $context->getRequest()->getQueryValues();
+                       unset( $refreshArgs['title'] );
+                       $refreshArgs['action'] = 'purge';
+
+                       $subPage = $context->getTitle()->getFullText();
+                       $subPage = explode( '/', $subPage, 2 );
+                       $subPage = count( $subPage ) > 1 ? $subPage[1] : false;
+
+                       $message .= ' ' . Linker::link(
+                               $context->getTitle( $subPage ),
+                               $context->msg( 'cachedspecial-refresh-now' )->escaped(),
+                               array(),
+                               $refreshArgs
+                       );
+               }
+
+               return $message;
+       }
+
+       /**
+        * Initializes the caching if not already done so.
+        * Should be called before any of the caching functionality is used.
+        *
+        * @since 1.20
+        */
+       protected function initCaching() {
+               if ( $this->cacheEnabled && is_null( $this->hasCached ) ) {
+                       $cachedChunks = wfGetCache( CACHE_ANYTHING )->get( $this->getCacheKeyString() );
+
+                       $this->hasCached = is_array( $cachedChunks );
+                       $this->cachedChunks = $this->hasCached ? $cachedChunks : array();
+
+                       if ( $this->onInitHandler !== false ) {
+                               call_user_func( $this->onInitHandler, $this->hasCached );
+                       }
+               }
+       }
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               $this->initCaching();
+
+               if ( $this->cacheEnabled && $this->hasCached ) {
+                       $value = null;
+
+                       if ( is_null( $key ) ) {
+                               $itemKey = array_keys( array_slice( $this->cachedChunks, 0, 1 ) );
+                               $itemKey = array_shift( $itemKey );
+
+                               if ( !is_integer( $itemKey ) ) {
+                                       wfWarn( "Attempted to get item with non-numeric key while the next item in the queue has a key ($itemKey) in " . __METHOD__ );
+                               }
+                               elseif ( is_null( $itemKey ) ) {
+                                       wfWarn( "Attempted to get an item while the queue is empty in " . __METHOD__ );
+                               }
+                               else {
+                                       $value = array_shift( $this->cachedChunks );
+                               }
+                       }
+                       else {
+                               if ( array_key_exists( $key, $this->cachedChunks ) ) {
+                                       $value = $this->cachedChunks[$key];
+                                       unset( $this->cachedChunks[$key] );
+                               }
+                               else {
+                                       wfWarn( "There is no item with key '$key' in this->cachedChunks in " . __METHOD__ );
+                               }
+                       }
+               }
+               else {
+                       if ( !is_array( $args ) ) {
+                               $args = array( $args );
+                       }
+
+                       $value = call_user_func_array( $computeFunction, $args );
+
+                       if ( $this->cacheEnabled ) {
+                               if ( is_null( $key ) ) {
+                                       $this->cachedChunks[] = $value;
+                               }
+                               else {
+                                       $this->cachedChunks[$key] = $value;
+                               }
+                       }
+               }
+
+               return $value;
+       }
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       public function saveCache() {
+               if ( $this->cacheEnabled && $this->hasCached === false && !empty( $this->cachedChunks ) ) {
+                       wfGetCache( CACHE_ANYTHING )->set( $this->getCacheKeyString(), $this->cachedChunks, $this->cacheExpiry );
+               }
+       }
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry..
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       public function setExpiry( $cacheExpiry ) {
+               $this->cacheExpiry = $cacheExpiry;
+       }
+
+       /**
+        * Returns the cache key to use to cache this page's HTML output.
+        * Is constructed from the special page name and language code.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       protected function getCacheKeyString() {
+               return call_user_func_array( 'wfMemcKey', $this->cacheKey );
+       }
+
+       /**
+        * Sets the cache key that should be used.
+        *
+        * @since 1.20
+        *
+        * @param array $cacheKey
+        */
+       public function setCacheKey( array $cacheKey ) {
+               $this->cacheKey = $cacheKey;
+       }
+
+       /**
+        * Rebuild the content, even if it's already cached.
+        * This effectively has the same effect as purging the cache,
+        * since it will be overridden with the new value on the next request.
+        *
+        * @since 1.20
+        */
+       public function rebuildOnDemand() {
+               $this->hasCached = false;
+       }
+
+       /**
+        * Sets a function that gets called when initialization of the cache is done.
+        *
+        * @since 1.20
+        *
+        * @param $handlerFunction
+        */
+       public function setOnInitializedHandler( $handlerFunction ) {
+               $this->onInitHandler = $handlerFunction;
+       }
+
+}
\ No newline at end of file
index fa2188e..ba3bfd6 100644 (file)
@@ -51,13 +51,13 @@ class ChangesFeed {
         * @param $rows ResultWrapper object with rows in recentchanges table
         * @param $lastmod Integer: timestamp of the last item in the recentchanges table (only used for the cache key)
         * @param $opts FormOptions as in SpecialRecentChanges::getDefaultOptions()
-        * @return null or true
+        * @return null|bool True or null
         */
        public function execute( $feed, $rows, $lastmod, $opts ) {
                global $wgLang, $wgRenderHashAppend;
 
                if ( !FeedUtils::checkFeedOutput( $this->format ) ) {
-                       return;
+                       return null;
                }
 
                $optionsHash = md5( serialize( $opts->getAllValues() ) ) . $wgRenderHashAppend;
index 6788984..7084bc6 100644 (file)
@@ -941,8 +941,7 @@ $wgImageLimits = array(
        array( 640, 480 ),
        array( 800, 600 ),
        array( 1024, 768 ),
-       array( 1280, 1024 ),
-       array( 10000, 10000 )
+       array( 1280, 1024 )
 );
 
 /**
@@ -3815,21 +3814,6 @@ $wgSpamRegex = array();
 /** Same as the above except for edit summaries */
 $wgSummarySpamRegex = array();
 
-/**
- * Similarly you can get a function to do the job. The function will be given
- * the following args:
- *   - a Title object for the article the edit is made on
- *   - the text submitted in the textarea (wpTextbox1)
- *   - the section number.
- * The return should be boolean indicating whether the edit matched some evilness:
- *  - true : block it
- *  - false : let it through
- *
- * @deprecated since 1.17 Use hooks. See SpamBlacklist extension.
- * @var $wgFilterCallback bool|string|Closure
- */
-$wgFilterCallback = false;
-
 /**
  * Whether to use DNS blacklists in $wgDnsBlacklistUrls to check for open proxies
  * @since 1.16
@@ -4157,6 +4141,11 @@ $wgShowExceptionDetails = false;
  */
 $wgShowDBErrorBacktrace = false;
 
+/**
+ * If true, send the exception backtrace to the error log
+ */
+$wgLogExceptionBacktrace = true;
+
 /**
  * Expose backend server host names through the API and various HTML comments
  */
@@ -4578,6 +4567,20 @@ $wgReadOnlyFile = false;
  */
 $wgUpgradeKey = false;
 
+/**
+ * Map GIT repository URLs to viewer URLs to provide links in Special:Version
+ *
+ * Key is a pattern passed to preg_match() and preg_replace(),
+ * without the delimiters (which are #) and must match the whole URL.
+ * The value is the replacement for the key (it can contain $1, etc.)
+ * %h will be replaced by the short SHA-1 (7 first chars) and %H by the
+ * full SHA-1 of the HEAD revision.
+ */
+$wgGitRepositoryViewers = array(
+    'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+    'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+);
+
 /** @} */ # End of maintenance }
 
 /************************************************************************//**
index 69187e4..5979ed4 100644 (file)
@@ -36,11 +36,6 @@ class EditPage {
         */
        const AS_HOOK_ERROR                = 210;
 
-       /**
-        * Status: The filter function set in $wgFilterCallback returned true (= block it)
-        */
-       const AS_FILTERING                 = 211;
-
        /**
         * Status: A hook function returned an error
         */
@@ -144,6 +139,11 @@ class EditPage {
         */
        const AS_IMAGE_REDIRECT_LOGGED     = 234;
 
+       /**
+        * HTML id and name for the beginning of the edit form.
+        */
+       const EDITFORM_ID                  = 'editform';
+
        /**
         * @var Article
         */
@@ -819,7 +819,7 @@ class EditPage {
 
                                                        # If we just undid one rev, use an autosummary
                                                        $firstrev = $oldrev->getNext();
-                                                       if ( $firstrev->getId() == $undo ) {
+                                                       if ( $firstrev && $firstrev->getId() == $undo ) {
                                                                $undoSummary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() );
                                                                if ( $this->summary === '' ) {
                                                                        $this->summary = $undoSummary;
@@ -985,7 +985,6 @@ class EditPage {
                                return true;
 
                        case self::AS_HOOK_ERROR:
-                       case self::AS_FILTERING:
                                return false;
 
                        case self::AS_SUCCESS_NEW_ARTICLE:
@@ -1057,8 +1056,7 @@ class EditPage {
         * AS_CONTENT_TOO_BIG and AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some time.
         */
        function internalAttemptSave( &$result, $bot = false ) {
-               global $wgFilterCallback, $wgUser, $wgRequest, $wgParser;
-               global $wgMaxArticleSize;
+               global $wgUser, $wgRequest, $wgParser, $wgMaxArticleSize;
 
                $status = Status::newGood();
 
@@ -1104,13 +1102,6 @@ class EditPage {
                        wfProfileOut( __METHOD__ );
                        return $status;
                }
-               if ( $wgFilterCallback && is_callable( $wgFilterCallback ) && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section, $this->hookError, $this->summary ) ) {
-                       # Error messages or other handling should be performed by the filter function
-                       $status->setResult( false, self::AS_FILTERING );
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
-                       return $status;
-               }
                if ( !wfRunHooks( 'EditFilter', array( $this, $this->textbox1, $this->section, &$this->hookError, $this->summary ) ) ) {
                        # Error messages etc. could be handled within the hook...
                        $status->fatal( 'hookaborted' );
@@ -1188,9 +1179,10 @@ class EditPage {
 
                wfProfileOut( __METHOD__ . '-checks' );
 
-               # If article is new, insert it.
-               $aid = $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
-               $new = ( $aid == 0 );
+               // Use SELECT FOR UPDATE here to avoid transaction collision in
+               // WikiPage::updateRevisionOn() and ending in the self::AS_END case.
+               $this->mArticle->loadPageData( 'forupdate' );
+               $new = !$this->mArticle->exists();
 
                if ( $new ) {
                        // Late check for create permission, just in case *PARANOIA*
@@ -1259,10 +1251,7 @@ class EditPage {
                } else {
 
                        # Article exists. Check for edit conflict.
-
-                       $this->mArticle->clear(); # Force reload of dates, etc.
                        $timestamp = $this->mArticle->getTimestamp();
-
                        wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
 
                        if ( $timestamp != $this->edittime ) {
@@ -1609,13 +1598,13 @@ class EditPage {
                } elseif ( $contextTitle->exists() && $this->section != '' ) {
                        $msg = $this->section == 'new' ? 'editingcomment' : 'editingsection';
                } else {
-                       $msg = $contextTitle->exists() || ( $contextTitle->getNamespace() == NS_MEDIAWIKI && $contextTitle->getDefaultMessageText() !== false ) ?\r
-                               'editing' : 'creating';\r
+                       $msg = $contextTitle->exists() || ( $contextTitle->getNamespace() == NS_MEDIAWIKI && $contextTitle->getDefaultMessageText() !== false ) ?
+                               'editing' : 'creating';
                }
                # Use the title defined by DISPLAYTITLE magic word when present
-               $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;\r
-               if ( $displayTitle === false ) {\r
-                       $displayTitle = $contextTitle->getPrefixedText();\r
+               $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
+               if ( $displayTitle === false ) {
+                       $displayTitle = $contextTitle->getPrefixedText();
                }
                $wgOut->setPageTitle( wfMessage( $msg, $displayTitle ) );
        }
@@ -1769,7 +1758,7 @@ class EditPage {
                        }
                }
 
-               $wgOut->addHTML( Html::openElement( 'form', array( 'id' => 'editform', 'name' => 'editform',
+               $wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
                        'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
                        'enctype' => 'multipart/form-data' ) ) );
 
@@ -1913,7 +1902,7 @@ class EditPage {
 
                # Optional notices on a per-namespace and per-page basis
                $editnotice_ns = 'editnotice-' . $this->mTitle->getNamespace();
-               $editnotice_ns_message = wfMessage( $editnotice_ns )->inContentLanguage();
+               $editnotice_ns_message = wfMessage( $editnotice_ns );
                if ( $editnotice_ns_message->exists() ) {
                        $wgOut->addWikiText( $editnotice_ns_message->plain() );
                }
@@ -1922,7 +1911,7 @@ class EditPage {
                        $editnotice_base = $editnotice_ns;
                        while ( count( $parts ) > 0 ) {
                                $editnotice_base .= '-' . array_shift( $parts );
-                               $editnotice_base_msg = wfMessage( $editnotice_base )->inContentLanguage();
+                               $editnotice_base_msg = wfMessage( $editnotice_base );
                                if ( $editnotice_base_msg->exists() ) {
                                        $wgOut->addWikiText( $editnotice_base_msg->plain() );
                                }
@@ -1930,7 +1919,7 @@ class EditPage {
                } else {
                        # Even if there are no subpages in namespace, we still don't want / in MW ns.
                        $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->mTitle->getDBkey() );
-                       $editnoticeMsg = wfMessage( $editnoticeText )->inContentLanguage();
+                       $editnoticeMsg = wfMessage( $editnoticeText );
                        if ( $editnoticeMsg->exists() ) {
                                $wgOut->addWikiText( $editnoticeMsg->plain() );
                        }
@@ -2550,7 +2539,7 @@ HTML
         * @return string
         */
        function getPreviewText() {
-               global $wgOut, $wgUser, $wgParser, $wgRawHtml;
+               global $wgOut, $wgUser, $wgParser, $wgRawHtml, $wgLang;
 
                wfProfileIn( __METHOD__ );
 
@@ -2578,7 +2567,8 @@ HTML
                } elseif ( $this->incompleteForm ) {
                        $note = wfMsg( 'edit_form_incomplete' );
                } else {
-                       $note = wfMsg( 'previewnote' );
+                       $note = wfMsg( 'previewnote' ) .
+                               ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMsg( 'continue-editing' ) . ']]';
                }
 
                $parserOptions = ParserOptions::newFromUser( $wgUser );
@@ -2588,9 +2578,7 @@ HTML
                $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
 
                # don't parse non-wikitext pages, show message about preview
-               # XXX: stupid php bug won't let us use $this->getContextTitle()->isCssJsSubpage() here -- This note has been there since r3530. Sure the bug was fixed time ago?
-
-               if ( $this->isCssJsSubpage || !$this->mTitle->isWikitextPage() ) {
+               if ( $this->mTitle->isCssJsSubpage() || !$this->mTitle->isWikitextPage() ) {
                        if ( $this->mTitle->isCssJsSubpage() ) {
                                $level = 'user';
                        } elseif ( $this->mTitle->isCssOrJsPage() ) {
@@ -2601,20 +2589,23 @@ HTML
 
                        # Used messages to make sure grep find them:
                        # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
+                       $class = 'mw-code';
                        if ( $level ) {
                                if ( preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
                                        $previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMsg( "{$level}csspreview" ) . "\n</div>";
-                                       $class = "mw-code mw-css";
+                                       $class .= " mw-css";
                                } elseif ( preg_match( "/\\.js$/", $this->mTitle->getText() ) ) {
                                        $previewtext = "<div id='mw-{$level}jspreview'>\n" . wfMsg( "{$level}jspreview" ) . "\n</div>";
-                                       $class = "mw-code mw-js";
+                                       $class .= " mw-js";
                                } else {
                                        throw new MWException( 'A CSS/JS (sub)page but which is not css nor js!' );
                                }
+                               $parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
+                               $previewHTML = $parserOutput->getText();
+                       } else {
+                               $previewHTML = '';
                        }
 
-                       $parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
-                       $previewHTML = $parserOutput->mText;
                        $previewHTML .= "<pre class=\"$class\" dir=\"ltr\">\n" . htmlspecialchars( $this->textbox1 ) . "\n</pre>\n";
                } else {
                        $toparse = $this->textbox1;
index c75da5a..f7b6b96 100644 (file)
@@ -15,6 +15,8 @@
  * @ingroup Exception
  */
 class MWException extends Exception {
+       var $logId;
+
        /**
         * Should the exception use $wgOut to output the error ?
         * @return bool
@@ -53,11 +55,11 @@ class MWException extends Exception {
                global $wgExceptionHooks;
 
                if ( !isset( $wgExceptionHooks ) || !is_array( $wgExceptionHooks ) ) {
-                       return; // Just silently ignore
+                       return null; // Just silently ignore
                }
 
                if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
-                       return;
+                       return null;
                }
 
                $hooks = $wgExceptionHooks[ $name ];
@@ -74,6 +76,7 @@ class MWException extends Exception {
                                return $result;
                        }
                }
+               return null;
        }
 
        /**
@@ -110,9 +113,14 @@ class MWException extends Exception {
                                '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
                                "</p>\n";
                } else {
-                       return "<p>Set <b><tt>\$wgShowExceptionDetails = true;</tt></b> " .
+                       return 
+                               "<div class=\"errorbox\">" .
+                               '[' . $this->getLogId() . '] ' .
+                               gmdate( 'Y-m-d H:i:s' ) . 
+                               ": Fatal exception of type " . get_class( $this ) . "</div>\n" .
+                               "<!-- Set \$wgShowExceptionDetails = true; " .
                                "at the bottom of LocalSettings.php to show detailed " .
-                               "debugging information.</p>";
+                               "debugging information. -->";
                }
        }
 
@@ -141,6 +149,13 @@ class MWException extends Exception {
                return $this->msg( 'internalerror', "Internal error" );
        }
 
+       function getLogId() {
+               if ( $this->logId === null ) {
+                       $this->logId = wfRandomString( 8 );
+               }
+               return $this->logId;
+       }
+
        /**
         * Return the requested URL and point to file and line number from which the
         * exception occured
@@ -150,6 +165,7 @@ class MWException extends Exception {
        function getLogMessage() {
                global $wgRequest;
 
+               $id = $this->getLogId();
                $file = $this->getFile();
                $line = $this->getLine();
                $message = $this->getMessage();
@@ -163,7 +179,7 @@ class MWException extends Exception {
                        $url = '[no req]';
                }
 
-               return "$url   Exception from line $line of $file: $message";
+               return "[$id] $url   Exception from line $line of $file: $message";
        }
 
        /** Output the exception report using HTML */
@@ -197,10 +213,15 @@ class MWException extends Exception {
         * It will be either HTML or plain text based on isCommandLine().
         */
        function report() {
+               global $wgLogExceptionBacktrace;
                $log = $this->getLogMessage();
 
                if ( $log ) {
-                       wfDebugLog( 'exception', $log );
+                       if ( $wgLogExceptionBacktrace ) {
+                               wfDebugLog( 'exception', $log . "\n" . $this->getTraceAsString() . "\n" );
+                       } else {
+                               wfDebugLog( 'exception', $log );
+                       }
                }
 
                if ( defined( 'MW_API' ) ) {
@@ -461,7 +482,7 @@ class HttpError extends MWException {
                        $content = htmlspecialchars( $this->content );
                }
 
-               print "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n".
+               print "<!DOCTYPE html>\n".
                        "<html><head><title>$header</title></head>\n" .
                        "<body><h1>$header</h1><p>$content</p></body></html>\n";
        }
index 73b07c3..ea6fd94 100644 (file)
@@ -49,6 +49,15 @@ class WikiExporter {
        const TEXT = 0;
        const STUB = 1;
 
+       var $buffer;
+
+       var $text;
+
+       /**
+        * @var DumpOutput
+        */
+       var $sink;
+
        /**
         * If using WikiExporter::STREAM to stream a large amount of data,
         * provide a database connection which is not managed by
@@ -145,6 +154,10 @@ class WikiExporter {
                        ' AND page_title=' . $this->db->addQuotes( $title->getDBkey() ) );
        }
 
+       /**
+        * @param $name string
+        * @throws MWException
+        */
        public function pageByName( $name ) {
                $title = Title::newFromText( $name );
                if ( is_null( $title ) ) {
@@ -154,6 +167,9 @@ class WikiExporter {
                }
        }
 
+       /**
+        * @param $names array
+        */
        public function pagesByName( $names ) {
                foreach ( $names as $name ) {
                        $this->pageByName( $name );
@@ -164,6 +180,10 @@ class WikiExporter {
                $this->dumpFrom( '' );
        }
 
+       /**
+        * @param $start int
+        * @param $end int
+        */
        public function logsByRange( $start, $end ) {
                $condition = 'log_id >= ' . intval( $start );
                if ( $end ) {
@@ -172,9 +192,13 @@ class WikiExporter {
                $this->dumpFrom( $condition );
        }
 
-       # Generates the distinct list of authors of an article
-       # Not called by default (depends on $this->list_authors)
-       # Can be set by Special:Export when not exporting whole history
+       /**
+        * Generates the distinct list of authors of an article
+        * Not called by default (depends on $this->list_authors)
+        * Can be set by Special:Export when not exporting whole history
+        *
+        * @param $cond
+        */
        protected function do_list_authors( $cond ) {
                wfProfileIn( __METHOD__ );
                $this->author_list = "<contributors>";
@@ -205,6 +229,11 @@ class WikiExporter {
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * @param $cond string
+        * @throws MWException
+        * @throws Exception
+        */
        protected function dumpFrom( $cond = '' ) {
                wfProfileIn( __METHOD__ );
                # For logging dumps...
@@ -419,6 +448,9 @@ class WikiExporter {
                }
        }
 
+       /**
+        * @param $resultset array
+        */
        protected function outputLogStream( $resultset ) {
                foreach ( $resultset as $row ) {
                        $output = $this->writer->writeLogItem( $row );
@@ -464,6 +496,9 @@ class XmlDumpWriter {
                        $this->siteInfo();
        }
 
+       /**
+        * @return string
+        */
        function siteInfo() {
                $info = array(
                        $this->sitename(),
@@ -476,20 +511,32 @@ class XmlDumpWriter {
                        "\n  </siteinfo>\n";
        }
 
+       /**
+        * @return string
+        */
        function sitename() {
                global $wgSitename;
                return Xml::element( 'sitename', array(), $wgSitename );
        }
 
+       /**
+        * @return string
+        */
        function generator() {
                global $wgVersion;
                return Xml::element( 'generator', array(), "MediaWiki $wgVersion" );
        }
 
+       /**
+        * @return string
+        */
        function homelink() {
                return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalUrl() );
        }
 
+       /**
+        * @return string
+        */
        function caseSetting() {
                global $wgCapitalLinks;
                // "case-insensitive" option is reserved for future
@@ -497,6 +544,9 @@ class XmlDumpWriter {
                return Xml::element( 'case', array(), $sensitivity );
        }
 
+       /**
+        * @return string
+        */
        function namespaces() {
                global $wgContLang;
                $spaces = "<namespaces>\n";
@@ -591,7 +641,7 @@ class XmlDumpWriter {
                if ( $row->rev_deleted & Revision::DELETED_COMMENT ) {
                        $out .= "      " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
                } elseif ( $row->rev_comment != '' ) {
-                       $out .= "      " . Xml::elementClean( 'comment', null, strval( $row->rev_comment ) ) . "\n";
+                       $out .= "      " . Xml::elementClean( 'comment', array(), strval( $row->rev_comment ) ) . "\n";
                }
 
                $text = '';
@@ -671,11 +721,20 @@ class XmlDumpWriter {
                return $out;
        }
 
+       /**
+        * @param $timestamp string
+        * @return string
+        */
        function writeTimestamp( $timestamp ) {
                $ts = wfTimestamp( TS_ISO_8601, $timestamp );
                return "      " . Xml::element( 'timestamp', null, $ts ) . "\n";
        }
 
+       /**
+        * @param $id
+        * @param $text string
+        * @return string
+        */
        function writeContributor( $id, $text ) {
                $out = "      <contributor>\n";
                if ( $id || !IP::isValid( $text ) ) {
@@ -690,6 +749,8 @@ class XmlDumpWriter {
 
        /**
         * Warning! This data is potentially inconsistent. :(
+        * @param $row
+        * @param $dumpContents bool
         * @return string
         */
        function writeUploads( $row, $dumpContents = false ) {
@@ -774,32 +835,55 @@ class XmlDumpWriter {
  * @ingroup Dump
  */
 class DumpOutput {
+
+       /**
+        * @param $string string
+        */
        function writeOpenStream( $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $page
+        * @param $string string
+        */
        function writeOpenPage( $page, $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $string string
+        */
        function writeClosePage( $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeRevision( $rev, $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeLogItem( $rev, $string ) {
                $this->write( $string );
        }
 
        /**
         * Override to write to a different stream type.
+        * @param $string string
         * @return bool
         */
        function write( $string ) {
@@ -845,11 +929,17 @@ class DumpOutput {
 class DumpFileOutput extends DumpOutput {
        protected $handle = false, $filename;
 
+       /**
+        * @param $file
+        */
        function __construct( $file ) {
                $this->handle = fopen( $file, "wt" );
                $this->filename = $file;
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                parent::writeCloseStream( $string );
                if ( $this->handle ) {
@@ -858,20 +948,35 @@ class DumpFileOutput extends DumpOutput {
                }
        }
 
+       /**
+        * @param $string string
+        */
        function write( $string ) {
                fputs( $this->handle, $string );
        }
 
+       /**
+        * @param $newname
+        */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
        }
 
+       /**
+        * @param $newname
+        * @throws MWException
+        */
        function renameOrException( $newname ) {
                        if (! rename( $this->filename, $newname ) ) {
                                throw new MWException( __METHOD__ . ": rename of file {$this->filename} to $newname failed\n" );
                        }
        }
 
+       /**
+        * @param $newname array
+        * @return mixed
+        * @throws MWException
+        */
        function checkRenameArgCount( $newname ) {
                if ( is_array( $newname ) ) {
                        if ( count( $newname ) > 1 ) {
@@ -883,6 +988,10 @@ class DumpFileOutput extends DumpOutput {
                return $newname;
        }
 
+       /**
+        * @param $newname mixed
+        * @param $open bool
+        */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
                if ( $newname ) {
@@ -897,6 +1006,9 @@ class DumpFileOutput extends DumpOutput {
                }
        }
 
+       /**
+        * @return string|null
+        */
        function getFilenames() {
                return $this->filename;
        }
@@ -912,6 +1024,10 @@ class DumpPipeOutput extends DumpFileOutput {
        protected $command, $filename;
        protected $procOpenResource = false;
 
+       /**
+        * @param $command
+        * @param $file null
+        */
        function __construct( $command, $file = null ) {
                if ( !is_null( $file ) ) {
                        $command .=  " > " . wfEscapeShellArg( $file );
@@ -922,6 +1038,9 @@ class DumpPipeOutput extends DumpFileOutput {
                $this->filename = $file;
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                parent::writeCloseStream( $string );
                if ( $this->procOpenResource ) {
@@ -930,6 +1049,9 @@ class DumpPipeOutput extends DumpFileOutput {
                }
        }
 
+       /**
+        * @param $command
+        */
        function startCommand( $command ) {
                $spec = array(
                        0 => array( "pipe", "r" ),
@@ -939,10 +1061,17 @@ class DumpPipeOutput extends DumpFileOutput {
                $this->handle = $pipes[0];
        }
 
+       /**
+        * @param mixed $newname
+        */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
        }
 
+       /**
+        * @param $newname mixed
+        * @param $open bool
+        */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
                if ( $newname ) {
@@ -970,6 +1099,10 @@ class DumpPipeOutput extends DumpFileOutput {
  * @ingroup Dump
  */
 class DumpGZipOutput extends DumpPipeOutput {
+
+       /**
+        * @param $file string
+        */
        function __construct( $file ) {
                parent::__construct( "gzip", $file );
        }
@@ -980,6 +1113,10 @@ class DumpGZipOutput extends DumpPipeOutput {
  * @ingroup Dump
  */
 class DumpBZip2Output extends DumpPipeOutput {
+
+       /**
+        * @param $file string
+        */
        function __construct( $file ) {
                parent::__construct( "bzip2", $file );
        }
@@ -990,12 +1127,20 @@ class DumpBZip2Output extends DumpPipeOutput {
  * @ingroup Dump
  */
 class Dump7ZipOutput extends DumpPipeOutput {
+
+       /**
+        * @param $file string
+        */
        function __construct( $file ) {
                $command = $this->setup7zCommand( $file );
                parent::__construct( $command );
                $this->filename = $file;
        }
 
+       /**
+        * @param $file string
+        * @return string
+        */
        function setup7zCommand( $file ) {
                $command = "7za a -bd -si " . wfEscapeShellArg( $file );
                // Suppress annoying useless crap from p7zip
@@ -1004,6 +1149,10 @@ class Dump7ZipOutput extends DumpPipeOutput {
                return( $command );
        }
 
+       /**
+        * @param $newname string
+        * @param $open bool
+        */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
                if ( $newname ) {
@@ -1018,8 +1167,6 @@ class Dump7ZipOutput extends DumpPipeOutput {
        }
 }
 
-
-
 /**
  * Dump output filter class.
  * This just does output filtering and streaming; XML formatting is done
@@ -1027,18 +1174,44 @@ class Dump7ZipOutput extends DumpPipeOutput {
  * @ingroup Dump
  */
 class DumpFilter {
+
+       /**
+        * @var DumpOutput
+        * FIXME will need to be made protected whenever legacy code
+        * is updated.
+        */
+       public $sink;
+
+       /**
+        * @var bool
+        */
+       protected $sendingThisPage;
+
+       /**
+        * @param $sink DumpOutput
+        */
        function __construct( &$sink ) {
                $this->sink =& $sink;
        }
 
+       /**
+        * @param $string string
+        */
        function writeOpenStream( $string ) {
                $this->sink->writeOpenStream( $string );
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                $this->sink->writeCloseStream( $string );
        }
 
+       /**
+        * @param $page
+        * @param $string string
+        */
        function writeOpenPage( $page, $string ) {
                $this->sendingThisPage = $this->pass( $page, $string );
                if ( $this->sendingThisPage ) {
@@ -1046,6 +1219,9 @@ class DumpFilter {
                }
        }
 
+       /**
+        * @param $string string
+        */
        function writeClosePage( $string ) {
                if ( $this->sendingThisPage ) {
                        $this->sink->writeClosePage( $string );
@@ -1053,30 +1229,49 @@ class DumpFilter {
                }
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeRevision( $rev, $string ) {
                if ( $this->sendingThisPage ) {
                        $this->sink->writeRevision( $rev, $string );
                }
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeLogItem( $rev, $string ) {
                $this->sink->writeRevision( $rev, $string );
        }
 
+       /**
+        * @param $newname string
+        */
        function closeRenameAndReopen( $newname ) {
                $this->sink->closeRenameAndReopen( $newname );
        }
 
+       /**
+        * @param $newname string
+        * @param $open bool
+        */
        function closeAndRename( $newname, $open = false ) {
                $this->sink->closeAndRename( $newname, $open );
        }
 
+       /**
+        * @return array
+        */
        function getFilenames() {
                return $this->sink->getFilenames();
        }
 
        /**
         * Override for page-based filter types.
+        * @param $page
         * @return bool
         */
        function pass( $page ) {
@@ -1089,6 +1284,11 @@ class DumpFilter {
  * @ingroup Dump
  */
 class DumpNotalkFilter extends DumpFilter {
+
+       /**
+        * @param $page
+        * @return bool
+        */
        function pass( $page ) {
                return !MWNamespace::isTalk( $page->page_namespace );
        }
@@ -1102,6 +1302,10 @@ class DumpNamespaceFilter extends DumpFilter {
        var $invert = false;
        var $namespaces = array();
 
+       /**
+        * @param $sink DumpOutput
+        * @param $param
+        */
        function __construct( &$sink, $param ) {
                parent::__construct( $sink );
 
@@ -1144,6 +1348,10 @@ class DumpNamespaceFilter extends DumpFilter {
                }
        }
 
+       /**
+        * @param $page
+        * @return bool
+        */
        function pass( $page ) {
                $match = isset( $this->namespaces[$page->page_namespace] );
                return $this->invert xor $match;
@@ -1158,11 +1366,18 @@ class DumpNamespaceFilter extends DumpFilter {
 class DumpLatestFilter extends DumpFilter {
        var $page, $pageString, $rev, $revString;
 
+       /**
+        * @param $page
+        * @param $string string
+        */
        function writeOpenPage( $page, $string ) {
                $this->page = $page;
                $this->pageString = $string;
        }
 
+       /**
+        * @param $string string
+        */
        function writeClosePage( $string ) {
                if ( $this->rev ) {
                        $this->sink->writeOpenPage( $this->page, $this->pageString );
@@ -1175,6 +1390,10 @@ class DumpLatestFilter extends DumpFilter {
                $this->pageString = null;
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeRevision( $rev, $string ) {
                if ( $rev->rev_id == $this->page->page_latest ) {
                        $this->rev = $rev;
@@ -1188,51 +1407,82 @@ class DumpLatestFilter extends DumpFilter {
  * @ingroup Dump
  */
 class DumpMultiWriter {
+
+       /**
+        * @param $sinks
+        */
        function __construct( $sinks ) {
                $this->sinks = $sinks;
                $this->count = count( $sinks );
        }
 
+       /**
+        * @param $string string
+        */
        function writeOpenStream( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeOpenStream( $string );
                }
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeCloseStream( $string );
                }
        }
 
+       /**
+        * @param $page
+        * @param $string string
+        */
        function writeOpenPage( $page, $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeOpenPage( $page, $string );
                }
        }
 
+       /**
+        * @param $string
+        */
        function writeClosePage( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeClosePage( $string );
                }
        }
 
+       /**
+        * @param $rev
+        * @param $string
+        */
        function writeRevision( $rev, $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeRevision( $rev, $string );
                }
        }
 
+       /**
+        * @param $newnames
+        */
        function closeRenameAndReopen( $newnames ) {
                $this->closeAndRename( $newnames, true );
        }
 
+       /**
+        * @param $newnames array
+        * @param bool $open
+        */
        function closeAndRename( $newnames, $open = false ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->closeAndRename( $newnames[$i], $open );
                }
        }
 
+       /**
+        * @return array
+        */
        function getFilenames() {
                $filenames = array();
                for ( $i = 0; $i < $this->count; $i++ ) {
@@ -1243,6 +1493,10 @@ class DumpMultiWriter {
 
 }
 
+/**
+ * @param $string string
+ * @return string
+ */
 function xmlsafe( $string ) {
        wfProfileIn( __FUNCTION__ );
 
index b870475..3468325 100644 (file)
@@ -80,10 +80,16 @@ class ExternalEdit extends ContextSource {
                } elseif ( $this->getRequest()->getVal( 'mode' ) == 'file' ) {
                        $type = "Edit file";
                        $image = wfLocalFile( $this->getTitle() );
-                       $urls = array( 'File' => array(
-                               'Extension' => $image->getExtension(),
-                               'URL' => $image->getCanonicalURL()
-                       ) );
+                       if ( $image ) {
+                               $urls = array(
+                                       'File' => array(
+                                               'Extension' => $image->getExtension(),
+                                               'URL' => $image->getCanonicalURL()
+                                       )
+                               );
+                       } else{
+                               $urls = array();
+                       }
                } else {
                        $type = "Edit text";
                        # *.wiki file extension is used by some editors for syntax
index 8649fe7..569d836 100644 (file)
@@ -120,6 +120,7 @@ class ForkController {
                // Don't share DB, storage, or memcached connections
                wfGetLBFactory()->destroyInstance();
                FileBackendGroup::destroySingleton();
+               LockManagerGroup::destroySingleton();
                ObjectCache::clear();
                $wgMemc = null;
        }
index 0dfd48d..e1b0379 100644 (file)
@@ -21,17 +21,9 @@ class GitInfo {
        protected $basedir;
 
        /**
-        * Map of repo URLs to viewer URLs.
-        * Key is a pattern passed to preg_match() and preg_replace(),
-        * without the delimiters (which are #) and must match the whole URL.
-        * The value is the replacement for the key (it can contain $1, etc.)
-        * %h will be replaced by the short SHA-1 (7 first chars) and %H by the
-        * full SHA-1 of the HEAD revision.
+        * Map of repo URLs to viewer URLs. Access via static method getViewers().
         */
-       protected $viewers = array(
-               'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
-               'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
-       );
+       private static $viewers = false;
 
        /**
         * @param $dir string The root directory of the repo where the .git dir can be found
@@ -78,7 +70,7 @@ class GitInfo {
                if ( preg_match( "/ref: (.*)/", $HEAD, $m ) ) {
                        return rtrim( $m[1] );
                } else {
-                       return $HEAD;
+                       return rtrim( $HEAD );
                }
        }
 
@@ -151,7 +143,7 @@ class GitInfo {
                if ( substr( $url, -4 ) !== '.git' ) {
                        $url .= '.git';
                }
-               foreach( $this->viewers as $repo => $viewer ) {
+               foreach( self::getViewers() as $repo => $viewer ) {
                        $pattern = '#^' . $repo . '$#';
                        if ( preg_match( $pattern, $url ) ) {
                                $viewerUrl = preg_replace( $pattern, $viewer, $url );
@@ -189,4 +181,19 @@ class GitInfo {
        public static function headViewUrl() {
                return self::repo()->getHeadViewUrl();
        }
+
+       /**
+        * Gets the list of repository viewers
+        * @return array
+        */
+       protected static function getViewers() {
+               global $wgGitRepositoryViewers;
+
+               if( self::$viewers === false ) {
+                       self::$viewers = $wgGitRepositoryViewers;
+                       wfRunHooks( 'GitViewers', array( &self::$viewers ) );
+               }
+
+               return self::$viewers;
+       }
 }
index 8764783..cea7e48 100644 (file)
@@ -368,7 +368,7 @@ function wfUrlencode( $s ) {
  * @param $prefix String
  * @return String
  */
-function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
+function wfArrayToCgi( $array1, $array2 = null, $prefix = '' ) {
        if ( !is_null( $array2 ) ) {
                $array1 = $array1 + $array2;
        }
@@ -387,7 +387,7 @@ function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
                                foreach ( $value as $k => $v ) {
                                        $cgi .= $firstTime ? '' : '&';
                                        if ( is_array( $v ) ) {
-                                               $cgi .= wfArrayToCGI( $v, null, $key . "[$k]" );
+                                               $cgi .= wfArrayToCgi( $v, null, $key . "[$k]" );
                                        } else {
                                                $cgi .= urlencode( $key . "[$k]" ) . '=' . urlencode( $v );
                                        }
@@ -405,7 +405,7 @@ function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
 }
 
 /**
- * This is the logical opposite of wfArrayToCGI(): it accepts a query string as
+ * This is the logical opposite of wfArrayToCgi(): it accepts a query string as
  * its argument and returns the same string in array form.  This allows compa-
  * tibility with legacy functions that accept raw query strings instead of nice
  * arrays.  Of course, keys and values are urldecode()d.
@@ -462,7 +462,7 @@ function wfCgiToArray( $query ) {
  */
 function wfAppendQuery( $url, $query ) {
        if ( is_array( $query ) ) {
-               $query = wfArrayToCGI( $query );
+               $query = wfArrayToCgi( $query );
        }
        if( $query != '' ) {
                if( false === strpos( $url, '?' ) ) {
@@ -559,6 +559,7 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
  *
  * @todo Need to integrate this into wfExpandUrl (bug 32168)
  *
+ * @since 1.19
  * @param $urlParts Array URL parts, as output from wfParseUrl
  * @return string URL assembled from its component parts
  */
@@ -2657,7 +2658,8 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
 
        if( !$ok ) {
                // PHP doesn't report the path in its warning message, so add our own to aid in diagnosis.
-               trigger_error( __FUNCTION__ . ": failed to mkdir \"$dir\" mode $mode", E_USER_WARNING );
+               trigger_error( sprintf( "%s: failed to mkdir \"%s\" mode 0%o", __FUNCTION__, $dir, $mode ),
+                       E_USER_WARNING );
        }
        return $ok;
 }
@@ -2759,9 +2761,7 @@ function wfDl( $extension, $fileName = null ) {
 
        $canDl = false;
        $sapi = php_sapi_name();
-       if( version_compare( PHP_VERSION, '5.3.0', '<' ) ||
-               $sapi == 'cli' || $sapi == 'cgi' || $sapi == 'embed' )
-       {
+       if( $sapi == 'cli' || $sapi == 'cgi' || $sapi == 'embed' ) {
                $canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
                && wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
        }
@@ -2899,16 +2899,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array() ) {
        }
        $cmd = $envcmd . $cmd;
 
-       if ( wfIsWindows() ) {
-               if ( version_compare( PHP_VERSION, '5.3.0', '<' ) && /* Fixed in 5.3.0 :) */
-                       ( version_compare( PHP_VERSION, '5.2.1', '>=' ) || php_uname( 's' ) == 'Windows NT' ) )
-               {
-                       # Hack to work around PHP's flawed invocation of cmd.exe
-                       # http://news.php.net/php.internals/21796
-                       # Windows 9x doesn't accept any kind of quotes
-                       $cmd = '"' . $cmd . '"';
-               }
-       } elseif ( php_uname( 's' ) == 'Linux' ) {
+       if ( php_uname( 's' ) == 'Linux' ) {
                $time = intval( $wgMaxShellTime );
                $mem = intval( $wgMaxShellMemory );
                $filesize = intval( $wgMaxShellFileSize );
index ebaac3c..029ed05 100644 (file)
@@ -1096,6 +1096,11 @@ abstract class HTMLFormField {
                                $msg = wfMessage( array_shift( $helpMessage ), $helpMessage );
 
                                if( $msg->exists() ) {
+                                       if( is_null( $helptext ) ) {
+                                               $helptext = '';
+                                       } else {
+                                               $helptext .= wfMessage( 'word-separator' )->escaped(); // some space
+                                       }
                                        $helptext .= $msg->parse(); // Append message
                                }
                        }
@@ -1306,6 +1311,10 @@ class HTMLTextAreaField extends HTMLFormField {
                        $attribs['readonly'] = 'readonly';
                }
 
+               if ( isset( $this->mParams['placeholder'] ) ) {
+                       $attribs['placeholder'] = $this->mParams['placeholder'];
+               }
+
                foreach ( array( 'required', 'autofocus' ) as $param ) {
                        if ( isset( $this->mParams[$param] ) ) {
                                $attribs[$param] = '';
index a1d2e59..5b75088 100644 (file)
@@ -216,6 +216,11 @@ class MWHttpRequest {
 
                foreach ( $members as $o ) {
                        if ( isset( $options[$o] ) ) {
+                               // ensure that MWHttpRequest::method is always
+                               // uppercased. Bug 36137
+                               if ( $o == 'method' ) {
+                                       $options[$o] = strtoupper( $options[$o] );
+                               }
                                $this->$o = $options[$o];
                        }
                }
@@ -751,6 +756,12 @@ class CurlHttpRequest extends MWHttpRequest {
                $this->parseHeader();
                $this->setStatus();
 
+               if ( isset( $this->respHeaders['content-length'] ) ) {
+                       if ( strlen( $this->content ) < $this->getResponseHeader( 'content-length' ) ) {
+                               $this->status->fatal( 'http-truncated-body' );
+                       }
+               }
+
                return $this->status;
        }
 
@@ -885,7 +896,7 @@ class PhpHttpRequest extends MWHttpRequest {
                        return $this->status;
                }
 
-               // If everything went OK, or we recieved some error code
+               // If everything went OK, or we received some error code
                // get the response body content.
                if ( $this->status->isOK()
                                || (int)$this->respStatus >= 300) {
index 5a8fb8e..f947f09 100644 (file)
@@ -141,23 +141,24 @@ class ImageGallery {
         * @param $title Title object of the image that is added to the gallery
         * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
         * @param $alt   String: Alt text for the image
+        * @param $link  String: Override image link (optional)
         */
-       function add( $title, $html = '', $alt = '' ) {
+       function add( $title, $html = '', $alt = '', $link = '') {
                if ( $title instanceof File ) {
                        // Old calling convention
                        $title = $title->getTitle();
                }
-               $this->mImages[] = array( $title, $html, $alt );
+               $this->mImages[] = array( $title, $html, $alt, $link );
                wfDebug( 'ImageGallery::add ' . $title->getText() . "\n" );
        }
 
        /**
-       * Add an image at the beginning of the gallery.
-       *
-       * @param $title Title object of the image that is added to the gallery
-       * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
-       * @param $alt   String: Alt text for the image
-       */
+        * Add an image at the beginning of the gallery.
+        *
+        * @param $title Title object of the image that is added to the gallery
+        * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
+        * @param $alt   String: Alt text for the image
+        */
        function insert( $title, $html = '', $alt = '' ) {
                if ( $title instanceof File ) {
                        // Old calling convention
@@ -245,6 +246,7 @@ class ImageGallery {
                        $nt = $pair[0];
                        $text = $pair[1]; # "text" means "caption" here
                        $alt = $pair[2];
+                       $link = $pair[3];
 
                        $descQuery = false;
                        if ( $nt->getNamespace() == NS_FILE ) {
@@ -289,6 +291,7 @@ class ImageGallery {
                                        'desc-link' => true,
                                        'desc-query' => $descQuery,
                                        'alt' => $alt,
+                                       'custom-url-link' => $link
                                );
                                # In the absence of both alt text and caption, fall back on providing screen readers with the filename as alt text
                                if ( $alt == '' && $text == '' ) {
@@ -346,9 +349,9 @@ class ImageGallery {
                                        . '<div style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
                                        . $thumbhtml
                                        . "\n\t\t\t" . '<div class="gallerytext">' . "\n"
-                                               . $textlink . $text . $fileSize
+                                       . $textlink . $text . $fileSize
                                        . "\n\t\t\t</div>"
-                               . "\n\t\t</div></li>";
+                                       . "\n\t\t</div></li>";
                }
                $output .= "\n</ul>";
 
@@ -378,8 +381,8 @@ class ImageGallery {
         */
        public function getContextTitle() {
                return is_object( $this->contextTitle ) && $this->contextTitle instanceof Title
-                               ? $this->contextTitle
-                               : false;
+                       ? $this->contextTitle
+                       : false;
        }
 
 } //class
index 7453baa..c19e83f 100644 (file)
@@ -30,7 +30,7 @@ class ImagePage extends Article {
        /**
         * Constructor from a page id
         * @param $id Int article ID to load
-        * @returnImagePage|null
+        * @return ImagePage|null
         */
        public static function newFromID( $id ) {
                $t = Title::newFromID( $id );
@@ -51,7 +51,7 @@ class ImagePage extends Article {
 
        protected function loadFile() {
                if ( $this->fileLoaded ) {
-                       return true;
+                       return;
                }
                $this->fileLoaded = true;
 
@@ -75,19 +75,21 @@ class ImagePage extends Article {
         * Include body text only; none of the image extras
         */
        public function render() {
-               global $wgOut;
-               $wgOut->setArticleBodyOnly( true );
+               $this->getContext()->setArticleBodyOnly( true );
                parent::view();
        }
 
        public function view() {
-               global $wgOut, $wgShowEXIF, $wgRequest, $wgUser;
+               global $wgShowEXIF;
 
-               $diff = $wgRequest->getVal( 'diff' );
-               $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
+               $out = $this->getContext()->getOutput();
+               $request = $this->getContext()->getRequest();
+               $diff = $request->getVal( 'diff' );
+               $diffOnly = $request->getBool( 'diffonly', $this->getContext()->getUser()->getOption( 'diffonly' ) );
 
                if ( $this->getTitle()->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) ) {
-                       return parent::view();
+                       parent::view();
+                       return;
                }
 
                $this->loadFile();
@@ -96,13 +98,14 @@ class ImagePage extends Article {
                        if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || isset( $diff ) ) {
                                // mTitle is the same as the redirect target so ask Article
                                // to perform the redirect for us.
-                               $wgRequest->setVal( 'diffonly', 'true' );
-                               return parent::view();
+                               $request->setVal( 'diffonly', 'true' );
+                               parent::view();
+                               return;
                        } else {
                                // mTitle is not the same as the redirect target so it is
                                // probably the redirect page itself. Fake the redirect symbol
-                               $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
-                               $wgOut->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
+                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+                               $out->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
                                        /* $appendSubtitle */ true, /* $forceKnown */ true ) );
                                $this->mPage->doViewUpdates( $this->getContext()->getUser() );
                                return;
@@ -118,7 +121,7 @@ class ImagePage extends Article {
                }
 
                if ( !$diff && $this->displayImg->exists() ) {
-                       $wgOut->addHTML( $this->showTOC( $showmeta ) );
+                       $out->addHTML( $this->showTOC( $showmeta ) );
                }
 
                if ( !$diff ) {
@@ -130,15 +133,15 @@ class ImagePage extends Article {
                        # NS_FILE is in the user language, but this section (the actual wikitext)
                        # should be in page content language
                        $pageLang = $this->getTitle()->getPageLanguage();
-                       $wgOut->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
+                       $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
                                'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
                                'class' => 'mw-content-'.$pageLang->getDir() ) ) );
                        parent::view();
-                       $wgOut->addHTML( Xml::closeElement( 'div' ) );
+                       $out->addHTML( Xml::closeElement( 'div' ) );
                } else {
                        # Just need to set the right headers
-                       $wgOut->setArticleFlag( true );
-                       $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
+                       $out->setArticleFlag( true );
+                       $out->setPageTitle( $this->getTitle()->getPrefixedText() );
                        $this->mPage->doViewUpdates( $this->getContext()->getUser() );
                }
 
@@ -146,16 +149,16 @@ class ImagePage extends Article {
                if ( $this->mExtraDescription ) {
                        $fol = wfMessage( 'shareddescriptionfollows' );
                        if ( !$fol->isDisabled() ) {
-                               $wgOut->addWikiText( $fol->plain() );
+                               $out->addWikiText( $fol->plain() );
                        }
-                       $wgOut->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
                }
 
                $this->closeShowImage();
                $this->imageHistory();
                // TODO: Cleanup the following
 
-               $wgOut->addHTML( Xml::element( 'h2',
+               $out->addHTML( Xml::element( 'h2',
                        array( 'id' => 'filelinks' ),
                        wfMsg( 'imagelinks' ) ) . "\n" );
                $this->imageDupes();
@@ -167,24 +170,24 @@ class ImagePage extends Article {
                $html = '';
                wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
                if ( $html ) {
-                       $wgOut->addHTML( $html );
+                       $out->addHTML( $html );
                }
 
                if ( $showmeta ) {
-                       $wgOut->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
-                       $wgOut->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
-                       $wgOut->addModules( array( 'mediawiki.action.view.metadata' ) );
+                       $out->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
+                       $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
+                       $out->addModules( array( 'mediawiki.action.view.metadata' ) );
                }
 
                // Add remote Filepage.css
                if( !$this->repo->isLocal() ) {
                        $css = $this->repo->getDescriptionStylesheetUrl();
                        if ( $css ) {
-                               $wgOut->addStyle( $css );
+                               $out->addStyle( $css );
                        }
                }
                // always show the local local Filepage.css, bug 29277
-               $wgOut->addModuleStyles( 'filepage' );
+               $out->addModuleStyles( 'filepage' );
        }
 
        /**
@@ -260,12 +263,16 @@ class ImagePage extends Article {
        }
 
        protected function openShowImage() {
-               global $wgOut, $wgUser, $wgImageLimits, $wgRequest,
-                       $wgLang, $wgEnableUploads, $wgSend404Code;
+               global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
 
                $this->loadFile();
+               $out = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               $lang = $this->getContext()->getLanguage();
+               $dirmark = $lang->getDirMarkEntity();
+               $request = $this->getContext()->getRequest();
 
-               $sizeSel = intval( $wgUser->getOption( 'imagesize' ) );
+               $sizeSel = intval( $user->getOption( 'imagesize' ) );
                if ( !isset( $wgImageLimits[$sizeSel] ) ) {
                        $sizeSel = User::getDefaultOption( 'imagesize' );
 
@@ -279,11 +286,10 @@ class ImagePage extends Article {
                $max = $wgImageLimits[$sizeSel];
                $maxWidth = $max[0];
                $maxHeight = $max[1];
-               $dirmark = $wgLang->getDirMarkEntity();
 
                if ( $this->displayImg->exists() ) {
                        # image
-                       $page = $wgRequest->getIntOrNull( 'page' );
+                       $page = $request->getIntOrNull( 'page' );
                        if ( is_null( $page ) ) {
                                $params = array();
                                $page = 1;
@@ -297,7 +303,7 @@ class ImagePage extends Article {
 
                        $longDesc = wfMsg( 'parentheses', $this->displayImg->getLongDesc() );
 
-                       wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$wgOut ) );
+                       wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
 
                        if ( $this->displayImg->allowInlineDisplay() ) {
                                # image
@@ -333,7 +339,7 @@ class ImagePage extends Article {
                                        if ( count( $otherSizes ) && $this->displayImg->getRepo()->canTransformVia404() ) {
                                                $msgsmall .= ' ' .
                                                Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
-                                                       wfMessage( 'show-big-image-other' )->rawParams( $wgLang->pipeList( $otherSizes ) )->
+                                                       wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
                                                        params( count( $otherSizes ) )->parse()
                                                );
                                        }
@@ -355,7 +361,7 @@ class ImagePage extends Article {
 
                                $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
                                if ( $isMulti ) {
-                                       $wgOut->addHTML( '<table class="multipageimage"><tr><td>' );
+                                       $out->addHTML( '<table class="multipageimage"><tr><td>' );
                                }
 
                                if ( $thumbnail ) {
@@ -363,7 +369,7 @@ class ImagePage extends Article {
                                                'alt' => $this->displayImg->getTitle()->getPrefixedText(),
                                                'file-link' => true,
                                        );
-                                       $wgOut->addHTML( '<div class="fullImageLink" id="file">' .
+                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
                                                $thumbnail->toHtml( $options ) .
                                                $anchorclose . "</div>\n" );
                                }
@@ -372,7 +378,7 @@ class ImagePage extends Article {
                                        $count = $this->displayImg->pageCount();
 
                                        if ( $page > 1 ) {
-                                               $label = $wgOut->parse( wfMsg( 'imgmultipageprev' ), false );
+                                               $label = $out->parse( wfMsg( 'imgmultipageprev' ), false );
                                                $link = Linker::link(
                                                        $this->getTitle(),
                                                        $label,
@@ -410,13 +416,13 @@ class ImagePage extends Article {
                                        );
                                        $options = array();
                                        for ( $i = 1; $i <= $count; $i++ ) {
-                                               $options[] = Xml::option( $wgLang->formatNum( $i ), $i, $i == $page );
+                                               $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
                                        }
                                        $select = Xml::tags( 'select',
                                                array( 'id' => 'pageselector', 'name' => 'page' ),
                                                implode( "\n", $options ) );
 
-                                       $wgOut->addHTML(
+                                       $out->addHTML(
                                                '</td><td><div class="multipageimagenavbox">' .
                                                Xml::openElement( 'form', $formParams ) .
                                                Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
@@ -431,7 +437,7 @@ class ImagePage extends Article {
                                if ( $this->displayImg->isSafeFile() ) {
                                        $icon = $this->displayImg->iconThumb();
 
-                                       $wgOut->addHTML( '<div class="fullImageLink" id="file">' .
+                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
                                                $icon->toHtml( array( 'file-link' => true ) ) .
                                                "</div>\n" );
                                }
@@ -456,13 +462,13 @@ class ImagePage extends Article {
                                        // The dirmark, however, must not be immediately adjacent
                                        // to the filename, because it can get copied with it.
                                        // See bug 25277.
-                                       $wgOut->addWikiText( <<<EOT
+                                       $out->addWikiText( <<<EOT
 <div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
 <div class="mediaWarning">$warning</div>
 EOT
                                                );
                                } else {
-                                       $wgOut->addWikiText( <<<EOT
+                                       $out->addWikiText( <<<EOT
 <div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
 </div>
 EOT
@@ -479,7 +485,7 @@ EOT
                                # No article exists either
                                # Show deletion log to be consistent with normal articles
                                LogEventsList::showLogExtract(
-                                       $wgOut,
+                                       $out,
                                        array( 'delete', 'move' ),
                                        $this->getTitle()->getPrefixedText(),
                                        '',
@@ -491,7 +497,7 @@ EOT
                                );
                        }
 
-                       if ( $wgEnableUploads && $wgUser->isAllowed( 'upload' ) ) {
+                       if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
                                // Only show an upload link if the user can upload
                                $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
                                $nofile = array(
@@ -504,15 +510,15 @@ EOT
                        // Note, if there is an image description page, but
                        // no image, then this setRobotPolicy is overriden
                        // by Article::View().
-                       $wgOut->setRobotPolicy( 'noindex,nofollow' );
-                       $wgOut->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
+                       $out->setRobotPolicy( 'noindex,nofollow' );
+                       $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
                        if ( !$this->getID() && $wgSend404Code ) {
                                // If there is no image, no shared image, and no description page,
                                // output a 404, to be consistent with articles.
-                               $wgRequest->response()->header( 'HTTP/1.1 404 Not Found' );
+                               $request->response()->header( 'HTTP/1.1 404 Not Found' );
                        }
                }
-               $wgOut->setFileVersion( $this->displayImg );
+               $out->setFileVersion( $this->displayImg );
        }
 
        /**
@@ -542,8 +548,7 @@ EOT
         * Show a notice that the file is from a shared repository
         */
        protected function printSharedImageText() {
-               global $wgOut;
-
+               $out = $this->getContext()->getOutput();
                $this->loadFile();
 
                $descUrl = $this->mPage->getFile()->getDescriptionUrl();
@@ -551,18 +556,18 @@ EOT
 
                /* Add canonical to head if there is no local page for this shared file */
                if( $descUrl && $this->mPage->getID() == 0 ) {
-                       $wgOut->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
+                       $out->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
                }
 
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
                if ( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-'  ) {
-                       $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
                } elseif ( $descUrl && wfMsgNoTrans( 'sharedupload-desc-there' ) !== '-' ) {
-                       $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
-                       $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
                }
 
                if ( $descText ) {
@@ -584,7 +589,7 @@ EOT
         * external editing (and instructions link) etc.
         */
        protected function uploadLinksBox() {
-               global $wgUser, $wgOut, $wgEnableUploads, $wgUseExternalEditor;
+               global $wgEnableUploads, $wgUseExternalEditor;
 
                if ( !$wgEnableUploads ) {
                        return;
@@ -595,12 +600,13 @@ EOT
                        return;
                }
 
-               $wgOut->addHTML( "<br /><ul>\n" );
+               $out = $this->getContext()->getOutput();
+               $out->addHTML( "<br /><ul>\n" );
 
                # "Upload a new version of this file" link
-               if ( UploadBase::userCanReUpload( $wgUser, $this->mPage->getFile()->name ) ) {
+               if ( UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
                        $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
-                       $wgOut->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
+                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
                }
 
                # External editing link
@@ -616,14 +622,14 @@ EOT
                                ),
                                array( 'known', 'noclasses' )
                        );
-                       $wgOut->addHTML(
+                       $out->addHTML(
                                '<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
                                wfMsgExt( 'edit-externally-help', array( 'parseinline' ) ) .
                                "</small></li>\n"
                        );
                }
 
-               $wgOut->addHTML( "</ul>\n" );
+               $out->addHTML( "</ul>\n" );
        }
 
        protected function closeShowImage() { } # For overloading
@@ -633,12 +639,11 @@ EOT
         * we follow it with an upload history of the image and its usage.
         */
        protected function imageHistory() {
-               global $wgOut;
-
                $this->loadFile();
+               $out = $this->getContext()->getOutput();
                $pager = new ImageHistoryPseudoPager( $this );
-               $wgOut->addHTML( $pager->getBody() );
-               $wgOut->preventClickjacking( $pager->getPreventClickjacking() );
+               $out->addHTML( $pager->getBody() );
+               $out->preventClickjacking( $pager->getPreventClickjacking() );
 
                $this->mPage->getFile()->resetHistory(); // free db resources
 
@@ -667,10 +672,9 @@ EOT
        }
 
        protected function imageLinks() {
-               global $wgOut, $wgLang;
-
                $limit = 100;
 
+               $out = $this->getContext()->getOutput();
                $res = $this->queryImageLinks( $this->getTitle()->getDbKey(), $limit + 1);
                $rows = array();
                $redirects = array();
@@ -694,7 +698,7 @@ EOT
                }
 
                if ( $count == 0 ) {
-                       $wgOut->wrapWikiMsg(
+                       $out->wrapWikiMsg(
                                Html::rawElement( 'div',
                                        array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
                                'nolinkstoimage'
@@ -702,18 +706,18 @@ EOT
                        return;
                }
 
-               $wgOut->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
+               $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
                if ( !$hasMore ) {
-                       $wgOut->addWikiMsg( 'linkstoimage', $count );
+                       $out->addWikiMsg( 'linkstoimage', $count );
                } else {
                        // More links than the limit. Add a link to [[Special:Whatlinkshere]]
-                       $wgOut->addWikiMsg( 'linkstoimage-more',
-                               $wgLang->formatNum( $limit ),
+                       $out->addWikiMsg( 'linkstoimage-more',
+                               $this->getContext()->getLanguage()->formatNum( $limit ),
                                $this->getTitle()->getPrefixedDBkey()
                        );
                }
 
-               $wgOut->addHTML(
+               $out->addHTML(
                        Html::openElement( 'ul',
                                array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
                );
@@ -752,7 +756,7 @@ EOT
                                $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
                                        $link, $ul )->parse();
                        }
-                       $wgOut->addHTML( Html::rawElement(
+                       $out->addHTML( Html::rawElement(
                                        'li',
                                        array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
                                        $liContents
@@ -760,31 +764,30 @@ EOT
                        );
 
                };
-               $wgOut->addHTML( Html::closeElement( 'ul' ) . "\n" );
+               $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
                $res->free();
 
                // Add a links to [[Special:Whatlinkshere]]
                if ( $count > $limit ) {
-                       $wgOut->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
+                       $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
                }
-               $wgOut->addHTML( Html::closeElement( 'div' ) . "\n" );
+               $out->addHTML( Html::closeElement( 'div' ) . "\n" );
        }
 
        protected function imageDupes() {
-               global $wgOut, $wgLang;
-
                $this->loadFile();
+               $out = $this->getContext()->getOutput();
 
                $dupes = $this->mPage->getDuplicates();
                if ( count( $dupes ) == 0 ) {
                        return;
                }
 
-               $wgOut->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
-               $wgOut->addWikiMsg( 'duplicatesoffile',
-                       $wgLang->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
+               $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
+               $out->addWikiMsg( 'duplicatesoffile',
+                       $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
                );
-               $wgOut->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
+               $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
 
                /**
                 * @var $file File
@@ -804,9 +807,9 @@ EOT
                                        $file->getTitle()->getPrefixedText() );
                                $fromSrc = wfMsg( 'shared-repo-from', $file->getRepo()->getDisplayName() );
                        }
-                       $wgOut->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
+                       $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
-               $wgOut->addHTML( "</ul></div>\n" );
+               $out->addHTML( "</ul></div>\n" );
        }
 
        /**
@@ -830,12 +833,12 @@ EOT
         * @param $description String
         */
        function showError( $description ) {
-               global $wgOut;
-               $wgOut->setPageTitle( wfMessage( 'internalerror' ) );
-               $wgOut->setRobotPolicy( 'noindex,nofollow' );
-               $wgOut->setArticleRelated( false );
-               $wgOut->enableClientCache( false );
-               $wgOut->addWikiText( $description );
+               $out = $this->getContext()->getOutput();
+               $out->setPageTitle( wfMessage( 'internalerror' ) );
+               $out->setRobotPolicy( 'noindex,nofollow' );
+               $out->setArticleRelated( false );
+               $out->enableClientCache( false );
+               $out->addWikiText( $description );
        }
 
        /**
@@ -860,7 +863,7 @@ EOT
  *
  * @ingroup Media
  */
-class ImageHistoryList {
+class ImageHistoryList extends ContextSource {
 
        /**
         * @var Title
@@ -895,6 +898,7 @@ class ImageHistoryList {
                $this->title = $imagePage->getTitle();
                $this->imagePage = $imagePage;
                $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
+               $this->setContext( $imagePage->getContext() );
        }
 
        /**
@@ -916,14 +920,13 @@ class ImageHistoryList {
         * @return string
         */
        public function beginImageHistoryList( $navLinks = '' ) {
-               global $wgOut, $wgUser;
                return Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'filehist' ) ) . "\n"
                        . "<div id=\"mw-imagepage-section-filehistory\">\n"
-                       . $wgOut->parse( wfMsgNoTrans( 'filehist-help' ) )
+                       . $this->getOutput()->parse( wfMsgNoTrans( 'filehist-help' ) )
                        . $navLinks . "\n"
                        . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
                        . '<tr><td></td>'
-                       . ( $this->current->isLocal() && ( $wgUser->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+                       . ( $this->current->isLocal() && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
                        . '<th>' . wfMsgHtml( 'filehist-datetime' ) . '</th>'
                        . ( $this->showThumb ? '<th>' . wfMsgHtml( 'filehist-thumb' ) . '</th>' : '' )
                        . '<th>' . wfMsgHtml( 'filehist-dimensions' ) . '</th>'
@@ -946,22 +949,24 @@ class ImageHistoryList {
         * @return string
         */
        public function imageHistoryLine( $iscur, $file ) {
-               global $wgUser, $wgLang, $wgContLang;
+               global $wgContLang;
 
+               $user = $this->getUser();
+               $lang = $this->getLanguage();
                $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
                $img = $iscur ? $file->getName() : $file->getArchiveName();
-               $user = $file->getUser( 'id' );
-               $usertext = $file->getUser( 'text' );
+               $userId = $file->getUser( 'id' );
+               $userText = $file->getUser( 'text' );
                $description = $file->getDescription();
 
                $local = $this->current->isLocal();
                $row = $selected = '';
 
                // Deletion link
-               if ( $local && ( $wgUser->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
+               if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
                        $row .= '<td>';
                        # Link to remove from history
-                       if ( $wgUser->isAllowed( 'delete' ) ) {
+                       if ( $user->isAllowed( 'delete' ) ) {
                                $q = array( 'action' => 'delete' );
                                if ( !$iscur ) {
                                        $q['oldimage'] = $img;
@@ -973,16 +978,16 @@ class ImageHistoryList {
                                );
                        }
                        # Link to hide content. Don't show useless link to people who cannot hide revisions.
-                       $canHide = $wgUser->isAllowed( 'deleterevision' );
-                       if ( $canHide || ( $wgUser->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
-                               if ( $wgUser->isAllowed( 'delete' ) ) {
+                       $canHide = $user->isAllowed( 'deleterevision' );
+                       if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
+                               if ( $user->isAllowed( 'delete' ) ) {
                                        $row .= '<br />';
                                }
                                // If file is top revision or locked from this user, don't link
                                if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED ) ) {
                                        $del = Linker::revDeleteLinkDisabled( $canHide );
                                } else {
-                                       list( $ts, $name ) = explode( '!', $img, 2 );
+                                       list( $ts, ) = explode( '!', $img, 2 );
                                        $query = array(
                                                'type'   => 'oldimage',
                                                'target' => $this->title->getPrefixedText(),
@@ -1000,7 +1005,7 @@ class ImageHistoryList {
                $row .= '<td>';
                if ( $iscur ) {
                        $row .= wfMsgHtml( 'filehist-current' );
-               } elseif ( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
+               } elseif ( $local && $user->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
                        if ( $file->isDeleted( File::DELETED_FILE ) ) {
                                $row .= wfMsgHtml( 'filehist-revert' );
                        } else {
@@ -1011,7 +1016,7 @@ class ImageHistoryList {
                                        array(
                                                'action' => 'revert',
                                                'oldimage' => $img,
-                                               'wpEditToken' => $wgUser->getEditToken( $img )
+                                               'wpEditToken' => $user->getEditToken( $img )
                                        ),
                                        array( 'known', 'noclasses' )
                                );
@@ -1026,7 +1031,7 @@ class ImageHistoryList {
                $row .= "<td $selected style='white-space: nowrap;'>";
                if ( !$file->userCan( File::DELETED_FILE ) ) {
                        # Don't link to unviewable files
-                       $row .= '<span class="history-deleted">' . $wgLang->timeanddate( $timestamp, true ) . '</span>';
+                       $row .= '<span class="history-deleted">' . $lang->timeanddate( $timestamp, true ) . '</span>';
                } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
                        if ( $local ) {
                                $this->preventClickjacking();
@@ -1034,22 +1039,22 @@ class ImageHistoryList {
                                # Make a link to review the image
                                $url = Linker::link(
                                        $revdel,
-                                       $wgLang->timeanddate( $timestamp, true ),
+                                       $lang->timeanddate( $timestamp, true ),
                                        array(),
                                        array(
                                                'target' => $this->title->getPrefixedText(),
                                                'file' => $img,
-                                               'token' => $wgUser->getEditToken( $img )
+                                               'token' => $user->getEditToken( $img )
                                        ),
                                        array( 'known', 'noclasses' )
                                );
                        } else {
-                               $url = $wgLang->timeanddate( $timestamp, true );
+                               $url = $lang->timeanddate( $timestamp, true );
                        }
                        $row .= '<span class="history-deleted">' . $url . '</span>';
                } else {
                        $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
-                       $row .= Xml::element( 'a', array( 'href' => $url ), $wgLang->timeanddate( $timestamp, true ) );
+                       $row .= Xml::element( 'a', array( 'href' => $url ), $lang->timeanddate( $timestamp, true ) );
                }
                $row .= "</td>";
 
@@ -1071,10 +1076,10 @@ class ImageHistoryList {
                        $row .= '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
                } else {
                        if ( $local ) {
-                               $row .= Linker::userLink( $user, $usertext ) . ' <span style="white-space: nowrap;">' .
-                               Linker::userToolLinks( $user, $usertext ) . '</span>';
+                               $row .= Linker::userLink( $userId, $userText ) . ' <span style="white-space: nowrap;">' .
+                               Linker::userToolLinks( $userId, $userText ) . '</span>';
                        } else {
-                               $row .= htmlspecialchars( $usertext );
+                               $row .= htmlspecialchars( $userText );
                        }
                }
                $row .= '</td>';
@@ -1098,8 +1103,7 @@ class ImageHistoryList {
         * @return string
         */
        protected function getThumbForLine( $file ) {
-               global $wgLang;
-
+               $lang = $this->getLanguage();
                if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
                        $params = array(
                                'width' => '120',
@@ -1110,9 +1114,9 @@ class ImageHistoryList {
                        $thumbnail = $file->transform( $params );
                        $options = array(
                                'alt' => wfMsg( 'filehist-thumbtext',
-                                       $wgLang->timeanddate( $timestamp, true ),
-                                       $wgLang->date( $timestamp, true ),
-                                       $wgLang->time( $timestamp, true ) ),
+                                       $lang->timeanddate( $timestamp, true ),
+                                       $lang->date( $timestamp, true ),
+                                       $lang->time( $timestamp, true ) ),
                                'file-link' => true,
                        );
 
@@ -1186,6 +1190,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        }
 
        /**
+        * @param $row object
         * @return string
         */
        function formatRow( $row ) {
index 918bebc..2d01d06 100644 (file)
@@ -397,6 +397,31 @@ class Linker {
                return "<strong class=\"selflink\">{$prefix}{$html}{$inside}</strong>{$trail}";
        }
 
+       /**
+        * Get a message saying that an invalid title was encountered.
+        * This should be called after a method like Title::makeTitleSafe() returned
+        * a value indicating that the title object is invalid.
+        *
+        * @param $context IContextSource context to use to get the messages
+        * @param $namespace int Namespace number
+        * @param $title string Text of the title, without the namespace part
+        */
+       public static function getInvalidTitleDescription( IContextSource $context, $namespace, $title ) {
+               global $wgContLang;
+
+               // First we check whether the namespace exists or not.
+               if ( MWNamespace::exists( $namespace ) ) {
+                       if ( $namespace == NS_MAIN ) {
+                               $name = $context->msg( 'blanknamespace' )->text();
+                       } else {
+                               $name = $wgContLang->getFormattedNsText( $namespace );
+                       }
+                       return $context->msg( 'invalidtitle-knownnamespace', $namespace, $name, $title )->text();
+               } else {
+                       return $context->msg( 'invalidtitle-unknownnamespace', $namespace, $title )->text();
+               }
+       }
+
        /**
         * @param $title Title
         * @return Title
index ac788aa..bdccca1 100644 (file)
@@ -354,4 +354,16 @@ class MWNamespace {
                return $index == NS_USER || $index == NS_USER_TALK;
        }
 
+       /**
+        * It is not possible to use pages from this namespace as template?
+        *
+        * @since 1.20
+        * @param $index int Index to check
+        * @return bool
+        */
+       public static function isNonincludableNamespace( $index ) {
+               global $wgNonincludableNamespaces;
+               return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces );
+       }
+
 }
index beaca5f..bdf2223 100644 (file)
@@ -2573,12 +2573,24 @@ $templates
                                $extraQuery
                        );
                        $context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
-                       // Drop modules that know they're empty
+                       // Extract modules that know they're empty
+                       $emptyModules = array ();
                        foreach ( $modules as $key => $module ) {
                                if ( $module->isKnownEmpty( $context ) ) {
+                                       $emptyModules[$key] = 'ready';
                                        unset( $modules[$key] );
                                }
                        }
+                       // Inline empty modules: since they're empty, just mark them as 'ready'
+                       if ( count( $emptyModules ) > 0 && $only !== ResourceLoaderModule::TYPE_STYLES ) {
+                               // If we're only getting the styles, we don't need to do anything for empty modules.
+                               $links .= Html::inlineScript(\r
+                                               ResourceLoader::makeLoaderConditionalScript(\r
+                                                               ResourceLoader::makeLoaderStateScript( $emptyModules )\r
+                                               )\r
+                               ) . "\n";
+                       }
+
                        // If there are no modules left, skip this group
                        if ( $modules === array() ) {
                                continue;
@@ -2642,7 +2654,7 @@ $templates
                                // Automatically select style/script elements
                                if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
                                        $link = Html::linkedStyle( $url );
-                               } else if ( $loadCall ) { 
+                               } else if ( $loadCall ) {
                                        $link = Html::inlineScript(
                                                ResourceLoader::makeLoaderConditionalScript(
                                                        Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
@@ -2670,7 +2682,7 @@ $templates
         */
        function getHeadScripts() {
                global $wgResourceLoaderExperimentalAsyncLoading;
-               
+
                // Startup - this will immediately load jquery and mediawiki modules
                $scripts = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
 
@@ -2702,7 +2714,7 @@ $templates
                                )
                        );
                }
-               
+
                if ( $wgResourceLoaderExperimentalAsyncLoading ) {
                        $scripts .= $this->getScriptsForBottomQueue( true );
                }
@@ -2748,43 +2760,87 @@ $templates
                // Legacy Scripts
                $scripts .= "\n" . $this->mScripts;
 
-               $userScripts = array();
+               $defaultModules = array();
 
                // Add site JS if enabled
                if ( $wgUseSiteJs ) {
                        $scripts .= $this->makeResourceLoaderLink( 'site', ResourceLoaderModule::TYPE_SCRIPTS,
                                /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
                        );
-                       if( $this->getUser()->isLoggedIn() ){
-                               $userScripts[] = 'user.groups';
-                       }
+                       $defaultModules['site'] = 'loading';
+               } else {
+                       // The wiki is configured to not allow a site module.
+                       $defaultModules['site'] = 'missing';
                }
 
                // Add user JS if enabled
-               if ( $wgAllowUserJs && $this->getUser()->isLoggedIn() ) {
-                       if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
-                               # XXX: additional security check/prompt?
-                               // We're on a preview of a JS subpage
-                               // Exclude this page from the user module in case it's in there (bug 26283)
-                               $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
-                                       array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
-                               );
-                               // Load the previewed JS
-                               $scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+               if ( $wgAllowUserJs ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
+                               if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+                                       # XXX: additional security check/prompt?
+                                       // We're on a preview of a JS subpage
+                                       // Exclude this page from the user module in case it's in there (bug 26283)
+                                       $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
+                                               array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
+                                       );
+                                       // Load the previewed JS
+                                       $scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+                                       // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
+                                       // asynchronously and may arrive *after* the inline script here. So the previewed code
+                                       // may execute before ./common.js runs. Normally, ./common.js runs before ./vector.js...
+                               } else {
+                                       // Include the user module normally, i.e., raw to avoid it being wrapped in a closure.
+                                       $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
+                                               /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+                                       );
+                               }
+                               $defaultModules['user'] = 'loading';
                        } else {
-                               // Include the user module normally
-                               // We can't do $userScripts[] = 'user'; because the user module would end up
-                               // being wrapped in a closure, so load it raw like 'site'
-                               $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
+                               // Non-logged-in users have no user module. Treat it as empty and 'ready' to avoid
+                               // blocking default gadgets that might depend on it. Although arguably default-enabled
+                               // gadgets should not depend on the user module, it's harmless and less error-prone to
+                               // handle this case.
+                               $defaultModules['user'] = 'ready';
+                       }
+               } else {
+                       // User JS disabled
+                       $defaultModules['user'] = 'missing';
+               }
+
+               // Group JS is only enabled if site JS is enabled.
+               if ( $wgUseSiteJs ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
+                               $scripts .= $this->makeResourceLoaderLink( 'user.groups', ResourceLoaderModule::TYPE_COMBINED,
                                        /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
                                );
+                               $defaultModules['user.groups'] = 'loading';
+                       } else {
+                               // Non-logged-in users have no user.groups module. Treat it as empty and 'ready' to
+                               // avoid blocking gadgets that might depend upon the module.
+                               $defaultModules['user.groups'] = 'ready';
                        }
+               } else {
+                       // Site (and group JS) disabled
+                       $defaultModules['user.groups'] = 'missing';
                }
-               $scripts .= $this->makeResourceLoaderLink( $userScripts, ResourceLoaderModule::TYPE_COMBINED,
-                       /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
-               );
 
-               return $scripts;
+               $loaderInit = '';
+               if ( $inHead ) {
+                       // We generate loader calls anyway, so no need to fix the client-side loader's state to 'loading'.
+                       foreach ( $defaultModules as $m => $state ) {
+                               if ( $state == 'loading' ) {
+                                       unset( $defaultModules[$m] );
+                               }
+                       }
+               }
+               if ( count( $defaultModules ) > 0 ) {
+                       $loaderInit = Html::inlineScript(
+                               ResourceLoader::makeLoaderConditionalScript(
+                                       ResourceLoader::makeLoaderStateScript( $defaultModules )
+                               )
+                       ) . "\n";
+               }
+               return $loaderInit . $scripts;
        }
 
        /**
@@ -2939,12 +2995,11 @@ $templates
        }
 
        /**
-        * @param $unused
-        * @param $addContentType bool
+        * @param $addContentType bool: Whether <meta> specifying content type should be returned
         *
-        * @return string HTML tag links to be put in the header.
+        * @return array in format "link name or number => 'link html'".
         */
-       public function getHeadLinks( $unused = null, $addContentType = false ) {
+       public function getHeadLinksArray( $addContentType = false ) {
                global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
                        $wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
                        $wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
@@ -2957,20 +3012,20 @@ $templates
                        if ( $wgHtml5 ) {
                                # More succinct than <meta http-equiv=Content-Type>, has the
                                # same effect
-                               $tags[] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
+                               $tags['meta-charset'] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
                        } else {
-                               $tags[] = Html::element( 'meta', array(
+                               $tags['meta-content-type'] = Html::element( 'meta', array(
                                        'http-equiv' => 'Content-Type',
                                        'content' => "$wgMimeType; charset=UTF-8"
                                ) );
-                               $tags[] = Html::element( 'meta', array(  // bug 15835
+                               $tags['meta-content-style-type'] = Html::element( 'meta', array(  // bug 15835
                                        'http-equiv' => 'Content-Style-Type',
                                        'content' => 'text/css'
                                ) );
                        }
                }
 
-               $tags[] = Html::element( 'meta', array(
+               $tags['meta-generator'] = Html::element( 'meta', array(
                        'name' => 'generator',
                        'content' => "MediaWiki $wgVersion",
                ) );
@@ -2979,7 +3034,7 @@ $templates
                if( $p !== 'index,follow' ) {
                        // http://www.robotstxt.org/wc/meta-user.html
                        // Only show if it's different from the default robots policy
-                       $tags[] = Html::element( 'meta', array(
+                       $tags['meta-robots'] = Html::element( 'meta', array(
                                'name' => 'robots',
                                'content' => $p,
                        ) );
@@ -2990,7 +3045,7 @@ $templates
                                "/<.*?" . ">/" => '',
                                "/_/" => ' '
                        );
-                       $tags[] = Html::element( 'meta', array(
+                       $tags['meta-keywords'] = Html::element( 'meta', array(
                                'name' => 'keywords',
                                'content' =>  preg_replace(
                                        array_keys( $strip ),
@@ -3007,7 +3062,11 @@ $templates
                        } else {
                                $a = 'name';
                        }
-                       $tags[] = Html::element( 'meta',
+                       $tagName = "meta-{$tag[0]}";
+                       if ( isset( $tags[$tagName] ) ) {
+                               $tagName .= $tag[1];
+                       }
+                       $tags[$tagName] = Html::element( 'meta',
                                array(
                                        $a => $tag[0],
                                        'content' => $tag[1]
@@ -3026,14 +3085,14 @@ $templates
                                && ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create', $user ) ) ) {
                                // Original UniversalEditButton
                                $msg = $this->msg( 'edit' )->text();
-                               $tags[] = Html::element( 'link', array(
+                               $tags['universal-edit-button'] = Html::element( 'link', array(
                                        'rel' => 'alternate',
                                        'type' => 'application/x-wiki',
                                        'title' => $msg,
                                        'href' => $this->getTitle()->getLocalURL( 'action=edit' )
                                ) );
                                // Alternate edit link
-                               $tags[] = Html::element( 'link', array(
+                               $tags['alternative-edit'] = Html::element( 'link', array(
                                        'rel' => 'edit',
                                        'title' => $msg,
                                        'href' => $this->getTitle()->getLocalURL( 'action=edit' )
@@ -3046,15 +3105,15 @@ $templates
                # uses whichever one appears later in the HTML source. Make sure
                # apple-touch-icon is specified first to avoid this.
                if ( $wgAppleTouchIcon !== false ) {
-                       $tags[] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
+                       $tags['apple-touch-icon'] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
                }
 
                if ( $wgFavicon !== false ) {
-                       $tags[] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
+                       $tags['favicon'] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
                }
 
                # OpenSearch description link
-               $tags[] = Html::element( 'link', array(
+               $tags['opensearch'] = Html::element( 'link', array(
                        'rel' => 'search',
                        'type' => 'application/opensearchdescription+xml',
                        'href' => wfScript( 'opensearch_desc' ),
@@ -3066,7 +3125,7 @@ $templates
                        # for the MediaWiki API (and potentially additional custom API
                        # support such as WordPress or Twitter-compatible APIs for a
                        # blogging extension, etc)
-                       $tags[] = Html::element( 'link', array(
+                       $tags['rsd'] = Html::element( 'link', array(
                                'rel' => 'EditURI',
                                'type' => 'application/rsd+xml',
                                // Output a protocol-relative URL here if $wgServer is protocol-relative
@@ -3086,14 +3145,14 @@ $templates
                                if ( !$urlvar ) {
                                        $variants = $lang->getVariants();
                                        foreach ( $variants as $_v ) {
-                                               $tags[] = Html::element( 'link', array(
+                                               $tags["variant-$_v"] = Html::element( 'link', array(
                                                        'rel' => 'alternate',
                                                        'hreflang' => $_v,
                                                        'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
                                                );
                                        }
                                } else {
-                                       $tags[] = Html::element( 'link', array(
+                                       $tags['canonical'] = Html::element( 'link', array(
                                                'rel' => 'canonical',
                                                'href' => $this->getTitle()->getCanonicalUrl()
                                        ) );
@@ -3116,7 +3175,7 @@ $templates
                }
 
                if ( $copyright ) {
-                       $tags[] = Html::element( 'link', array(
+                       $tags['copyright'] = Html::element( 'link', array(
                                'rel' => 'copyright',
                                'href' => $copyright )
                        );
@@ -3165,7 +3224,17 @@ $templates
                                }
                        }
                }
-               return implode( "\n", $tags );
+               return $tags;
+       }
+
+       /**
+        * @param $unused
+        * @param $addContentType bool: Whether <meta> specifying content type should be returned
+        *
+        * @return string HTML tag links to be put in the header.
+        */
+       public function getHeadLinks( $unused = null, $addContentType = false ) {
+               return implode( "\n", $this->getHeadLinksArray( $addContentType ) );
        }
 
        /**
@@ -3260,7 +3329,7 @@ $templates
                                $otherTags .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, false,
                                        array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() )
                                );
-                               
+
                                // Load the previewed CSS
                                // If needed, Janus it first. This is user-supplied CSS, so it's
                                // assumed to be right for the content language directionality.
index ec6490a..5c79e8b 100644 (file)
@@ -17,9 +17,9 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ){
-       $mwVersion = '1.19';
+       $mwVersion = '1.20';
        $phpVersion = PHP_VERSION;
-       $message = "MediaWiki $mwVersion requires at least PHP version 5.2.3, you are using PHP $phpVersion.";
+       $message = "MediaWiki $mwVersion requires at least PHP version 5.3.2, you are using PHP $phpVersion.";
        if( $type == 'index.php' ) {
                $encLogo = htmlspecialchars(
                        str_replace( '//', '/', pathinfo( $_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME ) . '/'
index dc5e971..367f387 100644 (file)
@@ -16,11 +16,15 @@ abstract class PageQueryPage extends QueryPage {
         */
        public function formatResult( $skin, $row ) {
                global $wgContLang;
+
                $title = Title::makeTitleSafe( $row->namespace, $row->title );
-               $text = $row->title;
+
                if ( $title instanceof Title ) {
                        $text = $wgContLang->convert( $title->getPrefixedText() );
+                       return Linker::linkKnown( $title, htmlspecialchars( $text ) );
+               } else {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $row->namespace, $row->title ) );
                }
-               return Linker::linkKnown( $title, htmlspecialchars( $text ) );
        }
 }
index 9700b90..a80e04b 100644 (file)
@@ -34,7 +34,7 @@
  *     the relevant contents
  *   - The default behavior is equivalent to `array( 'title' => '$1' )`,
  *     if you don't want the title parameter you can explicitly use `array( 'title' => false )`
- *   - You can specify a value that won't have replacements in it 
+ *   - You can specify a value that won't have replacements in it
  *     using `'foo' => array( 'value' => 'bar' );`
  *
  * Options:
  */
 class PathRouter {
 
+       /**
+        * @var array
+        */
+       private $patterns = array();
+
        /**
         * Protected helper to do the actual bulk work of adding a single pattern.
         * This is in a separate method so that add() can handle the difference between
         * a single string $path and an array() $path that contains multiple path
         * patterns each with an associated $key to pass on.
+        * @param $path string
+        * @param $params array
+        * @param $options array
+        * @param $key null|string
         */
        protected function doAdd( $path, $params, $options, $key = null ) {
                // Make sure all paths start with a /
@@ -140,6 +149,9 @@ class PathRouter {
        /**
         * Add a new path pattern to the path router with the strict option on
         * @see self::add
+        * @param $path string|array
+        * @param $params array
+        * @param $options array
         */
        public function addStrict( $path, $params = array(), $options = array() ) {
                $options['strict'] = true;
@@ -158,6 +170,10 @@ class PathRouter {
                array_multisort( $weights, SORT_DESC, SORT_NUMERIC, $this->patterns );
        }
 
+       /**
+        * @param $pattern object
+        * @return float|int
+        */
        protected static function makeWeight( $pattern ) {
                # Start with a weight of 0
                $weight = 0;
@@ -202,7 +218,7 @@ class PathRouter {
                // Make sure our patterns are sorted by weight so the most specific
                // matches are tested first
                $this->sortByWeight();
-               
+
                $matches = null;
 
                foreach ( $this->patterns as $pattern ) {
@@ -219,6 +235,11 @@ class PathRouter {
                return is_null( $matches ) ? array() : $matches;
        }
 
+       /**
+        * @param $path string
+        * @param $pattern string
+        * @return array|null
+        */
        protected static function extractTitle( $path, $pattern ) {
                // Convert the path pattern into a regexp we can match with
                $regexp = preg_quote( $pattern->path, '#' );
@@ -321,6 +342,8 @@ class PathRouterPatternReplacer {
         * We do this inside of a replacement callback because after replacement we can't tell the
         * difference between a $1 that was not replaced and a $1 that was part of
         * the content a $1 was replaced with.
+        * @param $value string
+        * @return string
         */
        public function replace( $value ) {
                $this->error = false;
@@ -331,6 +354,10 @@ class PathRouterPatternReplacer {
                return $value;
        }
 
+       /**
+        * @param $m array
+        * @return string
+        */
        protected function callback( $m ) {
                if ( $m[1] == "key" ) {
                        if ( is_null( $this->key ) ) {
index 151cc76..55f56f7 100644 (file)
@@ -671,7 +671,7 @@ abstract class QueryPage extends SpecialPage {
                if ( !isset( $row->title ) ) {
                        return null;
                }
-               $title = Title::MakeTitle( intval( $row->namespace ), $row->title );
+               $title = Title::makeTitle( intval( $row->namespace ), $row->title );
                if ( $title ) {
                        $date = isset( $row->timestamp ) ? $row->timestamp : '';
                        $comments = '';
index 8b10d7f..f40de4c 100644 (file)
@@ -688,6 +688,7 @@ abstract class Skin extends ContextSource {
         * @return string
         */
        function subPageSubtitle() {
+               global $wgLang;
                $out = $this->getOutput();
                $subpages = '';
 
@@ -718,7 +719,7 @@ abstract class Skin extends ContextSource {
                                                $c++;
 
                                                if ( $c > 1 ) {
-                                                       $subpages .= $this->msg( 'pipe-separator' )->escaped();
+                                                       $subpages .= $wgLang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
                                                } else  {
                                                        $subpages .= '&lt; ';
                                                }
index 1876d75..3140f02 100644 (file)
@@ -83,6 +83,7 @@ class Title {
        var $mRedirect = null;            // /< Is the article at this title a redirect?
        var $mNotificationTimestamp = array(); // /< Associative array of user ID -> timestamp/false
        var $mBacklinkCache = null;       // /< Cache of links to this title
+       var $mHasSubpage;                 // /< Whether a page has any subpages
        // @}
 
 
@@ -119,7 +120,8 @@ class Title {
         *   fied by a prefix.  If you want to force a specific namespace even if
         *   $text might begin with a namespace prefix, use makeTitle() or
         *   makeTitleSafe().
-        * @return Title, or null on an error.
+        * @throws MWException
+        * @return Title|null - Title or null on an error.
         */
        public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
                if ( is_object( $text ) ) {
@@ -179,13 +181,12 @@ class Title {
         * @return Title the new object, or NULL on an error
         */
        public static function newFromURL( $url ) {
-               global $wgLegalTitleChars;
                $t = new Title();
 
                # For compatibility with old buggy URLs. "+" is usually not valid in titles,
                # but some URLs used it as a space replacement and they still come
                # from some external search tools.
-               if ( strpos( $wgLegalTitleChars, '+' ) === false ) {
+               if ( strpos( self::legalChars(), '+' ) === false ) {
                        $url = str_replace( '+', ' ', $url );
                }
 
@@ -711,17 +712,9 @@ class Title {
                        }
                }
 
-               // Strip off subpages
-               $pagename = $this->getText();
-               if ( strpos( $pagename, '/' ) !== false ) {
-                       list( $username , ) = explode( '/', $pagename, 2 );
-               } else {
-                       $username = $pagename;
-               }
-
                if ( $wgContLang->needsGenderDistinction() &&
                                MWNamespace::hasGenderDistinction( $this->mNamespace ) ) {
-                       $gender = GenderCache::singleton()->getGenderOf( $username, __METHOD__ );
+                       $gender = GenderCache::singleton()->getGenderOf( $this->getText(), __METHOD__ );
                        return $wgContLang->getGenderNsText( $this->mNamespace, $gender );
                }
 
@@ -866,6 +859,7 @@ class Title {
         * This is MUCH simpler than individually testing for equivilance
         * against both NS_USER and NS_USER_TALK, and is also forward compatible.
         * @since 1.19
+        * @param $ns int
         * @return bool
         */
        public function hasSubjectNamespace( $ns ) {
@@ -1230,6 +1224,8 @@ class Title {
         * andthe wfArrayToCGI moved to getLocalURL();
         *
         * @since 1.19 (r105919)
+        * @param $query
+        * @param $query2 bool
         * @return String
         */
        private static function fixUrlQueryArgs( $query, $query2 = false ) {
@@ -1412,6 +1408,8 @@ class Title {
         * See getLocalURL for the arguments.
         *
         * @see self::getLocalURL
+        * @param $query string
+        * @param $query2 bool|string
         * @return String the URL
         */
        public function escapeLocalURL( $query = '', $query2 = false ) {
@@ -2476,8 +2474,9 @@ class Title {
        /**
         * Get the expiry time for the restriction against a given action
         *
+        * @param $action
         * @return String|Bool 14-char timestamp, or 'infinity' if the page is protected forever
-        *      or not protected at all, or false if the action is not recognised.
+        *     or not protected at all, or false if the action is not recognised.
         */
        public function getRestrictionExpiry( $action ) {
                if ( !$this->mRestrictionsLoaded ) {
@@ -3919,7 +3918,7 @@ class Title {
         */
        public function getPreviousRevisionID( $revId, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
-               return $db->selectField( 'revision', 'rev_id',
+               $revId = $db->selectField( 'revision', 'rev_id',
                        array(
                                'rev_page' => $this->getArticleID( $flags ),
                                'rev_id < ' . intval( $revId )
@@ -3927,6 +3926,12 @@ class Title {
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_id DESC' )
                );
+
+               if ( $revId === false ) {
+                       return false;
+               } else {
+                       return intval( $revId );
+               }
        }
 
        /**
@@ -3938,7 +3943,7 @@ class Title {
         */
        public function getNextRevisionID( $revId, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
-               return $db->selectField( 'revision', 'rev_id',
+               $revId = $db->selectField( 'revision', 'rev_id',
                        array(
                                'rev_page' => $this->getArticleID( $flags ),
                                'rev_id > ' . intval( $revId )
@@ -3946,6 +3951,12 @@ class Title {
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_id' )
                );
+
+               if ( $revId === false ) {
+                       return false;
+               } else {
+                       return intval( $revId );
+               }
        }
 
        /**
@@ -4318,9 +4329,10 @@ class Title {
                $dbr = wfGetDB( DB_SLAVE );
                $this->mNotificationTimestamp[$uid] = $dbr->selectField( 'watchlist',
                        'wl_notificationtimestamp',
-                       array( 'wl_namespace' => $this->getNamespace(),
+                       array(
+                               'wl_user' => $user->getId(),
+                               'wl_namespace' => $this->getNamespace(),
                                'wl_title' => $this->getDBkey(),
-                               'wl_user' => $user->getId()
                        ),
                        __METHOD__
                );
@@ -4475,7 +4487,7 @@ class Title {
         * $wgLang (such as special pages, which are in the user language).
         *
         * @since 1.18
-        * @return object Language
+        * @return Language
         */
        public function getPageLanguage() {
                global $wgLang;
index af923ff..cb146b5 100644 (file)
@@ -1283,7 +1283,7 @@ class User {
                }
 
                # User/IP blocking
-               $block = Block::newFromTarget( $this->getName(), $ip, !$bFromSlave );
+               $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
 
                # Proxy blocking
                if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
@@ -2281,7 +2281,10 @@ class User {
         * Reset all options to the site defaults
         */
        public function resetOptions() {
+               $this->load();
+
                $this->mOptions = self::getDefaultOptions();
+               $this->mOptionsLoaded = true;
        }
 
        /**
@@ -3362,7 +3365,7 @@ class User {
         * @return String New token URL
         */
        private function invalidationTokenUrl( $token ) {
-               return $this->getTokenUrl( 'Invalidateemail', $token );
+               return $this->getTokenUrl( 'InvalidateEmail', $token );
        }
 
        /**
@@ -3924,7 +3927,7 @@ class User {
                } elseif ( $type == ':B:' ) {
                        # Salted
                        list( $salt, $realHash ) = explode( ':', substr( $hash, 3 ), 2 );
-                       return md5( $salt.'-'.md5( $password ) ) == $realHash;
+                       return md5( $salt.'-'.md5( $password ) ) === $realHash;
                } else {
                        # Old-style
                        return self::oldCrypt( $password, $userId ) === $hash;
index e0b8d01..36da6fb 100644 (file)
@@ -436,9 +436,9 @@ class EmailNotification {
                        $res = $dbw->select( array( 'watchlist' ),
                                array( 'wl_user' ),
                                array(
-                                       'wl_title' => $title->getDBkey(),
-                                       'wl_namespace' => $title->getNamespace(),
                                        'wl_user != ' . intval( $editor->getID() ),
+                                       'wl_namespace' => $title->getNamespace(),
+                                       'wl_title' => $title->getDBkey(),
                                        'wl_notificationtimestamp IS NULL',
                                ), __METHOD__
                        );
@@ -453,9 +453,9 @@ class EmailNotification {
                                        array( /* SET */
                                                'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
                                        ), array( /* WHERE */
-                                               'wl_title' => $title->getDBkey(),
+                                               'wl_user' => $watchers,
                                                'wl_namespace' => $title->getNamespace(),
-                                               'wl_user' => $watchers
+                                               'wl_title' => $title->getDBkey(),
                                        ), __METHOD__
                                );
                                $dbw->commit( __METHOD__ );
index 9d0e579..39c1b1b 100644 (file)
@@ -671,6 +671,7 @@ class WebRequest {
 
        /**
         * HTML-safe version of appendQuery().
+        * @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
         *
         * @param $query String: query string fragment; do not include initial '?'
         * @return String
index 6cad466..93e60e8 100644 (file)
@@ -37,6 +37,28 @@ class WikiPage extends Page {
         */
        const DELETE_NO_REVISIONS = 2;
 
+       // Constants for $mDataLoadedFrom and related
+
+       /**
+        * Data has not been loaded yet (or the object was cleared)
+        */
+       const DATA_NOT_LOADED = 0;
+
+       /**
+        * Data has been loaded from a slave database
+        */
+       const DATA_FROM_SLAVE = 1;
+
+       /**
+        * Data has been loaded from the master database
+        */
+       const DATA_FROM_MASTER = 2;
+
+       /**
+        * Data has been loaded from the master database using FOR UPDATE
+        */
+       const DATA_FOR_UPDATE = 3;
+
        /**
         * @var Title
         */
@@ -51,6 +73,11 @@ class WikiPage extends Page {
        public $mPreparedEdit = false;       // !< Array
        /**@}}*/
 
+       /**
+        * @var int; one of the DATA_* constants
+        */
+       protected $mDataLoadedFrom = self::DATA_NOT_LOADED;
+
        /**
         * @var Title
         */
@@ -117,15 +144,58 @@ class WikiPage extends Page {
         * Constructor from a page id
         *
         * @param $id Int article ID to load
+        * @param $from string|int one of the following values:
+        *        - "fromdb" or self::DATA_FROM_SLAVE to select from a slave database
+        *        - "fromdbmaster" or self::DATA_FROM_MASTER to select from the master database
         *
         * @return WikiPage|null
         */
-       public static function newFromID( $id ) {
-               $t = Title::newFromID( $id );
-               if ( $t ) {
-                       return self::factory( $t );
+       public static function newFromID( $id, $from = 'fromdb' ) {
+               $from = self::convertSelectType( $from );
+               $db = wfGetDB( $from === self::DATA_FROM_MASTER ? DB_MASTER : DB_SLAVE );
+               $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
+               if ( !$row ) {
+                       return null;
+               }
+               return self::newFromRow( $row, $from );
+       }
+
+       /**
+        * Constructor from a database row
+        *
+        * @since 1.20
+        * @param $row object: database row containing at least fields returned
+        *        by selectFields().
+        * @param $from string|int: source of $data:
+        *        - "fromdb" or self::DATA_FROM_SLAVE: from a slave DB
+        *        - "fromdbmaster" or self::DATA_FROM_MASTER: from the master DB
+        *        - "forupdate" or self::DATA_FOR_UPDATE: from the master DB using SELECT FOR UPDATE
+        * @return WikiPage
+        */
+       public static function newFromRow( $row, $from = 'fromdb' ) {
+               $page = self::factory( Title::newFromRow( $row ) );
+               $page->loadFromRow( $row, $from );
+               return $page;
+       }
+
+       /**
+        * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to DATA_* constants.
+        *
+        * @param $type object|string|int
+        * @return mixed
+        */
+       private static function convertSelectType( $type ) {
+               switch ( $type ) {
+               case 'fromdb':
+                       return self::DATA_FROM_SLAVE;
+               case 'fromdbmaster':
+                       return self::DATA_FROM_MASTER;
+               case 'forupdate':
+                       return self::DATA_FOR_UPDATE;
+               default:
+                       // It may already be an integer or whatever else
+                       return $type;
                }
-               return null;
        }
 
        /**
@@ -155,6 +225,7 @@ class WikiPage extends Page {
         */
        public function clear() {
                $this->mDataLoaded = false;
+               $this->mDataLoadedFrom = self::DATA_NOT_LOADED;
 
                $this->mCounter = null;
                $this->mRedirectTarget = null; # Title object if set
@@ -192,14 +263,15 @@ class WikiPage extends Page {
         * Fetch a page record with the given conditions
         * @param $dbr DatabaseBase object
         * @param $conditions Array
+        * @param $options Array
         * @return mixed Database result resource, or false on failure
         */
-       protected function pageData( $dbr, $conditions ) {
+       protected function pageData( $dbr, $conditions, $options = array() ) {
                $fields = self::selectFields();
 
                wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
 
-               $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__ );
+               $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
 
                wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
 
@@ -212,12 +284,13 @@ class WikiPage extends Page {
         *
         * @param $dbr DatabaseBase object
         * @param $title Title object
+        * @param $options Array
         * @return mixed Database result resource, or false on failure
         */
-       public function pageDataFromTitle( $dbr, $title ) {
+       public function pageDataFromTitle( $dbr, $title, $options = array() ) {
                return $this->pageData( $dbr, array(
                        'page_namespace' => $title->getNamespace(),
-                       'page_title'     => $title->getDBkey() ) );
+                       'page_title'     => $title->getDBkey() ), $options );
        }
 
        /**
@@ -225,37 +298,69 @@ class WikiPage extends Page {
         *
         * @param $dbr DatabaseBase
         * @param $id Integer
+        * @param $options Array
         * @return mixed Database result resource, or false on failure
         */
-       public function pageDataFromId( $dbr, $id ) {
-               return $this->pageData( $dbr, array( 'page_id' => $id ) );
+       public function pageDataFromId( $dbr, $id, $options = array() ) {
+               return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
        }
 
        /**
         * Set the general counter, title etc data loaded from
         * some source.
         *
-        * @param $data Object|String One of the following:
-        *              A DB query result object or...
-        *              "fromdb" to get from a slave DB or...
-        *              "fromdbmaster" to get from the master DB
+        * @param $from object|string|int One of the following:
+        *        - A DB query result object
+        *        - "fromdb" or self::DATA_FROM_SLAVE to get from a slave DB
+        *        - "fromdbmaster" or self::DATA_FROM_MASTER to get from the master DB
+        *        - "forupdate"  or self::DATA_FOR_UPDATE to get from the master DB using SELECT FOR UPDATE
+        *
         * @return void
         */
-       public function loadPageData( $data = 'fromdb' ) {
-               if ( $data === 'fromdbmaster' ) {
+       public function loadPageData( $from = 'fromdb' ) {
+               $from = self::convertSelectType( $from );
+               if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
+                       // We already have the data from the correct location, no need to load it twice.
+                       return;
+               }
+
+               if ( $from === self::DATA_FOR_UPDATE ) {
+                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
+               } elseif ( $from === self::DATA_FROM_MASTER ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
-               } elseif ( $data === 'fromdb' ) { // slave
+               } elseif ( $from === self::DATA_FROM_SLAVE ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
                        # Use a "last rev inserted" timestamp key to dimish the issue of slave lag.
                        # Note that DB also stores the master position in the session and checks it.
                        $touched = $this->getCachedLastEditTime();
                        if ( $touched ) { // key set
                                if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
+                                       $from = self::DATA_FROM_MASTER;
                                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
                                }
                        }
+               } else {
+                       // No idea from where the caller got this data, assume slave database.
+                       $data = $from;
+                       $from = self::DATA_FROM_SLAVE;
                }
 
+               $this->loadFromRow( $data, $from );
+       }
+
+       /**
+        * Load the object from a database row
+        *
+        * @since 1.20
+        * @param $data object: database row containing at least fields returned
+        *        by selectFields()
+        * @param $from string|int One of the following:
+        *        - "fromdb" or self::DATA_FROM_SLAVE if the data comes from a slave DB
+        *        - "fromdbmaster" or self::DATA_FROM_MASTER if the data comes from the master DB
+        *        - "forupdate"  or self::DATA_FOR_UPDATE if the data comes from from
+        *          the master DB using SELECT FOR UPDATE
+        */
+       public function loadFromRow( $data, $from ) {
                $lc = LinkCache::singleton();
 
                if ( $data ) {
@@ -277,6 +382,7 @@ class WikiPage extends Page {
                }
 
                $this->mDataLoaded = true;
+               $this->mDataLoadedFrom = self::convertSelectType( $from );
        }
 
        /**
@@ -1256,7 +1362,9 @@ class WikiPage extends Page {
                $user = is_null( $user ) ? $wgUser : $user;
                $status = Status::newGood( array() );
 
-               # Load $this->mTitle->getArticleID() and $this->mLatest if it's not already
+               // Load the data from the master database if needed.
+               // The caller may already loaded it from the master or even loaded it using
+               // SELECT FOR UPDATE, so do not override that using clear().
                $this->loadPageData( 'fromdbmaster' );
 
                $flags = $this->checkFlags( $flags );
@@ -1692,7 +1800,7 @@ class WikiPage extends Page {
         * @param &$cascade Integer. Set to false if cascading protection isn't allowed.
         * @param $expiry Array: per restriction type expiration
         * @param $user User The user updating the restrictions
-        * @return bool true on success
+        * @return Status
         */
        public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
                global $wgContLang;
@@ -1958,19 +2066,24 @@ class WikiPage extends Page {
                $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
        ) {
                global $wgUser;
-               $user = is_null( $user ) ? $wgUser : $user;
 
                wfDebug( __METHOD__ . "\n" );
 
+               if ( $this->mTitle->getDBkey() === '' ) {
+                       return WikiPage::DELETE_NO_PAGE;
+               }
+
+               $user = is_null( $user ) ? $wgUser : $user;
                if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error ) ) ) {
                        return WikiPage::DELETE_HOOK_ABORTED;
                }
-               $dbw = wfGetDB( DB_MASTER );
-               $t = $this->mTitle->getDBkey();
-               $id = $id ? $id : $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
 
-               if ( $t === '' || $id == 0 ) {
-                       return WikiPage::DELETE_NO_PAGE;
+               if ( $id == 0 ) {
+                       $this->loadPageData( 'forupdate' );
+                       $id = $this->getID();
+                       if ( $id == 0 ) {
+                               return WikiPage::DELETE_NO_PAGE;
+                       }
                }
 
                // Bitfields to further suppress the content
@@ -1985,6 +2098,7 @@ class WikiPage extends Page {
                        $bitfield = 'rev_deleted';
                }
 
+               $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
                // For now, shunt the revision data into the archive table.
                // Text is *not* removed from the text table; bulk storage
diff --git a/includes/actions/CachedAction.php b/includes/actions/CachedAction.php
new file mode 100644 (file)
index 0000000..3f73ea4
--- /dev/null
@@ -0,0 +1,170 @@
+<?php
+
+/**
+ * Abstract action class with scaffolding for caching HTML and other values
+ * in a single blob.
+ *
+ * Before using any of the caching functionality, call startCache.
+ * After the last call to either getCachedValue or addCachedHTML, call saveCache.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * @since 1.20
+ *
+ * @file CachedAction.php
+ * @ingroup Action
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class CachedAction extends FormlessAction implements ICacheHelper {
+
+       /**
+        * CacheHelper object to which we forward the non-SpecialPage specific caching work.
+        * Initialized in startCache.
+        *
+        * @since 1.20
+        * @var CacheHelper
+        */
+       protected $cacheHelper;
+
+       /**
+        * If the cache is enabled or not.
+        *
+        * @since 1.20
+        * @var boolean
+        */
+       protected $cacheEnabled = true;
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       public function setCacheEnabled( $cacheEnabled ) {
+               $this->cacheHelper->setCacheEnabled( $cacheEnabled );
+       }
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
+               $this->cacheHelper = new CacheHelper();
+
+               $this->cacheHelper->setCacheEnabled( $this->cacheEnabled );
+               $this->cacheHelper->setOnInitializedHandler( array( $this, 'onCacheInitialized' ) );
+
+               $keyArgs = $this->getCacheKey();
+
+               if ( array_key_exists( 'action', $keyArgs ) && $keyArgs['action'] === 'purge' ) {
+                       unset( $keyArgs['action'] );
+               }
+
+               $this->cacheHelper->setCacheKey( $keyArgs );
+
+               if ( $this->getRequest()->getText( 'action' ) === 'purge' ) {
+                       $this->cacheHelper->rebuildOnDemand();
+               }
+
+               $this->cacheHelper->startCache( $cacheExpiry, $cacheEnabled );
+       }
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               return $this->cacheHelper->getCachedValue( $computeFunction, $args, $key );
+       }
+
+       /**
+        * Add some HTML to be cached.
+        * This is done by providing a callback function that should
+        * return the HTML to be added. It will only be called if the
+        * item is not in the cache yet or when the cache has been invalidated.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array $args
+        * @param string|null $key
+        */
+       public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
+               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+       }
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       public function saveCache() {
+               $this->cacheHelper->saveCache();
+       }
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       public function setExpiry( $cacheExpiry ) {
+               $this->cacheHelper->setExpiry( $cacheExpiry );
+       }
+
+       /**
+        * Returns the variables used to constructed the cache key in an array.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getCacheKey() {
+               return array(
+                       get_class( $this->page ),
+                       $this->getName(),
+                       $this->getLanguage()->getCode()
+               );
+       }
+
+       /**
+        * Gets called after the cache got initialized.
+        *
+        * @since 1.20
+        *
+        * @param boolean $hasCached
+        */
+       public function onCacheInitialized( $hasCached ) {
+               if ( $hasCached ) {
+                       $this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
+               }
+       }
+
+}
\ No newline at end of file
index edd9aca..f0386a1 100644 (file)
@@ -698,6 +698,53 @@ abstract class ApiBase extends ContextSource {
                );
        }
 
+       /**
+        * @param $params array
+        * @param $load bool|string Whether load the object's state from the database:
+        *        - false: don't load (if the pageid is given, it will still be loaded)
+        *        - 'fromdb': load from a slave database
+        *        - 'fromdbmaster': load from the master database
+        * @return WikiPage
+        */
+       public function getTitleOrPageId( $params, $load = false ) {
+               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+               $pageObj = null;
+               if ( isset( $params['title'] ) ) {
+                       $titleObj = Title::newFromText( $params['title'] );
+                       if ( !$titleObj ) {
+                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+                       }
+                       $pageObj = WikiPage::factory( $titleObj );
+                       if ( $load !== false ) {
+                               $pageObj->loadPageData( $load );
+                       }
+               } elseif ( isset( $params['pageid'] ) ) {
+                       if ( $load === false ) {
+                               $load = 'fromdb';
+                       }
+                       $pageObj = WikiPage::newFromID( $params['pageid'], $load );
+                       if ( !$pageObj ) {
+                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
+                       }
+               }
+
+               return $pageObj;
+       }
+
+       /**
+        * @return array
+        */
+       public function getTitleOrPageIdErrorMessage() {
+               return array_merge(
+                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       array(
+                               array( 'invalidtitle', 'title' ),
+                               array( 'nosuchpageid', 'pageid' ),
+                       )
+               );
+       }
+
        /**
         * Callback function used in requireOnlyOneParameter to check whether reequired parameters are set
         *
@@ -1215,7 +1262,6 @@ abstract class ApiBase extends ContextSource {
                'noimageredirect-anon' => array( 'code' => 'noimageredirect-anon', 'info' => "Anonymous users can't create image redirects" ),
                'noimageredirect-logged' => array( 'code' => 'noimageredirect', 'info' => "You don't have permission to create image redirects" ),
                'spamdetected' => array( 'code' => 'spamdetected', 'info' => "Your edit was refused because it contained a spam fragment: \"\$1\"" ),
-               'filtered' => array( 'code' => 'filtered', 'info' => "The filter callback function refused your edit" ),
                'contenttoobig' => array( 'code' => 'contenttoobig', 'info' => "The content you supplied exceeds the article size limit of \$1 kilobytes" ),
                'noedit-anon' => array( 'code' => 'noedit-anon', 'info' => "Anonymous users can't edit pages" ),
                'noedit' => array( 'code' => 'noedit', 'info' => "You don't have permission to edit pages" ),
index 7d3a40b..c566a5c 100644 (file)
@@ -149,7 +149,10 @@ class ApiBlock extends ApiBase {
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'token' => null,
-                       'gettoken' => false,
+                       'gettoken' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                        'expiry' => 'never',
                        'reason' => null,
                        'anononly' => false,
@@ -166,7 +169,7 @@ class ApiBlock extends ApiBase {
        public function getParamDescription() {
                return array(
                        'user' => 'Username, IP address or IP range you want to block',
-                       'token' => 'A block token previously obtained through the gettoken parameter or prop=info',
+                       'token' => 'A block token previously obtained through prop=info',
                        'gettoken' => 'If set, a block token will be returned, and no other action will be taken',
                        'expiry' => 'Relative expiry time, e.g. \'5 months\' or \'2 weeks\'. If set to \'infinite\', \'indefinite\' or \'never\', the block will never expire.',
                        'reason' => 'Reason for block (optional)',
index 8a4a17f..cefdaac 100644 (file)
@@ -46,25 +46,13 @@ class ApiDelete extends ApiBase {
        public function execute() {
                $params = $this->extractRequestParams();
 
-               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
-               if ( isset( $params['title'] ) ) {
-                       $titleObj = Title::newFromText( $params['title'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                       }
-               } elseif ( isset( $params['pageid'] ) ) {
-                       $titleObj = Title::newFromID( $params['pageid'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
-                       }
-               }
-               if ( !$titleObj->exists() ) {
+               $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
+               if ( !$pageObj->exists() ) {
                        $this->dieUsageMsg( 'notanarticle' );
                }
 
+               $titleObj = $pageObj->getTitle();
                $reason = ( isset( $params['reason'] ) ? $params['reason'] : null );
-               $pageObj = WikiPage::factory( $titleObj );
                $user = $this->getUser();
 
                if ( $titleObj->getNamespace() == NS_FILE ) {
@@ -239,10 +227,8 @@ class ApiDelete extends ApiBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(),
-                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'invalidtitle', 'title' ),
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'notanarticle' ),
                                array( 'hookaborted', 'error' ),
                                array( 'delete-toobig', 'limit' ),
index 796b049..19b1950 100644 (file)
@@ -48,18 +48,10 @@ class ApiEditPage extends ApiBase {
                        $this->dieUsageMsg( 'missingtext' );
                }
 
-               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
-               if ( isset( $params['title'] ) ) {
-                       $titleObj = Title::newFromText( $params['title'] );
-                       if ( !$titleObj || $titleObj->isExternal() ) {
-                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                       }
-               } elseif ( isset( $params['pageid'] ) ) {
-                       $titleObj = Title::newFromID( $params['pageid'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
-                       }
+               $pageObj = $this->getTitleOrPageId( $params );
+               $titleObj = $pageObj->getTitle();
+               if ( $titleObj->isExternal() ) {
+                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                }
 
                $apiResult = $this->getResult();
@@ -291,9 +283,6 @@ class ApiEditPage extends ApiBase {
                        case EditPage::AS_SPAM_ERROR:
                                $this->dieUsageMsg( array( 'spamdetected', $result['spam'] ) );
 
-                       case EditPage::AS_FILTERING:
-                               $this->dieUsageMsg( 'filtered' );
-
                        case EditPage::AS_BLOCKED_PAGE_FOR_USER:
                                $this->dieUsageMsg( 'blockedtext' );
 
@@ -381,11 +370,9 @@ class ApiEditPage extends ApiBase {
                global $wgMaxArticleSize;
 
                return array_merge( parent::getPossibleErrors(),
-                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'missingtext' ),
-                               array( 'invalidtitle', 'title' ),
                                array( 'createonly-exists' ),
                                array( 'nocreate-missing' ),
                                array( 'nosuchrevid', 'undo' ),
@@ -398,7 +385,6 @@ class ApiEditPage extends ApiBase {
                                array( 'noimageredirect-logged' ),
                                array( 'spamdetected', 'spam' ),
                                array( 'summaryrequired' ),
-                               array( 'filtered' ),
                                array( 'blockedtext' ),
                                array( 'contenttoobig', $wgMaxArticleSize ),
                                array( 'noedit-anon' ),
@@ -484,14 +470,14 @@ class ApiEditPage extends ApiBase {
                        'sectiontitle' => 'The title for a new section',
                        'text' => 'Page content',
                        'token' => array( 'Edit token. You can get one of these through prop=info.',
-                                               'The token should always be sent as the last parameter, or at least, after the text parameter'
+                                               "The token should always be sent as the last parameter, or at least, after the {$p}text parameter"
                        ),
-                       'summary' => 'Edit summary. Also section title when section=new',
+                       'summary' => "Edit summary. Also section title when {$p}section=new and {$p}sectiontitle is not set",
                        'minor' => 'Minor edit',
                        'notminor' => 'Non-minor edit',
                        'bot' => 'Mark this edit as bot',
                        'basetimestamp' => array( 'Timestamp of the base revision (obtained through prop=revisions&rvprop=timestamp).',
-                                               'Used to detect edit conflicts; leave unset to ignore conflicts.'
+                                               'Used to detect edit conflicts; leave unset to ignore conflicts'
                        ),
                        'starttimestamp' => array( 'Timestamp when you obtained the edit token.',
                                                'Used to detect edit conflicts; leave unset to ignore conflicts'
@@ -505,7 +491,8 @@ class ApiEditPage extends ApiBase {
                        'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
                                        'If set, the edit won\'t be done unless the hash is correct' ),
                        'prependtext' => "Add this text to the beginning of the page. Overrides {$p}text",
-                       'appendtext' => "Add this text to the end of the page. Overrides {$p}text",
+                       'appendtext' => array( "Add this text to the end of the page. Overrides {$p}text.",
+                                               "Use {$p}section=new to append a new section" ),
                        'undo' => "Undo this revision. Overrides {$p}text, {$p}prependtext and {$p}appendtext",
                        'undoafter' => 'Undo all revisions from undo to this one. If not set, just undo one revision',
                        'redirect' => 'Automatically resolve redirects',
index d9eed60..0032bd8 100644 (file)
@@ -55,7 +55,7 @@ class ApiEmailUser extends ApiBase {
                        'Subject' => $params['subject'],
                        'CCMe' => $params['ccme'],
                );
-               $retval = SpecialEmailUser::submit( $data );
+               $retval = SpecialEmailUser::submit( $data, $this->getContext() );
 
                if ( $retval instanceof Status ) {
                        // SpecialEmailUser sometimes returns a status
index 5df1ff6..d808075 100644 (file)
@@ -96,7 +96,7 @@ class ApiFeedContributions extends ApiBase {
        }
 
        protected function feedItem( $row ) {
-               $title = Title::MakeTitle( intval( $row->page_namespace ), $row->page_title );
+               $title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
                if( $title ) {
                        $date = $row->rev_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
index 7ef1da0..5ea2571 100644 (file)
@@ -133,7 +133,7 @@ class ApiFileRevert extends ApiBase {
 
        public function getParamDescription() {
                $params = array(
-                       'filename' => 'Target filename',
+                       'filename' => 'Target filename without the File: prefix',
                        'token' => 'Edit token. You can get one of these through prop=info',
                        'comment' => 'Upload comment',
                        'archivename' => 'Archive name of the revision to revert to',
index 17e9225..7dfdffc 100644 (file)
@@ -165,7 +165,7 @@ abstract class ApiFormatBase extends ApiBase {
 You are looking at the HTML representation of the <?php echo( $this->mFormat ); ?> format.<br />
 HTML is good for debugging, but is unsuitable for application use.<br />
 Specify the format parameter to change the output format.<br />
-To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( $this->mFormat ); ?>.<br />
+To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( strtolower( $this->mFormat ) ); ?>.<br />
 See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
 <a href='<?php echo( $script ); ?>'>API help</a> for more information.
 </small>
index ade9f1f..5093b6b 100644 (file)
@@ -186,8 +186,16 @@ class ApiImportReporter extends ImportReporter {
        function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
                // Add a result entry
                $r = array();
-               ApiQueryBase::addTitleInfo( $r, $title );
-               $r['revisions'] = intval( $successCount );
+
+               if ( $title === null ) {\r
+                       # Invalid or non-importable title
+                       $r['title'] = $pageInfo['title'];
+                       $r['invalid'] = '';\r
+               } else {\r
+                       ApiQueryBase::addTitleInfo( $r, $title );
+                       $r['revisions'] = intval( $successCount );
+               }
+
                $this->mResultArr[] = $r;
 
                // Piggyback on the parent to do the logging
index 2105b81..10540a3 100644 (file)
@@ -80,6 +80,7 @@ class ApiMain extends ApiBase {
                'patrol' => 'ApiPatrol',
                'import' => 'ApiImport',
                'userrights' => 'ApiUserrights',
+               'options' => 'ApiOptions',
        );
 
        /**
@@ -361,7 +362,7 @@ class ApiMain extends ApiBase {
                        $this->executeAction();
                } catch ( Exception $e ) {
                        // Log it
-                       if ( $e instanceof MWException ) {
+                       if ( !( $e instanceof UsageException ) ) {
                                wfDebugLog( 'exception', $e->getLogMessage() );
                        }
 
@@ -595,8 +596,14 @@ class ApiMain extends ApiBase {
                $moduleParams = $module->extractRequestParams();
 
                // Die if token required, but not provided (unless there is a gettoken parameter)
+               if ( isset( $moduleParams['gettoken'] ) ) {
+                       $gettoken = $moduleParams['gettoken'];
+               } else {
+                       $gettoken = false;
+               }
+
                $salt = $module->getTokenSalt();
-               if ( $salt !== false && isset( $moduleParams['gettoken'] ) && !$moduleParams['gettoken'] ) {
+               if ( $salt !== false && !$gettoken ) {
                        if ( !isset( $moduleParams['token'] ) ) {
                                $this->dieUsageMsg( array( 'missingparam', 'token' ) );
                        } else {
diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php
new file mode 100644 (file)
index 0000000..7bcfe1e
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+/**
+ *
+ *
+ * Created on Apr 15, 2012
+ *
+ * Copyright © 2012 Szymon Świerkosz beau@adres.pl
+ *
+ * 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
+ */
+
+/**
+* API module that facilitates the changing of user's preferences.
+* Requires API write mode to be enabled.
+*
+ * @ingroup API
+ */
+class ApiOptions extends ApiBase {
+
+       public function __construct( $main, $action ) {
+               parent::__construct( $main, $action );
+       }
+
+       /**
+        * Changes preferences of the current user.
+        */
+       public function execute() {
+               $user = $this->getUser();
+
+               if ( $user->isAnon() ) {
+                       $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
+               }
+
+               $params = $this->extractRequestParams();
+               $changes = 0;
+
+               if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) {
+                       $this->dieUsageMsg( array( 'missingparam', 'optionname' ) );
+               }
+
+               if ( $params['reset'] ) {
+                       $user->resetOptions();
+                       $changes++;
+               }
+               if ( count( $params['change'] ) ) {
+                       foreach ( $params['change'] as $entry ) {
+                               $array = explode( '=', $entry, 2 );
+                               $user->setOption( $array[0], isset( $array[1] ) ? $array[1] : null );
+                               $changes++;
+                       }
+               }
+               if ( isset( $params['optionname'] ) ) {
+                       $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
+                       $user->setOption( $params['optionname'], $newValue );
+                       $changes++;
+               }
+
+               if ( $changes ) {
+                       // Commit changes
+                       $user->saveSettings();
+               } else {
+                       $this->dieUsage( 'No changes were requested', 'nochanges' );
+               }
+
+               $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'reset' => false,
+                       'change' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'optionname' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                       ),
+                       'optionvalue' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'token' => 'An options token previously obtained through the action=tokens',
+                       'reset' => 'Resets all preferences to the site defaults',
+                       'change' => 'Pipe-separated list of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters',
+                       'optionname' => 'A name of a option which should have an optionvalue set',
+                       'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters',
+               );
+       }
+
+       public function getDescription() {
+               return 'Change preferences of the current user';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'notloggedin' ),
+                       array( 'nochanges' ),
+               ) );
+       }
+
+       public function needsToken() {
+               return true;
+       }
+
+       public function getTokenSalt() {
+               return '';
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Options';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=options&reset=&token=123ABC',
+                       'api.php?action=options&change=skin=vector|hideminor=1&token=123ABC',
+                       'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC',
+               );
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
index 141f779..dbcd43c 100644 (file)
@@ -59,13 +59,13 @@ class ApiParse extends ApiBase {
                // The parser needs $wgTitle to be set, apparently the
                // $title parameter in Parser::parse isn't enough *sigh*
                // TODO: Does this still need $wgTitle?
-               global $wgParser, $wgTitle, $wgLang;
+               global $wgParser, $wgTitle;
 
                // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang breaks
                $oldLang = null;
-               if ( isset( $params['uselang'] ) && $params['uselang'] != $wgLang->getCode() ) {
-                       $oldLang = $wgLang; // Backup wgLang
-                       $wgLang = Language::factory( $params['uselang'] );
+               if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
+                       $oldLang = $this->getContext()->getLanguage(); // Backup language
+                       $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
                }
 
                $popts = ParserOptions::newFromContext( $this->getContext() );
@@ -285,6 +285,9 @@ class ApiParse extends ApiBase {
                                $result->setContent( $result_array['psttext'], $this->pstText );
                        }
                }
+               if ( isset( $prop['properties'] ) ) {
+                       $result_array['properties'] = $this->formatProperties( $p_result->getProperties() );
+               }
 
                $result_mapping = array(
                        'redirects' => 'r',
@@ -297,12 +300,13 @@ class ApiParse extends ApiBase {
                        'iwlinks' => 'iw',
                        'sections' => 's',
                        'headitems' => 'hi',
+                       'properties' => 'pp',
                );
                $this->setIndexedTagNames( $result_array, $result_mapping );
                $result->addValue( null, $this->getModuleName(), $result_array );
 
                if ( !is_null( $oldLang ) ) {
-                       $wgLang = $oldLang; // Reset $wgLang to $oldLang
+                       $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
                }
        }
 
@@ -328,6 +332,9 @@ class ApiParse extends ApiBase {
                        // Try the parser cache first
                        // getParserOutput will save to Parser cache if able
                        $pout = $page->getParserOutput( $popts );
+                       if ( !$pout ) {
+                               $this->dieUsage( "There is no revision ID {$page->getLatest()}", 'missingrev' );
+                       }
                        if ( $getWikitext ) {
                                $this->text = $page->getRawText();
                        }
@@ -461,6 +468,17 @@ class ApiParse extends ApiBase {
                return $result;
        }
 
+       private function formatProperties( $properties ) {
+               $result = array();
+               foreach ( $properties as $name => $value ) {
+                       $entry = array();
+                       $entry['name'] = $name;
+                       $this->getResult()->setContent( $entry, $value );
+                       $result[] = $entry;
+               }
+               return $result;
+       }
+
        private function formatCss( $css ) {
                $result = array();
                foreach ( $css as $file => $link ) {
@@ -496,7 +514,7 @@ class ApiParse extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle',
+                               ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle|iwlinks|properties',
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'text',
@@ -515,6 +533,7 @@ class ApiParse extends ApiBase {
                                        'headhtml',
                                        'iwlinks',
                                        'wikitext',
+                                       'properties',
                                )
                        ),
                        'pst' => false,
@@ -553,6 +572,7 @@ class ApiParse extends ApiBase {
                                ' headhtml       - Gives parsed <head> of the page',
                                ' iwlinks        - Gives interwiki links in the parsed wikitext',
                                ' wikitext       - Gives the original wikitext that was parsed',
+                               ' properties     - Gives various properties defined in the parsed wikitext',
                        ),
                        'pst' => array(
                                'Do a pre-save transform on the input before parsing it',
@@ -569,7 +589,10 @@ class ApiParse extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Parses wikitext and returns parser output';
+               return array(
+                       'Parses wikitext and returns parser output',
+                       'See the various prop-Modules of action=query to get information from the current version of a page',
+               );
        }
 
        public function getPossibleErrors() {
index ec7b560..d156468 100644 (file)
@@ -37,19 +37,8 @@ class ApiProtect extends ApiBase {
                global $wgRestrictionLevels;
                $params = $this->extractRequestParams();
 
-               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
-               if ( isset( $params['title'] ) ) {
-                       $titleObj = Title::newFromText( $params['title'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                       }
-               } elseif ( isset( $params['pageid'] ) ) {
-                       $titleObj = Title::newFromID( $params['pageid'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
-                       }
-               }
+               $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
+               $titleObj = $pageObj->getTitle();
 
                $errors = $titleObj->getUserPermissionsErrors( 'protect', $this->getUser() );
                if ( $errors ) {
@@ -115,7 +104,6 @@ class ApiProtect extends ApiBase {
                $watch = $params['watch'] ? 'watch' : $params['watchlist'];
                $this->setWatch( $watch, $titleObj );
 
-               $pageObj = WikiPage::factory( $titleObj );
                $status = $pageObj->doUpdateRestrictions( $protections, $expiryarray, $cascade, $params['reason'], $this->getUser() );
 
                if ( !$status->isOK() ) {
@@ -202,10 +190,8 @@ class ApiProtect extends ApiBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(),
-                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'invalidtitle', 'title' ),
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'toofewexpiries', 'noofexpiries', 'noofprotections' ),
                                array( 'create-titleexists' ),
                                array( 'missingtitle-createonly' ),
index c172d24..866b71c 100644 (file)
@@ -64,8 +64,8 @@ class ApiQuery extends ApiBase {
        );
 
        private $mQueryListModules = array(
-               'allimages' => 'ApiQueryAllimages',
-               'allpages' => 'ApiQueryAllpages',
+               'allimages' => 'ApiQueryAllImages',
+               'allpages' => 'ApiQueryAllPages',
                'alllinks' => 'ApiQueryAllLinks',
                'allcategories' => 'ApiQueryAllCategories',
                'allusers' => 'ApiQueryAllUsers',
@@ -95,7 +95,7 @@ class ApiQuery extends ApiBase {
        private $mQueryMetaModules = array(
                'siteinfo' => 'ApiQuerySiteinfo',
                'userinfo' => 'ApiQueryUserInfo',
-               'allmessages' => 'ApiQueryAllmessages',
+               'allmessages' => 'ApiQueryAllMessages',
        );
 
        private $mSlaveDB = null;
index 78367a4..b0f272b 100644 (file)
@@ -65,14 +65,20 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
 
                $min = $params['min'];
                $max = $params['max'];
-               $this->addWhereRange( 'cat_pages', $dir, $min, $max );
+               if ( $dir == 'newer' ) {
+                       $this->addWhereRange( 'cat_pages', 'newer', $min, $max );
+               } else {
+                       $this->addWhereRange( 'cat_pages', 'older', $max, $min);
+               }
+    
 
                if ( isset( $params['prefix'] ) ) {
                        $this->addWhere( 'cat_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
-               $this->addOption( 'ORDER BY', 'cat_title' . ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', 'cat_title' . $sort );
 
                $prop = array_flip( $params['prop'] );
                $this->addFieldsIf( array( 'cat_pages', 'cat_subcats', 'cat_files' ), isset( $prop['size'] ) );
diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php
new file mode 100644 (file)
index 0000000..87e7024
--- /dev/null
@@ -0,0 +1,267 @@
+<?php
+
+/**
+ * API for MediaWiki 1.12+
+ *
+ * Created on Mar 16, 2008
+ *
+ * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
+ * based on ApiQueryAllPages.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
+ */
+
+/**
+ * Query module to enumerate all available pages.
+ *
+ * @ingroup API
+ */
+class ApiQueryAllImages extends ApiQueryGeneratorBase {
+
+       protected $mRepo;
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'ai' );
+               $this->mRepo = RepoGroup::singleton()->getLocalRepo();
+       }
+
+       /**
+        * Override parent method to make sure to make sure the repo's DB is used
+        * which may not necesarilly be the same as the local DB.
+        *
+        * TODO: allow querying non-local repos.
+        * @return DatabaseBase
+        */
+       protected function getDB() {
+               return $this->mRepo->getSlaveDB();
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       public function executeGenerator( $resultPageSet ) {
+               if ( $resultPageSet->isResolvingRedirects() ) {
+                       $this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' );
+               }
+
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       private function run( $resultPageSet = null ) {
+               $repo = $this->mRepo;
+               if ( !$repo instanceof LocalRepo ) {
+                       $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
+               }
+
+               $db = $this->getDB();
+
+               $params = $this->extractRequestParams();
+
+               // Image filters
+               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
+               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+               $this->addWhereRange( 'img_name', $dir, $from, $to );
+
+               if ( isset( $params['prefix'] ) )
+                       $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+
+               if ( isset( $params['minsize'] ) ) {
+                       $this->addWhere( 'img_size>=' . intval( $params['minsize'] ) );
+               }
+
+               if ( isset( $params['maxsize'] ) ) {
+                       $this->addWhere( 'img_size<=' . intval( $params['maxsize'] ) );
+               }
+
+               $sha1 = false;
+               if ( isset( $params['sha1'] ) ) {
+                       if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
+                               $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
+                       }
+                       $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 );
+               } elseif ( isset( $params['sha1base36'] ) ) {
+                       $sha1 = $params['sha1base36'];
+                       if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
+                               $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
+                       }
+               }
+               if ( $sha1 ) {
+                       $this->addWhereFld( 'img_sha1', $sha1 );
+               }
+
+               if ( !is_null( $params['mime'] ) ) {
+                       global $wgMiserMode;
+                       if ( $wgMiserMode  ) {
+                               $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
+                       }
+
+                       list( $major, $minor ) = File::splitMime( $params['mime'] );
+
+                       $this->addWhereFld( 'img_major_mime', $major );
+                       $this->addWhereFld( 'img_minor_mime', $minor );
+               }
+
+               $this->addTables( 'image' );
+
+               $prop = array_flip( $params['prop'] );
+               $this->addFields( LocalFile::selectFields() );
+
+               $limit = $params['limit'];
+               $this->addOption( 'LIMIT', $limit + 1 );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', 'img_name' . $sort );
+
+               $res = $this->select( __METHOD__ );
+
+               $titles = array();
+               $count = 0;
+               $result = $this->getResult();
+               foreach ( $res as $row ) {
+                       if ( ++ $count > $limit ) {
+                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
+                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
+                               break;
+                       }
+
+                       if ( is_null( $resultPageSet ) ) {
+                               $file = $repo->newFileFromRow( $row );
+                               $info = array_merge( array( 'name' => $row->img_name ),
+                                       ApiQueryImageInfo::getInfo( $file, $prop, $result ) );
+                               self::addTitleInfo( $info, $file->getTitle() );
+
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $info );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
+                                       break;
+                               }
+                       } else {
+                               $titles[] = Title::makeTitle( NS_IMAGE, $row->img_name );
+                       }
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'img' );
+               } else {
+                       $resultPageSet->populateFromTitles( $titles );
+               }
+       }
+
+       public function getAllowedParams() {
+               return array (
+                       'from' => null,
+                       'to' => null,
+                       'prefix' => null,
+                       'minsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'maxsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
+                       'sha1' => null,
+                       'sha1base36' => null,
+                       'prop' => array(
+                               ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
+                               ApiBase::PARAM_DFLT => 'timestamp|url',
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'mime' => null,
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'from' => 'The image title to start enumerating from',
+                       'to' => 'The image title to stop enumerating at',
+                       'prefix' => 'Search for all image titles that begin with this value',
+                       'dir' => 'The direction in which to list',
+                       'minsize' => 'Limit to images with at least this many bytes',
+                       'maxsize' => 'Limit to images with at most this many bytes',
+                       'limit' => 'How many images in total to return',
+                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
+                       'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
+                       'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
+                       'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode',
+               );
+       }
+
+       private $propertyFilter = array( 'archivename' );
+
+       public function getDescription() {
+               return 'Enumerate all images sequentially';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ),
+                       array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
+                       array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
+                       array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
+                       array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
+               ) );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=allimages&aifrom=B' => array(
+                               'Simple Use',
+                               'Show a list of images starting at the letter "B"',
+                       ),
+                       'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
+                               'Using as Generator',
+                               'Show info about 4 images starting at the letter "T"',
+                       ),
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Allimages';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
index 903f144..7e7fc40 100644 (file)
@@ -105,7 +105,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                $this->addOption( 'LIMIT', $limit + 1 );
 
                if ( !$params['unique'] ) {
-                       $this->addOption( 'ORDER BY', 'pl_title, pl_from' );
+                       $this->addOption( 'ORDER BY', array(
+                               'pl_title',
+                               'pl_from'
+                       ));
                }
 
                $res = $this->select( __METHOD__ );
diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php
new file mode 100644 (file)
index 0000000..dedd3e5
--- /dev/null
@@ -0,0 +1,277 @@
+<?php
+/**
+ *
+ *
+ * Created on Dec 1, 2007
+ *
+ * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ *
+ * 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
+ */
+
+/**
+ * A query action to return messages from site message cache
+ *
+ * @ingroup API
+ */
+class ApiQueryAllMessages extends ApiQueryBase {
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'am' );
+       }
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+
+               if ( is_null( $params['lang'] ) ) {
+                       global $wgLang;
+                       $langObj = $wgLang;
+               } else {
+                       $langObj = Language::factory( $params['lang'] );
+               }
+
+               if ( $params['enableparser'] ) {
+                       if ( !is_null( $params['title'] ) ) {
+                               $title = Title::newFromText( $params['title'] );
+                               if ( !$title ) {
+                                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+                               }
+                       } else {
+                               $title = Title::newFromText( 'API' );
+                       }
+               }
+
+               $prop = array_flip( (array)$params['prop'] );
+
+               // Determine which messages should we print
+               if ( in_array( '*', $params['messages'] ) ) {
+                       $message_names = Language::getMessageKeysFor( $langObj->getCode() );
+                       if ( $params['includelocal'] ) {
+                               global $wgLanguageCode;
+                               $message_names = array_unique( array_merge(
+                                       $message_names,
+                                       // Pass in the content language code so we get local messages that have a
+                                       // MediaWiki:msgkey page. We might theoretically miss messages that have no
+                                       // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
+                                       // just a stupid case.
+                                       MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
+                               ) );
+                       }
+                       sort( $message_names );
+                       $messages_target = $message_names;
+               } else {
+                       $messages_target = $params['messages'];
+               }
+
+               // Filter messages that have the specified prefix
+               // Because we sorted the message array earlier, they will appear in a clump:
+               if ( isset( $params['prefix'] ) ) {
+                       $skip = false;
+                       $messages_filtered = array();
+                       foreach ( $messages_target as $message ) {
+                               // === 0: must be at beginning of string (position 0)
+                               if ( strpos( $message, $params['prefix'] ) === 0 ) {
+                                       if( !$skip ) {
+                                               $skip = true;
+                                       }
+                                       $messages_filtered[] = $message;
+                               } elseif ( $skip ) {
+                                       break;
+                               }
+                       }
+                       $messages_target = $messages_filtered;
+               }
+
+               // Filter messages that contain specified string
+               if ( isset( $params['filter'] ) ) {
+                       $messages_filtered = array();
+                       foreach ( $messages_target as $message ) {
+                               // !== is used because filter can be at the beginning of the string
+                               if ( strpos( $message, $params['filter'] ) !== false ) {
+                                       $messages_filtered[] = $message;
+                               }
+                       }
+                       $messages_target = $messages_filtered;
+               }
+
+               // Whether we have any sort of message customisation filtering
+               $customiseFilterEnabled = $params['customised'] !== 'all';
+               if ( $customiseFilterEnabled ) {
+                       global $wgContLang;
+                       $lang = $langObj->getCode();
+
+                       $customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
+                               array_map( array( $langObj, 'ucfirst'), $messages_target ), $lang, $lang != $wgContLang->getCode() );
+
+                       $customised = $params['customised'] === 'modified';
+               }
+
+               // Get all requested messages and print the result
+               $skip = !is_null( $params['from'] );
+               $useto = !is_null( $params['to'] );
+               $result = $this->getResult();
+               foreach ( $messages_target as $message ) {
+                       // Skip all messages up to $params['from']
+                       if ( $skip && $message === $params['from'] ) {
+                               $skip = false;
+                       }
+
+                       if ( $useto && $message > $params['to'] ) {
+                               break;
+                       }
+
+                       if ( !$skip ) {
+                               $a = array( 'name' => $message );
+                               $args = array();
+                               if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) {
+                                       $args = $params['args'];
+                               }
+
+                               if ( $customiseFilterEnabled ) {
+                                       $messageIsCustomised = isset( $customisedMessages['pages'][ $langObj->ucfirst( $message ) ] );
+                                       if ( $customised === $messageIsCustomised ) {
+                                               if ( $customised ) {
+                                                       $a['customised'] = '';
+                                               }
+                                       } else {
+                                               continue;
+                                       }
+                               }
+
+                               $msg = wfMessage( $message, $args )->inLanguage( $langObj );
+
+                               if ( !$msg->exists() ) {
+                                       $a['missing'] = '';
+                               } else {
+                                       // Check if the parser is enabled:
+                                       if ( $params['enableparser'] ) {
+                                               $msgString = $msg->title( $title )->text();
+                                       } else {
+                                               $msgString = $msg->plain();
+                                       }
+                                       if ( !$params['nocontent'] ) {
+                                               ApiResult::setContent( $a, $msgString );
+                                       }
+                                       if ( isset( $prop['default'] ) ) {
+                                               $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
+                                               if ( !$default->exists() ) {
+                                                       $a['defaultmissing'] = '';
+                                               } elseif ( $default->plain() != $msgString ) {
+                                                       $a['default'] = $default->plain();
+                                               }
+                                       }
+                               }
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $a );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $message );
+                                       break;
+                               }
+                       }
+               }
+               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' );
+       }
+
+       public function getCacheMode( $params ) {
+               if ( is_null( $params['lang'] ) ) {
+                       // Language not specified, will be fetched from preferences
+                       return 'anon-public-user-private';
+               } elseif ( $params['enableparser'] ) {
+                       // User-specific parser options will be used
+                       return 'anon-public-user-private';
+               } else {
+                       // OK to cache
+                       return 'public';
+               }
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'messages' => array(
+                               ApiBase::PARAM_DFLT => '*',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'prop' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array(
+                                       'default'
+                               )
+                       ),
+                       'enableparser' => false,
+                       'nocontent' => false,
+                       'includelocal' => false,
+                       'args' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_ALLOW_DUPLICATES => true,
+                       ),
+                       'filter' => array(),
+                       'customised' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'all',
+                                       'modified',
+                                       'unmodified'
+                               )
+                       ),
+                       'lang' => null,
+                       'from' => null,
+                       'to' => null,
+                       'title' => null,
+                       'prefix' => null,
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'messages' => 'Which messages to output. "*" (default) means all messages',
+                       'prop' => 'Which properties to get',
+                       'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
+                                                       'Will substitute magic words, handle templates etc.' ),
+                       'nocontent' => 'If set, do not include the content of the messages in the output.',
+                       'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.",
+                                                       "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
+                       ),
+                       'title' => 'Page name to use as context when parsing message (for enableparser option)',
+                       'args' => 'Arguments to be substituted into message',
+                       'prefix' => 'Return messages with this prefix',
+                       'filter' => 'Return only messages with names that contain this string',
+                       'customised' => 'Return only messages in this customisation state',
+                       'lang' => 'Return messages in this language',
+                       'from' => 'Return messages starting at this message',
+                       'to' => 'Return messages ending at this message',
+               );
+       }
+
+       public function getDescription() {
+               return 'Return messages from this site';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&meta=allmessages&amprefix=ipb-',
+                       'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php
new file mode 100644 (file)
index 0000000..7e89a95
--- /dev/null
@@ -0,0 +1,333 @@
+<?php
+/**
+ *
+ *
+ * Created on Sep 25, 2006
+ *
+ * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ *
+ * 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
+ */
+
+/**
+ * Query module to enumerate all available pages.
+ *
+ * @ingroup API
+ */
+class ApiQueryAllPages extends ApiQueryGeneratorBase {
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'ap' );
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       public function executeGenerator( $resultPageSet ) {
+               if ( $resultPageSet->isResolvingRedirects() ) {
+                       $this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' );
+               }
+
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       private function run( $resultPageSet = null ) {
+               $db = $this->getDB();
+
+               $params = $this->extractRequestParams();
+
+               // Page filters
+               $this->addTables( 'page' );
+
+               if ( $params['filterredir'] == 'redirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 1 );
+               } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 0 );
+               }
+
+               $this->addWhereFld( 'page_namespace', $params['namespace'] );
+               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
+               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+               $this->addWhereRange( 'page_title', $dir, $from, $to );
+
+               if ( isset( $params['prefix'] ) ) {
+                       $this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $selectFields = array(
+                               'page_namespace',
+                               'page_title',
+                               'page_id'
+                       );
+               } else {
+                       $selectFields = $resultPageSet->getPageTableFields();
+               }
+
+               $this->addFields( $selectFields );
+               $forceNameTitleIndex = true;
+               if ( isset( $params['minsize'] ) ) {
+                       $this->addWhere( 'page_len>=' . intval( $params['minsize'] ) );
+                       $forceNameTitleIndex = false;
+               }
+
+               if ( isset( $params['maxsize'] ) ) {
+                       $this->addWhere( 'page_len<=' . intval( $params['maxsize'] ) );
+                       $forceNameTitleIndex = false;
+               }
+
+               // Page protection filtering
+               if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
+                       $this->addTables( 'page_restrictions' );
+                       $this->addWhere( 'page_id=pr_page' );
+                       $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
+
+                       if ( count( $params['prtype'] ) ) {
+                               $this->addWhereFld( 'pr_type', $params['prtype'] );
+
+                               if ( isset( $params['prlevel'] ) ) {
+                                       // Remove the empty string and '*' from the prlevel array
+                                       $prlevel = array_diff( $params['prlevel'], array( '', '*' ) );
+
+                                       if ( count( $prlevel ) ) {
+                                               $this->addWhereFld( 'pr_level', $prlevel );
+                                       }
+                               }
+                               if ( $params['prfiltercascade'] == 'cascading' ) {
+                                       $this->addWhereFld( 'pr_cascade', 1 );
+                               } elseif ( $params['prfiltercascade'] == 'noncascading' ) {
+                                       $this->addWhereFld( 'pr_cascade', 0 );
+                               }
+
+                               $this->addOption( 'DISTINCT' );
+                       }
+                       $forceNameTitleIndex = false;
+
+                       if ( $params['prexpiry'] == 'indefinite' ) {
+                               $this->addWhere( "pr_expiry = {$db->addQuotes( $db->getInfinity() )} OR pr_expiry IS NULL" );
+                       } elseif ( $params['prexpiry'] == 'definite' ) {
+                               $this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
+                       }
+
+               } elseif ( isset( $params['prlevel'] ) ) {
+                       $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
+               }
+
+               if ( $params['filterlanglinks'] == 'withoutlanglinks' ) {
+                       $this->addTables( 'langlinks' );
+                       $this->addJoinConds( array( 'langlinks' => array( 'LEFT JOIN', 'page_id=ll_from' ) ) );
+                       $this->addWhere( 'll_from IS NULL' );
+                       $forceNameTitleIndex = false;
+               } elseif ( $params['filterlanglinks'] == 'withlanglinks' ) {
+                       $this->addTables( 'langlinks' );
+                       $this->addWhere( 'page_id=ll_from' );
+                       $this->addOption( 'STRAIGHT_JOIN' );
+                       // We have to GROUP BY all selected fields to stop
+                       // PostgreSQL from whining
+                       $this->addOption( 'GROUP BY', $selectFields );
+                       $forceNameTitleIndex = false;
+               }
+
+               if ( $forceNameTitleIndex ) {
+                       $this->addOption( 'USE INDEX', 'name_title' );
+               }
+
+               $limit = $params['limit'];
+               $this->addOption( 'LIMIT', $limit + 1 );
+               $res = $this->select( __METHOD__ );
+
+               $count = 0;
+               $result = $this->getResult();
+               foreach ( $res as $row ) {
+                       if ( ++ $count > $limit ) {
+                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
+                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
+                               break;
+                       }
+
+                       if ( is_null( $resultPageSet ) ) {
+                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                               $vals = array(
+                                       'pageid' => intval( $row->page_id ),
+                                       'ns' => intval( $title->getNamespace() ),
+                                       'title' => $title->getPrefixedText()
+                               );
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
+                                       break;
+                               }
+                       } else {
+                               $resultPageSet->processDbRow( $row );
+                       }
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
+               }
+       }
+
+       public function getAllowedParams() {
+               global $wgRestrictionLevels;
+
+               return array(
+                       'from' => null,
+                       'to' => null,
+                       'prefix' => null,
+                       'namespace' => array(
+                               ApiBase::PARAM_DFLT => 0,
+                               ApiBase::PARAM_TYPE => 'namespace',
+                       ),
+                       'filterredir' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'all',
+                                       'redirects',
+                                       'nonredirects'
+                               )
+                       ),
+                       'minsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'maxsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'prtype' => array(
+                               ApiBase::PARAM_TYPE => Title::getFilteredRestrictionTypes( true ),
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'prlevel' => array(
+                               ApiBase::PARAM_TYPE => $wgRestrictionLevels,
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'prfiltercascade' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'cascading',
+                                       'noncascading',
+                                       'all'
+                               ),
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
+                       'filterlanglinks' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'withlanglinks',
+                                       'withoutlanglinks',
+                                       'all'
+                               ),
+                               ApiBase::PARAM_DFLT => 'all'
+                       ),
+                       'prexpiry' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'indefinite',
+                                       'definite',
+                                       'all'
+                               ),
+                               ApiBase::PARAM_DFLT => 'all'
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               $p = $this->getModulePrefix();
+               return array(
+                       'from' => 'The page title to start enumerating from',
+                       'to' => 'The page title to stop enumerating at',
+                       'prefix' => 'Search for all page titles that begin with this value',
+                       'namespace' => 'The namespace to enumerate',
+                       'filterredir' => 'Which pages to list',
+                       'dir' => 'The direction in which to list',
+                       'minsize' => 'Limit to pages with at least this many bytes',
+                       'maxsize' => 'Limit to pages with at most this many bytes',
+                       'prtype' => 'Limit to protected pages only',
+                       'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
+                       'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
+                       'filterlanglinks' => 'Filter based on whether a page has langlinks',
+                       'limit' => 'How many total pages to return.',
+                       'prexpiry' => array(
+                               'Which protection expiry to filter the page on',
+                               ' indefinite - Get only pages with indefinite protection expiry',
+                               ' definite - Get only pages with a definite (specific) protection expiry',
+                               ' all - Get pages with any protections expiry'
+                       ),
+               );
+       }
+
+       public function getDescription() {
+               return 'Enumerate all pages sequentially in a given namespace';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
+                       array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
+               ) );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=allpages&apfrom=B' => array(
+                               'Simple Use',
+                               'Show a list of pages starting at the letter "B"',
+                       ),
+                       'api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' => array(
+                               'Using as Generator',
+                               'Show info about 4 pages starting at the letter "T"',
+                       ),
+                       'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
+                               'Show content of first 2 non-redirect pages begining at "Re"',
+                       )
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Allpages';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
index ac112ef..e96676e 100644 (file)
@@ -34,6 +34,16 @@ class ApiQueryAllUsers extends ApiQueryBase {
                parent::__construct( $query, $moduleName, 'au' );
        }
 
+       /**
+        * This function converts the user name to a canonical form
+        * which is stored in the database.
+        * @param String $name
+        * @return String
+        */
+       private function getCanonicalUserName( $name ) {
+               return str_replace( '_', ' ', $name );
+       }
+
        public function execute() {
                $db = $this->getDB();
                $params = $this->extractRequestParams();
@@ -57,8 +67,8 @@ class ApiQueryAllUsers extends ApiQueryBase {
                $useIndex = true;
 
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = is_null( $params['from'] ) ? null : $this->keyToTitle( $params['from'] );
-               $to = is_null( $params['to'] ) ? null : $this->keyToTitle( $params['to'] );
+               $from = is_null( $params['from'] ) ? null : $this->getCanonicalUserName( $params['from'] );
+               $to = is_null( $params['to'] ) ? null : $this->getCanonicalUserName( $params['to'] );
 
                # MySQL doesn't seem to use 'equality propagation' here, so like the
                # ActiveUsers special page, we have to use rc_user_text for some cases.
@@ -68,7 +78,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
                if ( !is_null( $params['prefix'] ) ) {
                        $this->addWhere( $userFieldToSort .
-                               $db->buildLike( $this->keyToTitle( $params['prefix'] ), $db->anyString() ) );
+                               $db->buildLike( $this->getCanonicalUserName( $params['prefix'] ), $db->anyString() ) );
                }
 
                if ( !is_null( $params['rights'] ) ) {
@@ -190,15 +200,14 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        $lastUserData = null;
 
                                        if ( !$fit ) {
-                                               $this->setContinueEnumParameter( 'from',
-                                                               $this->keyToTitle( $lastUserData['name'] ) );
+                                               $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
                                                break;
                                        }
                                }
 
                                if ( $count > $limit ) {
                                        // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->user_name ) );
+                                       $this->setContinueEnumParameter( 'from', $row->user_name );
                                        break;
                                }
 
@@ -235,17 +244,23 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function' );
                        }
 
-                       $lastUserObj = User::newFromName( $lastUser );
+                       $lastUserObj = User::newFromId( $row->user_id );
 
                        // Add user's group info
                        if ( $fld_groups ) {
-                               if ( !isset( $lastUserData['groups'] ) && $lastUserObj ) {
-                                       $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
+                               if ( !isset( $lastUserData['groups'] ) ) {
+                                       if ( $lastUserObj ) {
+                                               $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
+                                       } else {
+                                               // This should not normally happen
+                                               $lastUserData['groups'] = array();
+                                       }
                                }
 
                                if ( !is_null( $row->ug_group2 ) ) {
                                        $lastUserData['groups'][] = $row->ug_group2;
                                }
+
                                $result->setIndexedTagName( $lastUserData['groups'], 'g' );
                        }
 
@@ -254,13 +269,20 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                $result->setIndexedTagName( $lastUserData['implicitgroups'], 'g' );
                        }
                        if ( $fld_rights ) {
-                               if ( !isset( $lastUserData['rights'] ) && $lastUserObj ) {
-                                       $lastUserData['rights'] =  User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+                               if ( !isset( $lastUserData['rights'] ) ) {
+                                       if ( $lastUserObj ) {
+                                               $lastUserData['rights'] =  User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+                                       } else {
+                                               // This should not normally happen
+                                               $lastUserData['rights'] = array();
+                                       }
                                }
+
                                if ( !is_null( $row->ug_group2 ) ) {
                                        $lastUserData['rights'] = array_unique( array_merge( $lastUserData['rights'],
                                                User::getGroupPermissions( array( $row->ug_group2 ) ) ) );
                                }
+
                                $result->setIndexedTagName( $lastUserData['rights'], 'r' );
                        }
                }
@@ -269,8 +291,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ),
                                null, $lastUserData );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'from',
-                                       $this->keyToTitle( $lastUserData['name'] ) );
+                               $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
                        }
                }
 
diff --git a/includes/api/ApiQueryAllimages.php b/includes/api/ApiQueryAllimages.php
deleted file mode 100644 (file)
index ca344f7..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-<?php
-
-/**
- * API for MediaWiki 1.12+
- *
- * Created on Mar 16, 2008
- *
- * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
- * based on ApiQueryAllpages.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
- */
-
-/**
- * Query module to enumerate all available pages.
- *
- * @ingroup API
- */
-class ApiQueryAllimages extends ApiQueryGeneratorBase {
-
-       protected $mRepo;
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'ai' );
-               $this->mRepo = RepoGroup::singleton()->getLocalRepo();
-       }
-
-       /**
-        * Override parent method to make sure to make sure the repo's DB is used
-        * which may not necesarilly be the same as the local DB.
-        *
-        * TODO: allow querying non-local repos.
-        * @return DatabaseBase
-        */
-       protected function getDB() {
-               return $this->mRepo->getSlaveDB();
-       }
-
-       public function execute() {
-               $this->run();
-       }
-
-       public function getCacheMode( $params ) {
-               return 'public';
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       public function executeGenerator( $resultPageSet ) {
-               if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' );
-               }
-
-               $this->run( $resultPageSet );
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       private function run( $resultPageSet = null ) {
-               $repo = $this->mRepo;
-               if ( !$repo instanceof LocalRepo ) {
-                       $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
-               }
-
-               $db = $this->getDB();
-
-               $params = $this->extractRequestParams();
-
-               // Image filters
-               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
-               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
-               $this->addWhereRange( 'img_name', $dir, $from, $to );
-
-               if ( isset( $params['prefix'] ) )
-                       $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
-
-               if ( isset( $params['minsize'] ) ) {
-                       $this->addWhere( 'img_size>=' . intval( $params['minsize'] ) );
-               }
-
-               if ( isset( $params['maxsize'] ) ) {
-                       $this->addWhere( 'img_size<=' . intval( $params['maxsize'] ) );
-               }
-
-               $sha1 = false;
-               if ( isset( $params['sha1'] ) ) {
-                       if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
-                               $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
-                       }
-                       $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 );
-               } elseif ( isset( $params['sha1base36'] ) ) {
-                       $sha1 = $params['sha1base36'];
-                       if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
-                               $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
-                       }
-               }
-               if ( $sha1 ) {
-                       $this->addWhereFld( 'img_sha1', $sha1 );
-               }
-
-               if ( !is_null( $params['mime'] ) ) {
-                       global $wgMiserMode;
-                       if ( $wgMiserMode  ) {
-                               $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
-                       }
-
-                       list( $major, $minor ) = File::splitMime( $params['mime'] );
-
-                       $this->addWhereFld( 'img_major_mime', $major );
-                       $this->addWhereFld( 'img_minor_mime', $minor );
-               }
-
-               $this->addTables( 'image' );
-
-               $prop = array_flip( $params['prop'] );
-               $this->addFields( LocalFile::selectFields() );
-
-               $limit = $params['limit'];
-               $this->addOption( 'LIMIT', $limit + 1 );
-               $this->addOption( 'ORDER BY', 'img_name' .
-                                               ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
-
-               $res = $this->select( __METHOD__ );
-
-               $titles = array();
-               $count = 0;
-               $result = $this->getResult();
-               foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
-                               break;
-                       }
-
-                       if ( is_null( $resultPageSet ) ) {
-                               $file = $repo->newFileFromRow( $row );
-                               $info = array_merge( array( 'name' => $row->img_name ),
-                                       ApiQueryImageInfo::getInfo( $file, $prop, $result ) );
-                               self::addTitleInfo( $info, $file->getTitle() );
-
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $info );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
-                                       break;
-                               }
-                       } else {
-                               $titles[] = Title::makeTitle( NS_IMAGE, $row->img_name );
-                       }
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'img' );
-               } else {
-                       $resultPageSet->populateFromTitles( $titles );
-               }
-       }
-
-       public function getAllowedParams() {
-               return array (
-                       'from' => null,
-                       'to' => null,
-                       'prefix' => null,
-                       'minsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'maxsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       ),
-                       'dir' => array(
-                               ApiBase::PARAM_DFLT => 'ascending',
-                               ApiBase::PARAM_TYPE => array(
-                                       'ascending',
-                                       'descending'
-                               )
-                       ),
-                       'sha1' => null,
-                       'sha1base36' => null,
-                       'prop' => array(
-                               ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
-                               ApiBase::PARAM_DFLT => 'timestamp|url',
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'mime' => null,
-               );
-       }
-
-       public function getParamDescription() {
-               return array(
-                       'from' => 'The image title to start enumerating from',
-                       'to' => 'The image title to stop enumerating at',
-                       'prefix' => 'Search for all image titles that begin with this value',
-                       'dir' => 'The direction in which to list',
-                       'minsize' => 'Limit to images with at least this many bytes',
-                       'maxsize' => 'Limit to images with at most this many bytes',
-                       'limit' => 'How many images in total to return',
-                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
-                       'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
-                       'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
-                       'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode',
-               );
-       }
-
-       private $propertyFilter = array( 'archivename' );
-
-       public function getDescription() {
-               return 'Enumerate all images sequentially';
-       }
-
-       public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ),
-                       array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
-                       array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
-                       array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
-                       array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
-               ) );
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&list=allimages&aifrom=B' => array(
-                               'Simple Use',
-                               'Show a list of images starting at the letter "B"',
-                       ),
-                       'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
-                               'Using as Generator',
-                               'Show info about 4 images starting at the letter "T"',
-                       ),
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allimages';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
diff --git a/includes/api/ApiQueryAllmessages.php b/includes/api/ApiQueryAllmessages.php
deleted file mode 100644 (file)
index 4477492..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Dec 1, 2007
- *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
- *
- * 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
- */
-
-/**
- * A query action to return messages from site message cache
- *
- * @ingroup API
- */
-class ApiQueryAllmessages extends ApiQueryBase {
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'am' );
-       }
-
-       public function execute() {
-               $params = $this->extractRequestParams();
-
-               if ( is_null( $params['lang'] ) ) {
-                       global $wgLang;
-                       $langObj = $wgLang;
-               } else {
-                       $langObj = Language::factory( $params['lang'] );
-               }
-
-               if ( $params['enableparser'] ) {
-                       if ( !is_null( $params['title'] ) ) {
-                               $title = Title::newFromText( $params['title'] );
-                               if ( !$title ) {
-                                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                               }
-                       } else {
-                               $title = Title::newFromText( 'API' );
-                       }
-               }
-
-               $prop = array_flip( (array)$params['prop'] );
-
-               // Determine which messages should we print
-               if ( in_array( '*', $params['messages'] ) ) {
-                       $message_names = Language::getMessageKeysFor( $langObj->getCode() );
-                       if ( $params['includelocal'] ) {
-                               global $wgLanguageCode;
-                               $message_names = array_unique( array_merge(
-                                       $message_names,
-                                       // Pass in the content language code so we get local messages that have a
-                                       // MediaWiki:msgkey page. We might theoretically miss messages that have no
-                                       // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
-                                       // just a stupid case.
-                                       MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
-                               ) );
-                       }
-                       sort( $message_names );
-                       $messages_target = $message_names;
-               } else {
-                       $messages_target = $params['messages'];
-               }
-
-               // Filter messages that have the specified prefix
-               // Because we sorted the message array earlier, they will appear in a clump:
-               if ( isset( $params['prefix'] ) ) {
-                       $skip = false;
-                       $messages_filtered = array();
-                       foreach ( $messages_target as $message ) {
-                               // === 0: must be at beginning of string (position 0)
-                               if ( strpos( $message, $params['prefix'] ) === 0 ) {
-                                       if( !$skip ) {
-                                               $skip = true;
-                                       }
-                                       $messages_filtered[] = $message;
-                               } elseif ( $skip ) {
-                                       break;
-                               }
-                       }
-                       $messages_target = $messages_filtered;
-               }
-
-               // Filter messages that contain specified string
-               if ( isset( $params['filter'] ) ) {
-                       $messages_filtered = array();
-                       foreach ( $messages_target as $message ) {
-                               // !== is used because filter can be at the beginning of the string
-                               if ( strpos( $message, $params['filter'] ) !== false ) {
-                                       $messages_filtered[] = $message;
-                               }
-                       }
-                       $messages_target = $messages_filtered;
-               }
-
-               // Whether we have any sort of message customisation filtering
-               $customiseFilterEnabled = $params['customised'] !== 'all';
-               if ( $customiseFilterEnabled ) {
-                       global $wgContLang;
-                       $lang = $langObj->getCode();
-
-                       $customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
-                               array_map( array( $langObj, 'ucfirst'), $messages_target ), $lang, $lang != $wgContLang->getCode() );
-
-                       $customised = $params['customised'] === 'modified';
-               }
-
-               // Get all requested messages and print the result
-               $skip = !is_null( $params['from'] );
-               $useto = !is_null( $params['to'] );
-               $result = $this->getResult();
-               foreach ( $messages_target as $message ) {
-                       // Skip all messages up to $params['from']
-                       if ( $skip && $message === $params['from'] ) {
-                               $skip = false;
-                       }
-
-                       if ( $useto && $message > $params['to'] ) {
-                               break;
-                       }
-
-                       if ( !$skip ) {
-                               $a = array( 'name' => $message );
-                               $args = array();
-                               if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) {
-                                       $args = $params['args'];
-                               }
-
-                               if ( $customiseFilterEnabled ) {
-                                       $messageIsCustomised = isset( $customisedMessages['pages'][ $langObj->ucfirst( $message ) ] );
-                                       if ( $customised === $messageIsCustomised ) {
-                                               if ( $customised ) {
-                                                       $a['customised'] = '';
-                                               }
-                                       } else {
-                                               continue;
-                                       }
-                               }
-
-                               $msg = wfMessage( $message, $args )->inLanguage( $langObj );
-
-                               if ( !$msg->exists() ) {
-                                       $a['missing'] = '';
-                               } else {
-                                       // Check if the parser is enabled:
-                                       if ( $params['enableparser'] ) {
-                                               $msgString = $msg->title( $title )->text();
-                                       } else {
-                                               $msgString = $msg->plain();
-                                       }
-                                       if ( !$params['nocontent'] ) {
-                                               ApiResult::setContent( $a, $msgString );
-                                       }
-                                       if ( isset( $prop['default'] ) ) {
-                                               $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
-                                               if ( !$default->exists() ) {
-                                                       $a['defaultmissing'] = '';
-                                               } elseif ( $default->plain() != $msgString ) {
-                                                       $a['default'] = $default->plain();
-                                               }
-                                       }
-                               }
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $a );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $message );
-                                       break;
-                               }
-                       }
-               }
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' );
-       }
-
-       public function getCacheMode( $params ) {
-               if ( is_null( $params['lang'] ) ) {
-                       // Language not specified, will be fetched from preferences
-                       return 'anon-public-user-private';
-               } elseif ( $params['enableparser'] ) {
-                       // User-specific parser options will be used
-                       return 'anon-public-user-private';
-               } else {
-                       // OK to cache
-                       return 'public';
-               }
-       }
-
-       public function getAllowedParams() {
-               return array(
-                       'messages' => array(
-                               ApiBase::PARAM_DFLT => '*',
-                               ApiBase::PARAM_ISMULTI => true,
-                       ),
-                       'prop' => array(
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'default'
-                               )
-                       ),
-                       'enableparser' => false,
-                       'nocontent' => false,
-                       'includelocal' => false,
-                       'args' => array(
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_ALLOW_DUPLICATES => true,
-                       ),
-                       'filter' => array(),
-                       'customised' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'all',
-                                       'modified',
-                                       'unmodified'
-                               )
-                       ),
-                       'lang' => null,
-                       'from' => null,
-                       'to' => null,
-                       'title' => null,
-                       'prefix' => null,
-               );
-       }
-
-       public function getParamDescription() {
-               return array(
-                       'messages' => 'Which messages to output. "*" (default) means all messages',
-                       'prop' => 'Which properties to get',
-                       'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
-                                                       'Will substitute magic words, handle templates etc.' ),
-                       'nocontent' => 'If set, do not include the content of the messages in the output.',
-                       'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.",
-                                                       "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
-                       ),
-                       'title' => 'Page name to use as context when parsing message (for enableparser option)',
-                       'args' => 'Arguments to be substituted into message',
-                       'prefix' => 'Return messages with this prefix',
-                       'filter' => 'Return only messages with names that contain this string',
-                       'customised' => 'Return only messages in this customisation state',
-                       'lang' => 'Return messages in this language',
-                       'from' => 'Return messages starting at this message',
-                       'to' => 'Return messages ending at this message',
-               );
-       }
-
-       public function getDescription() {
-               return 'Return messages from this site';
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&meta=allmessages&amprefix=ipb-',
-                       'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de',
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
diff --git a/includes/api/ApiQueryAllpages.php b/includes/api/ApiQueryAllpages.php
deleted file mode 100644 (file)
index e003ee9..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Sep 25, 2006
- *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
- *
- * 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
- */
-
-/**
- * Query module to enumerate all available pages.
- *
- * @ingroup API
- */
-class ApiQueryAllpages extends ApiQueryGeneratorBase {
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'ap' );
-       }
-
-       public function execute() {
-               $this->run();
-       }
-
-       public function getCacheMode( $params ) {
-               return 'public';
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       public function executeGenerator( $resultPageSet ) {
-               if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' );
-               }
-
-               $this->run( $resultPageSet );
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       private function run( $resultPageSet = null ) {
-               $db = $this->getDB();
-
-               $params = $this->extractRequestParams();
-
-               // Page filters
-               $this->addTables( 'page' );
-
-               if ( $params['filterredir'] == 'redirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 1 );
-               } elseif ( $params['filterredir'] == 'nonredirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 0 );
-               }
-
-               $this->addWhereFld( 'page_namespace', $params['namespace'] );
-               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
-               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
-               $this->addWhereRange( 'page_title', $dir, $from, $to );
-
-               if ( isset( $params['prefix'] ) ) {
-                       $this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $selectFields = array(
-                               'page_namespace',
-                               'page_title',
-                               'page_id'
-                       );
-               } else {
-                       $selectFields = $resultPageSet->getPageTableFields();
-               }
-
-               $this->addFields( $selectFields );
-               $forceNameTitleIndex = true;
-               if ( isset( $params['minsize'] ) ) {
-                       $this->addWhere( 'page_len>=' . intval( $params['minsize'] ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               if ( isset( $params['maxsize'] ) ) {
-                       $this->addWhere( 'page_len<=' . intval( $params['maxsize'] ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               // Page protection filtering
-               if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
-                       $this->addTables( 'page_restrictions' );
-                       $this->addWhere( 'page_id=pr_page' );
-                       $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
-
-                       if ( count( $params['prtype'] ) ) {
-                               $this->addWhereFld( 'pr_type', $params['prtype'] );
-
-                               if ( isset( $params['prlevel'] ) ) {
-                                       // Remove the empty string and '*' from the prlevel array
-                                       $prlevel = array_diff( $params['prlevel'], array( '', '*' ) );
-
-                                       if ( count( $prlevel ) ) {
-                                               $this->addWhereFld( 'pr_level', $prlevel );
-                                       }
-                               }
-                               if ( $params['prfiltercascade'] == 'cascading' ) {
-                                       $this->addWhereFld( 'pr_cascade', 1 );
-                               } elseif ( $params['prfiltercascade'] == 'noncascading' ) {
-                                       $this->addWhereFld( 'pr_cascade', 0 );
-                               }
-
-                               $this->addOption( 'DISTINCT' );
-                       }
-                       $forceNameTitleIndex = false;
-
-                       if ( $params['prexpiry'] == 'indefinite' ) {
-                               $this->addWhere( "pr_expiry = {$db->addQuotes( $db->getInfinity() )} OR pr_expiry IS NULL" );
-                       } elseif ( $params['prexpiry'] == 'definite' ) {
-                               $this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
-                       }
-
-               } elseif ( isset( $params['prlevel'] ) ) {
-                       $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
-               }
-
-               if ( $params['filterlanglinks'] == 'withoutlanglinks' ) {
-                       $this->addTables( 'langlinks' );
-                       $this->addJoinConds( array( 'langlinks' => array( 'LEFT JOIN', 'page_id=ll_from' ) ) );
-                       $this->addWhere( 'll_from IS NULL' );
-                       $forceNameTitleIndex = false;
-               } elseif ( $params['filterlanglinks'] == 'withlanglinks' ) {
-                       $this->addTables( 'langlinks' );
-                       $this->addWhere( 'page_id=ll_from' );
-                       $this->addOption( 'STRAIGHT_JOIN' );
-                       // We have to GROUP BY all selected fields to stop
-                       // PostgreSQL from whining
-                       $this->addOption( 'GROUP BY', implode( ', ', $selectFields ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               if ( $forceNameTitleIndex ) {
-                       $this->addOption( 'USE INDEX', 'name_title' );
-               }
-
-               $limit = $params['limit'];
-               $this->addOption( 'LIMIT', $limit + 1 );
-               $res = $this->select( __METHOD__ );
-
-               $count = 0;
-               $result = $this->getResult();
-               foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
-                               break;
-                       }
-
-                       if ( is_null( $resultPageSet ) ) {
-                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $vals = array(
-                                       'pageid' => intval( $row->page_id ),
-                                       'ns' => intval( $title->getNamespace() ),
-                                       'title' => $title->getPrefixedText()
-                               );
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
-                                       break;
-                               }
-                       } else {
-                               $resultPageSet->processDbRow( $row );
-                       }
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
-               }
-       }
-
-       public function getAllowedParams() {
-               global $wgRestrictionLevels;
-
-               return array(
-                       'from' => null,
-                       'to' => null,
-                       'prefix' => null,
-                       'namespace' => array(
-                               ApiBase::PARAM_DFLT => 0,
-                               ApiBase::PARAM_TYPE => 'namespace',
-                       ),
-                       'filterredir' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'all',
-                                       'redirects',
-                                       'nonredirects'
-                               )
-                       ),
-                       'minsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'maxsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'prtype' => array(
-                               ApiBase::PARAM_TYPE => Title::getFilteredRestrictionTypes( true ),
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'prlevel' => array(
-                               ApiBase::PARAM_TYPE => $wgRestrictionLevels,
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'prfiltercascade' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'cascading',
-                                       'noncascading',
-                                       'all'
-                               ),
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       ),
-                       'dir' => array(
-                               ApiBase::PARAM_DFLT => 'ascending',
-                               ApiBase::PARAM_TYPE => array(
-                                       'ascending',
-                                       'descending'
-                               )
-                       ),
-                       'filterlanglinks' => array(
-                               ApiBase::PARAM_TYPE => array(
-                                       'withlanglinks',
-                                       'withoutlanglinks',
-                                       'all'
-                               ),
-                               ApiBase::PARAM_DFLT => 'all'
-                       ),
-                       'prexpiry' => array(
-                               ApiBase::PARAM_TYPE => array(
-                                       'indefinite',
-                                       'definite',
-                                       'all'
-                               ),
-                               ApiBase::PARAM_DFLT => 'all'
-                       ),
-               );
-       }
-
-       public function getParamDescription() {
-               $p = $this->getModulePrefix();
-               return array(
-                       'from' => 'The page title to start enumerating from',
-                       'to' => 'The page title to stop enumerating at',
-                       'prefix' => 'Search for all page titles that begin with this value',
-                       'namespace' => 'The namespace to enumerate',
-                       'filterredir' => 'Which pages to list',
-                       'dir' => 'The direction in which to list',
-                       'minsize' => 'Limit to pages with at least this many bytes',
-                       'maxsize' => 'Limit to pages with at most this many bytes',
-                       'prtype' => 'Limit to protected pages only',
-                       'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
-                       'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
-                       'filterlanglinks' => 'Filter based on whether a page has langlinks',
-                       'limit' => 'How many total pages to return.',
-                       'prexpiry' => array(
-                               'Which protection expiry to filter the page on',
-                               ' indefinite - Get only pages with indefinite protection expiry',
-                               ' definite - Get only pages with a definite (specific) protection expiry',
-                               ' all - Get pages with any protections expiry'
-                       ),
-               );
-       }
-
-       public function getDescription() {
-               return 'Enumerate all pages sequentially in a given namespace';
-       }
-
-       public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
-                       array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
-               ) );
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&list=allpages&apfrom=B' => array(
-                               'Simple Use',
-                               'Show a list of pages starting at the letter "B"',
-                       ),
-                       'api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' => array(
-                               'Using as Generator',
-                               'Show info about 4 pages starting at the letter "T"',
-                       ),
-                       'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
-                               'Show content of first 2 non-redirect pages begining at "Re"',
-                       )
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allpages';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
index 381ef55..8903714 100644 (file)
@@ -369,14 +369,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( !is_null( $this->params['continue'] ) ) {
                        $this->parseContinueParam();
                } else {
-                       if ( $this->params['title'] !== '' ) {
-                               $title = Title::newFromText( $this->params['title'] );
-                               if ( !$title ) {
-                                       $this->dieUsageMsg( array( 'invalidtitle', $this->params['title'] ) );
-                               } else {
-                                       $this->rootTitle = $title;
-                               }
-                       }
+                       $this->rootTitle = $this->getTitleOrPageId( $this->params )->getTitle();
                }
 
                // only image titles are allowed for the root in imageinfo mode
@@ -436,7 +429,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $retval = array(
                        'title' => array(
                                ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'pageid' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'continue' => null,
                        'namespace' => array(
@@ -468,7 +463,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 
        public function getParamDescription() {
                $retval = array(
-                       'title' => 'Title to search',
+                       'title' => "Title to search. Cannot be used together with {$this->bl_code}pageid",
+                       'pageid' => "Pageid to search. Cannot be used together with {$this->bl_code}title",
                        'continue' => 'When more results are available, use this to continue',
                        'namespace' => 'The namespace to enumerate',
                );
@@ -499,11 +495,13 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        }
 
        public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'invalidtitle', 'title' ),
-                       array( 'code' => 'bad_image_title', 'info' => "The title for {$this->getModuleName()} query must be an image" ),
-                       array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
-               ) );
+               return array_merge( parent::getPossibleErrors(),
+                       $this->getTitleOrPageIdErrorMessage(),
+                       array(
+                               array( 'code' => 'bad_image_title', 'info' => "The title for {$this->getModuleName()} query must be an image" ),
+                               array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
+                       )
+               );
        }
 
        public function getExamples() {
index 2666045..a633748 100644 (file)
@@ -233,7 +233,7 @@ abstract class ApiQueryBase extends ApiBase {
         */
        protected function addTimestampWhereRange( $field, $dir, $start, $end, $sort = true ) {
                $db = $this->getDb();
-               return $this->addWhereRange( $field, $dir,
+               $this->addWhereRange( $field, $dir,
                        $db->timestampOrNull( $start ), $db->timestampOrNull( $end ), $sort );
        }
 
index 1c1f155..cbda6ab 100644 (file)
@@ -89,12 +89,13 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                $this->dieUsage( "Invalid continue param. You should pass the " .
                                        "original value returned by the previous query", "_badcontinue" );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $clfrom = intval( $cont[0] );
-                       $clto = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $clto = $this->getDB()->addQuotes( $this->titleToKey( $cont[1] ) );
                        $this->addWhere(
-                               "cl_from > $clfrom OR " .
+                               "cl_from $op $clfrom OR " .
                                "(cl_from = $clfrom AND " .
-                               "cl_to >= '$clto')"
+                               "cl_to $op= $clto)"
                        );
                }
 
@@ -123,14 +124,14 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 
                $this->addOption( 'USE INDEX', array( 'categorylinks' => 'cl_from' ) );
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                // Don't order by cl_from if it's constant in the WHERE clause
                if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                       $this->addOption( 'ORDER BY', 'cl_to' . $dir );
+                       $this->addOption( 'ORDER BY', 'cl_to' . $sort );
                } else {
                        $this->addOption( 'ORDER BY', array(
-                                               'cl_from' . $dir,
-                                               'cl_to' . $dir
+                                               'cl_from' . $sort,
+                                               'cl_to' . $sort
                        ));
                }
 
index fb1237f..82c28f4 100644 (file)
@@ -54,22 +54,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        private function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
 
-               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
-               if ( isset( $params['title'] ) ) {
-                       $categoryTitle = Title::newFromText( $params['title'] );
-
-                       if ( is_null( $categoryTitle ) || $categoryTitle->getNamespace() != NS_CATEGORY ) {
-                               $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
-                       }
-               } elseif( isset( $params['pageid'] ) ) {
-                       $categoryTitle = Title::newFromID( $params['pageid'] );
-
-                       if ( !$categoryTitle ) {
-                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
-                       } elseif ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
-                               $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
-                       }
+               $categoryTitle = $this->getTitleOrPageId( $params )->getTitle();
+               if ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
+                       $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
                }
 
                $prop = array_flip( $params['prop'] );
@@ -383,11 +370,10 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(),
-                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       $this->getTitleOrPageIdErrorMessage(),
                        array(
                                array( 'code' => 'invalidcategory', 'info' => 'The category name you entered is not valid' ),
                                array( 'code' => 'badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
-                               array( 'nosuchpageid', 'pageid' ),
                        )
                );
        }
index 397bdc4..c25f561 100644 (file)
@@ -180,7 +180,10 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        if ( $params['unique'] ) {
                                $this->addOption( 'GROUP BY', 'ar_title' );
                        } else {
-                               $this->addOption( 'ORDER BY', 'ar_title, ar_timestamp' );
+                               $this->addOption( 'ORDER BY', array(
+                                       'ar_title',
+                                       'ar_timestamp'
+                               ));
                        }
                } else {
                        if ( $mode == 'revs' ) {
index beca587..6fb3ea3 100644 (file)
@@ -80,17 +80,27 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
-                       $orig = $this->getDB()->strencode( $this->titleTokey( $cont[0] ) );
-                       $dup = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $db = $this->getDB();
+                       $orig = $db->addQuotes( $this->titleTokey( $cont[0] ) );
+                       $dup = $db->addQuotes( $this->titleToKey( $cont[1] ) );
                        $this->addWhere(
-                               "i1.img_name > '$orig' OR " .
-                               "(i1.img_name = '$orig' AND " .
-                               "i2.img_name >= '$dup')"
+                               "i1.img_name $op $orig OR " .
+                               "(i1.img_name = $orig AND " .
+                               "i2.img_name $op= $dup)"
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-               $this->addOption( 'ORDER BY', 'i1.img_name' . $dir );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               // Don't order by i1.img_name if it's constant in the WHERE clause
+               if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
+                       $this->addOption( 'ORDER BY', 'i2.img_name' . $sort );
+               } else {
+                       $this->addOption( 'ORDER BY', array(
+                                       'i1.img_name' . $sort,
+                                       'i2.img_name' . $sort
+                       ));
+               }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
                $res = $this->select( __METHOD__ );
index be995f3..4d99055 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright © 2010 Sam Reed
  * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
- * based on ApiQueryAllpages.php
+ * based on ApiQueryAllPages.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
@@ -56,6 +56,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $fld_dimensions = isset( $prop['dimensions'] );
                $fld_description = isset( $prop['description'] ) || isset( $prop['parseddescription'] );
                $fld_mime = isset( $prop['mime'] );
+               $fld_mediatype = isset( $prop['mediatype'] );
                $fld_metadata = isset( $prop['metadata'] );
                $fld_bitdepth = isset( $prop['bitdepth'] );
 
@@ -68,6 +69,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $this->addFieldsIf( array( 'fa_height', 'fa_width', 'fa_size' ), $fld_dimensions || $fld_size );
                $this->addFieldsIf( 'fa_description', $fld_description );
                $this->addFieldsIf( array( 'fa_major_mime', 'fa_minor_mime' ), $fld_mime );
+               $this->addFieldsIf( 'fa_media_type', $fld_mediatype );
                $this->addFieldsIf( 'fa_metadata', $fld_metadata );
                $this->addFieldsIf( 'fa_bits', $fld_bitdepth );
 
@@ -117,8 +119,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
 
                $limit = $params['limit'];
                $this->addOption( 'LIMIT', $limit + 1 );
-               $this->addOption( 'ORDER BY', 'fa_name' .
-                                               ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', 'fa_name' . $sort );
 
                $res = $this->select( __METHOD__ );
 
@@ -165,6 +167,9 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                                $row->fa_description, $title );
                                }
                        }
+                       if ( $fld_mediatype ) {
+                               $file['mediatype'] = $row->fa_media_type;
+                       }
                        if ( $fld_metadata ) {
                                $file['metadata'] = $row->fa_metadata
                                                ? ApiQueryImageInfo::processMetaData( unserialize( $row->fa_metadata ), $result )
@@ -235,6 +240,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                        'description',
                                        'parseddescription',
                                        'mime',
+                                       'mediatype',
                                        'metadata',
                                        'bitdepth'
                                ),
@@ -261,9 +267,10 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                ' description       - Adds description the image version',
                                ' parseddescription - Parse the description on the version',
                                ' mime              - Adds MIME of the image',
+                               ' mediatype         - Adds the media type of the image',
                                ' metadata          - Lists EXIF metadata for the version of the image',
                                ' bitdepth          - Adds the bit depth of the version',
-            ),
+                       ),
                );
        }
 
index feda177..8ebe3ec 100644 (file)
@@ -89,10 +89,17 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                                $this->addWhereFld( 'iwl_title', $params['title'] );
                                $this->addOption( 'ORDER BY', 'iwl_from' );
                        } else {
-                               $this->addOption( 'ORDER BY', 'iwl_title, iwl_from' );
+                               $this->addOption( 'ORDER BY', array(
+                                       'iwl_title',
+                                       'iwl_from'
+                               ));
                        }
                } else {
-                       $this->addOption( 'ORDER BY', 'iwl_prefix, iwl_title, iwl_from' );
+                       $this->addOption( 'ORDER BY', array(
+                               'iwl_prefix',
+                               'iwl_title',
+                               'iwl_from'
+                       ));
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -205,7 +212,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
        public function getExamples() {
                return array(
                        'api.php?action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks',
-                       'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&iwblprefix=wikibooks&prop=info'
+                       'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
                );
        }
 
index 13256ad..f39835a 100644 (file)
@@ -62,38 +62,40 @@ class ApiQueryIWLinks extends ApiQueryBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $db = $this->getDB();
                        $iwlfrom = intval( $cont[0] );
-                       $iwlprefix = $this->getDB()->strencode( $cont[1] );
-                       $iwltitle = $this->getDB()->strencode( $this->titleToKey( $cont[2] ) );
+                       $iwlprefix = $db->addQuotes( $cont[1] );
+                       $iwltitle = $db->addQuotes( $this->titleToKey( $cont[2] ) );
                        $this->addWhere(
-                               "iwl_from > $iwlfrom OR " .
+                               "iwl_from $op $iwlfrom OR " .
                                "(iwl_from = $iwlfrom AND " .
-                               "(iwl_prefix > '$iwlprefix' OR " .
-                               "(iwl_prefix = '$iwlprefix' AND " .
-                               "iwl_title >= '$iwltitle')))"
+                               "(iwl_prefix $op $iwlprefix OR " .
+                               "(iwl_prefix = $iwlprefix AND " .
+                               "iwl_title $op= $iwltitle)))"
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                if ( isset( $params['prefix'] ) ) {
                        $this->addWhereFld( 'iwl_prefix', $params['prefix'] );
                        if ( isset( $params['title'] ) ) {
                                $this->addWhereFld( 'iwl_title', $params['title'] );
-                               $this->addOption( 'ORDER BY', 'iwl_from' . $dir );
+                               $this->addOption( 'ORDER BY', 'iwl_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                               'iwl_title' . $dir,
-                                               'iwl_from' . $dir
+                                               'iwl_title' . $sort,
+                                               'iwl_from' . $sort
                                ));
                        }
                } else {
                        // Don't order by iwl_from if it's constant in the WHERE clause
                        if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                               $this->addOption( 'ORDER BY', 'iwl_prefix' . $dir );
+                               $this->addOption( 'ORDER BY', 'iwl_prefix' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array (
-                                               'iwl_from' . $dir,
-                                               'iwl_prefix' . $dir
+                                               'iwl_from' . $sort,
+                                               'iwl_prefix' . $sort
                                ));
                        }
                }
index 03a2482..135979a 100644 (file)
@@ -430,7 +430,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @param $img File
         * @return string
         */
-       private function getContinueStr( $img ) {
+       protected function getContinueStr( $img ) {
                return $img->getOriginalTitle()->getText() .
                        '|' .  $img->getTimestamp();
        }
index f03b287..6f488cd 100644 (file)
@@ -65,23 +65,24 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $ilfrom = intval( $cont[0] );
-                       $ilto = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $ilto = $this->getDB()->addQuotes( $this->titleToKey( $cont[1] ) );
                        $this->addWhere(
-                               "il_from > $ilfrom OR " .
+                               "il_from $op $ilfrom OR " .
                                "(il_from = $ilfrom AND " .
-                               "il_to >= '$ilto')"
+                               "il_to $op= $ilto)"
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                // Don't order by il_from if it's constant in the WHERE clause
                if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                       $this->addOption( 'ORDER BY', 'il_to' . $dir );
+                       $this->addOption( 'ORDER BY', 'il_to' . $sort );
                } else {
                        $this->addOption( 'ORDER BY', array(
-                                               'il_from' . $dir,
-                                               'il_to' . $dir
+                                               'il_from' . $sort,
+                                               'il_to' . $sort
                        ));
                }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
index d28642a..e5db4d8 100644 (file)
@@ -228,6 +228,21 @@ class ApiQueryInfo extends ApiQueryBase {
                return $cachedWatchToken;
        }
 
+       public static function getOptionsToken( $pageid, $title ) {
+               global $wgUser;
+               if ( !$wgUser->isLoggedIn() ) {
+                       return false;
+               }
+
+               static $cachedOptionsToken = null;
+               if ( !is_null( $cachedOptionsToken ) ) {
+                       return $cachedOptionsToken;
+               }
+
+               $cachedOptionsToken = $wgUser->getEditToken();
+               return $cachedOptionsToken;
+       }
+
        public function execute() {
                $this->params = $this->extractRequestParams();
                if ( !is_null( $this->params['prop'] ) ) {
index 1573494..4233560 100644 (file)
@@ -89,10 +89,17 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                                $this->addWhereFld( 'll_title', $params['title'] );
                                $this->addOption( 'ORDER BY', 'll_from' );
                        } else {
-                               $this->addOption( 'ORDER BY', 'll_title, ll_from' );
+                               $this->addOption( 'ORDER BY', array(
+                                       'll_title',
+                                       'll_from'
+                               ));
                        }
                } else {
-                       $this->addOption( 'ORDER BY', 'll_lang, ll_title, ll_from' );
+                       $this->addOption( 'ORDER BY', array(
+                               'll_lang',
+                               'll_title',
+                               'll_from'
+                       ));
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -205,7 +212,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
        public function getExamples() {
                return array(
                        'api.php?action=query&list=langbacklinks&lbltitle=Test&lbllang=fr',
-                       'api.php?action=query&generator=langbacklinks&glbltitle=Test&lbllang=fr&prop=info'
+                       'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info'
                );
        }
 
index fdba846..b6f9a99 100644 (file)
@@ -60,35 +60,36 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $llfrom = intval( $cont[0] );
-                       $lllang = $this->getDB()->strencode( $cont[1] );
+                       $lllang = $this->getDB()->addQuotes( $cont[1] );
                        $this->addWhere(
-                               "ll_from > $llfrom OR " .
+                               "ll_from $op $llfrom OR " .
                                "(ll_from = $llfrom AND " .
-                               "ll_lang >= '$lllang')"
+                               "ll_lang $op= $lllang)"
                        );
                }
 
-           $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-           if ( isset( $params['lang'] ) ) {
+                       $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+                       if ( isset( $params['lang'] ) ) {
                        $this->addWhereFld( 'll_lang', $params['lang'] );
                        if ( isset( $params['title'] ) ) {
                                $this->addWhereFld( 'll_title', $params['title'] );
-                               $this->addOption( 'ORDER BY', 'll_from' . $dir );
+                               $this->addOption( 'ORDER BY', 'll_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                                       'll_title' . $dir,
-                                                       'll_from' . $dir
+                                                       'll_title' . $sort,
+                                                       'll_from' . $sort
                                ));
                        }
                } else {
                        // Don't order by ll_from if it's constant in the WHERE clause
                        if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                               $this->addOption( 'ORDER BY', 'll_lang' . $dir );
+                               $this->addOption( 'ORDER BY', 'll_lang' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                                       'll_from' . $dir,
-                                                       'll_lang' . $dir
+                                                       'll_from' . $sort,
+                                                       'll_lang' . $sort
                                ));
                        }
                }
index 0377edd..4dea419 100644 (file)
@@ -116,19 +116,20 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $plfrom = intval( $cont[0] );
                        $plns = intval( $cont[1] );
-                       $pltitle = $this->getDB()->strencode( $this->titleToKey( $cont[2] ) );
+                       $pltitle = $this->getDB()->addQuotes( $this->titleToKey( $cont[2] ) );
                        $this->addWhere(
-                               "{$this->prefix}_from > $plfrom OR " .
+                               "{$this->prefix}_from $op $plfrom OR " .
                                "({$this->prefix}_from = $plfrom AND " .
-                               "({$this->prefix}_namespace > $plns OR " .
+                               "({$this->prefix}_namespace $op $plns OR " .
                                "({$this->prefix}_namespace = $plns AND " .
-                               "{$this->prefix}_title >= '$pltitle')))"
+                               "{$this->prefix}_title $op= $pltitle)))"
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                // Here's some MySQL craziness going on: if you use WHERE foo='bar'
                // and later ORDER BY foo MySQL doesn't notice the ORDER BY is pointless
                // but instead goes and filesorts, because the index for foo was used
@@ -136,13 +137,13 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                // clause from the ORDER BY clause
                $order = array();
                if ( count( $this->getPageSet()->getGoodTitles() ) != 1 ) {
-                       $order[] = $this->prefix . '_from' . $dir;
+                       $order[] = $this->prefix . '_from' . $sort;
                }
                if ( count( $params['namespace'] ) != 1 ) {
-                       $order[] = $this->prefix . '_namespace' . $dir;
+                       $order[] = $this->prefix . '_namespace' . $sort;
                }
 
-               $order[] = $this->prefix . "_title" . $dir;
+               $order[] = $this->prefix . '_title' . $sort;
                $this->addOption( 'ORDER BY', $order );
                $this->addOption( 'USE INDEX', $this->prefix . '_from' );
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
index fa58bdf..7390546 100644 (file)
@@ -327,7 +327,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        "rev_id >= '$revid')"
                                );
                        }
-                       $this->addOption( 'ORDER BY', 'rev_page, rev_id' );
+                       $this->addOption( 'ORDER BY', array(
+                               'rev_page',
+                               'rev_id'
+                       ));
 
                        // assumption testing -- we should never get more then $pageCount rows.
                        $limit = $pageCount;
index e11d110..fc5d7bb 100644 (file)
@@ -142,6 +142,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['fallback'] = $fallbacks;
                $this->getResult()->setIndexedTagName( $data['fallback'], 'lang' );
 
+               if( $wgContLang->hasVariants() ) {
+                       $variants = array();
+                       foreach( $wgContLang->getVariants() as $code ) {
+                               $variants[] = array( 'code' => $code );
+                       }
+                       $data['variants'] = $variants;
+                       $this->getResult()->setIndexedTagName( $data['variants'], 'lang' );
+               }
+
                if ( $wgContLang->isRTL() ) {
                        $data['rtl'] = '';
                }
@@ -206,6 +215,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        if ( MWNamespace::isContent( $ns ) ) {
                                $data[$ns]['content'] = '';
                        }
+
+                       if ( MWNamespace::isNonincludableNamespace( $ns ) ) {
+                               $data[$ns]['nonincludable'] = '';
+                       }
                }
 
                $this->getResult()->setIndexedTagName( $data, 'ns' );
index 8e2f20d..1654382 100644 (file)
@@ -185,7 +185,7 @@ class ApiQueryContributions extends ApiQueryBase {
                if ( !is_null( $show ) ) {
                        $show = array_flip( $show );
                        if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
-                                       || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) ) ) {
+                                       || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) ) ) {
                                $this->dieUsageMsg( 'show' );
                        }
 
index a0ee227..cbb35ae 100644 (file)
@@ -50,7 +50,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        protected function getCurrentUserInfo() {
-               global $wgRequest, $wgHiddenPrefs;
+               global $wgHiddenPrefs;
                $user = $this->getUser();
                $result = $this->getResult();
                $vals = array();
@@ -136,7 +136,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                }
 
                if ( isset( $this->prop['acceptlang'] ) ) {
-                       $langs = $wgRequest->getAcceptLang();
+                       $langs = $this->getRequest()->getAcceptLang();
                        $acceptLang = array();
                        foreach ( $langs as $lang => $val ) {
                                $r = array( 'q' => $val );
index 31624bd..38244ff 100644 (file)
@@ -61,10 +61,10 @@ class ApiQueryUsers extends ApiQueryBase {
                return $this->tokenFunctions;
        }
 
-        /**
-         * @param $user User
-         * @return String
-         */
+       /**
+        * @param $user User
+        * @return String
+        */
        public static function getUserrightsToken( $user ) {
                global $wgUser;
                // Since the permissions check for userrights is non-trivial,
index 4adadf1..ce4ce50 100644 (file)
@@ -90,7 +90,10 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                if ( count( $params['namespace'] ) == 1 ) {
                        $this->addOption( 'ORDER BY', 'wl_title' . $sort );
                } else {
-                       $this->addOption( 'ORDER BY', 'wl_namespace' . $sort . ', wl_title' . $sort );
+                       $this->addOption( 'ORDER BY', array(
+                               'wl_namespace' . $sort,
+                               'wl_title' . $sort
+                       ));
                }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
                $res = $this->select( __METHOD__ );
index 7964095..c56d646 100644 (file)
@@ -35,19 +35,16 @@ class ApiTokens extends ApiBase {
        }
 
        public function execute() {
+               wfProfileIn( __METHOD__ );
                $params = $this->extractRequestParams();
                $res = array();
 
+               $types = $this->getTokenTypes();
                foreach ( $params['type'] as $type ) {
                        $type = strtolower( $type );
-                       $func = 'get' .
-                                       ucfirst( $type ) .
-                                       'Token';
-                       if ( $type === 'patrol' ) {
-                               $val = call_user_func( array( 'ApiQueryRecentChanges', $func ), null, null );
-                       } else {
-                               $val = call_user_func( array( 'ApiQueryInfo', $func ), null, null );
-                       }
+
+                       $val = call_user_func( $types[$type], null, null );
+
                        if ( $val === false ) {
                                $this->setWarning( "Action '$type' is not allowed for the current user" );
                        } else {
@@ -56,6 +53,25 @@ class ApiTokens extends ApiBase {
                }
 
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
+               wfProfileOut( __METHOD__ );
+       }
+
+       private function getTokenTypes() {
+               static $types = null;
+               if ( $types ) {
+                       return $types;
+               }
+               wfProfileIn( __METHOD__ );
+               $types = array( 'patrol' => 'ApiQueryRecentChanges::getPatrolToken' );
+               $names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
+                       'email', 'import', 'watch', 'options' );
+               foreach ( $names as $name ) {
+                       $types[$name] = 'ApiQueryInfo::get' . ucfirst( $name ) . 'Token';
+               }
+               wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
+               ksort( $types );
+               wfProfileOut( __METHOD__ );
+               return $types;
        }
 
        public function getAllowedParams() {
@@ -63,11 +79,8 @@ class ApiTokens extends ApiBase {
                        'type' => array(
                                ApiBase::PARAM_DFLT => 'edit',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'edit', 'delete', 'protect', 'move', 'block', 'unblock',
-                                       'email', 'import', 'watch', 'patrol'
-                               )
-                       )
+                               ApiBase::PARAM_TYPE => array_keys( $this->getTokenTypes() ),
+                       ),
                );
        }
 
index e599e32..32e0d88 100644 (file)
@@ -98,7 +98,10 @@ class ApiUnblock extends ApiBase {
                        ),
                        'user' => null,
                        'token' => null,
-                       'gettoken' => false,
+                       'gettoken' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                        'reason' => null,
                );
        }
@@ -108,7 +111,7 @@ class ApiUnblock extends ApiBase {
                return array(
                        'id' => "ID of the block you want to unblock (obtained through list=blocks). Cannot be used together with {$p}user",
                        'user' => "Username, IP address or IP range you want to unblock. Cannot be used together with {$p}id",
-                       'token' => "An unblock token previously obtained through the gettoken parameter or {$p}prop=info",
+                       'token' => "An unblock token previously obtained through prop=info",
                        'gettoken' => 'If set, an unblock token will be returned, and no other action will be taken',
                        'reason' => 'Reason for unblock (optional)',
                );
index d342997..856e2ac 100644 (file)
@@ -76,7 +76,7 @@ class ApiUndelete extends ApiBase {
                $info['title'] = $titleObj->getPrefixedText();
                $info['revisions'] = intval( $retval[0] );
                $info['fileversions'] = intval( $retval[1] );
-               $info['reason'] = intval( $retval[2] );
+               $info['reason'] = $retval[2];
                $this->getResult()->addValue( null, $this->getModuleName(), $info );
        }
 
index 5040c70..e58a1ca 100644 (file)
@@ -173,7 +173,7 @@ class ApiUpload extends ApiBase {
         */
        private function getChunkResult(){
                $result = array();
-               
+
                $result['result'] = 'Continue';
                $request = $this->getMain()->getRequest();
                $chunkPath = $request->getFileTempname( 'chunk' );
@@ -185,7 +185,7 @@ class ApiUpload extends ApiBase {
                                                                                $this->mParams['offset']);
                        if ( !$status->isGood() ) {
                                $this->dieUsage( $status->getWikiText(), 'stashfailed' );
-                               return ;
+                               return array();
                        }
 
                        // Check we added the last chunk: 
@@ -194,7 +194,7 @@ class ApiUpload extends ApiBase {
 
                                if ( !$status->isGood() ) {
                                        $this->dieUsage( $status->getWikiText(), 'stashfailed' );
-                                       return ;
+                                       return array();
                                }
 
                                // We have a new filekey for the fully concatenated file.
index 0df0cd8..a3c2b52 100644 (file)
@@ -1,11 +1,32 @@
 <?php
+/**
+ * Data caching with dependencies.
+ *
+ * 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
+ * @ingroup Cache
+ */
+
 /**
  * This class stores an arbitrary value along with its dependencies.
  * Users should typically only use DependencyWrapper::getValueFromCache(),
  * rather than instantiating one of these objects directly.
  * @ingroup Cache
  */
-
 class DependencyWrapper {
        var $value;
        var $deps;
index 26602f4..c0c5609 100644 (file)
@@ -1,9 +1,31 @@
 <?php
 /**
- * Contain the FileCacheBase class
+ * Data storage in the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Cache
  */
+
+/**
+ * Base class for data storage in the file system.
+ *
+ * @ingroup Cache
+ */
 abstract class FileCacheBase {
        protected $mKey;
        protected $mType = 'object';
index 2cc1061..6a9ecd2 100644 (file)
@@ -1,8 +1,30 @@
 <?php
-
 /**
  * Caches user genders when needed to use correct namespace aliases.
+ *
+ * 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
  * @author Niklas Laxström
+ * @ingroup Cache
+ */
+
+/**
+ * Caches user genders when needed to use correct namespace aliases.
+ *
  * @since 1.18
  */
 class GenderCache {
@@ -48,7 +70,7 @@ class GenderCache {
                        $username = $username->getName();
                }
 
-               $username = strtr( $username, '_', ' ' );
+               $username = self::normalizeUsername( $username );
                if ( !isset( $this->cache[$username] ) ) {
 
                        if ( $this->misses >= $this->missLimit && $wgUser->getName() !== $username ) {
@@ -60,11 +82,7 @@ class GenderCache {
 
                        } else {
                                $this->misses++;
-                               if ( !User::isValidUserName( $username ) ) {
-                                       $this->cache[$username] = $this->getDefault();
-                               } else {
-                                       $this->doQuery( $username, $caller );
-                               }
+                               $this->doQuery( $username, $caller );
                        }
 
                }
@@ -86,7 +104,6 @@ class GenderCache {
                foreach ( $data as $ns => $pagenames ) {
                        if ( !MWNamespace::hasGenderDistinction( $ns ) ) continue;
                        foreach ( array_keys( $pagenames ) as $username ) {
-                               if ( isset( $this->cache[$username] ) ) continue;
                                $users[$username] = true;
                        }
                }
@@ -102,26 +119,28 @@ class GenderCache {
        public function doQuery( $users, $caller = '' ) {
                $default = $this->getDefault();
 
-               foreach ( (array) $users as $index => $value ) {
-                       $name = strtr( $value, '_', ' ' );
-                       if ( isset( $this->cache[$name] ) ) {
-                               // Skip users whose gender setting we already know
-                               unset( $users[$index] );
-                       } else {
-                               $users[$index] = $name;
+               $usersToCheck = array();
+               foreach ( (array) $users as $value ) {
+                       $name = self::normalizeUsername( $value );
+                       // Skip users whose gender setting we already know
+                       if ( !isset( $this->cache[$name] ) ) {
                                // For existing users, this value will be overwritten by the correct value
                                $this->cache[$name] = $default;
+                               // query only for valid names, which can be in the database
+                               if( User::isValidUserName( $name ) ) {
+                                       $usersToCheck[] = $name;
+                               }
                        }
                }
 
-               if ( count( $users ) === 0 ) {
+               if ( count( $usersToCheck ) === 0 ) {
                        return;
                }
 
                $dbr = wfGetDB( DB_SLAVE );
                $table = array( 'user', 'user_properties' );
                $fields = array( 'user_name', 'up_value' );
-               $conds = array( 'user_name' => $users );
+               $conds = array( 'user_name' => $usersToCheck );
                $joins = array( 'user_properties' =>
                        array( 'LEFT JOIN', array( 'user_id = up_user', 'up_property' => 'gender' ) ) );
 
@@ -129,11 +148,20 @@ class GenderCache {
                if ( strval( $caller ) !== '' ) {
                        $comment .= "/$caller";
                }
-               $res = $dbr->select( $table, $fields, $conds, $comment, $joins, $joins );
+               $res = $dbr->select( $table, $fields, $conds, $comment, array(), $joins );
 
                foreach ( $res as $row ) {
                        $this->cache[$row->user_name] = $row->up_value ? $row->up_value : $default;
                }
        }
 
+       private static function normalizeUsername( $username ) {
+               // Strip off subpages
+               $indexSlash = strpos( $username, '/' );
+               if ( $indexSlash !== false ) {
+                       $username = substr( $username, 0, $indexSlash );
+               }
+               // normalize underscore/spaces
+               return strtr( $username, '_', ' ' );
+       }
 }
index 11e2ae7..0a3c002 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * HTML cache invalidation of all pages linking to a given title.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * Class to invalidate the HTML cache of all the pages linking to a given title.
index 256df57..f9ea135 100644 (file)
@@ -1,9 +1,33 @@
 <?php
 /**
- * Contain the HTMLFileCache class
+ * Page view caching in the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Cache
  */
+
+/**
+ * Page view caching in the file system.
+ * The only cacheable actions are "view" and "history". Also special pages
+ * will not be cached.
+ *
+ * @ingroup Cache
+ */
 class HTMLFileCache extends FileCacheBase {
        /**
         * Construct an ObjectFileCache from a Title and an action
index 29fde03..372f983 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Batch query to determine page existence.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * Class representing a list of titles
@@ -195,7 +216,7 @@ class LinkBatch {
                }
 
                $genderCache = GenderCache::singleton();
-               $genderCache->dolinkBatch( $this->data, $this->caller );
+               $genderCache->doLinkBatch( $this->data, $this->caller );
                return true;
        }
 
index a73eaaa..f759c02 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Page existence cache.
+ *
+ * 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
+ * @ingroup Cache
+ */
+
 /**
  * Cache for article titles (prefixed DB keys) and ids linked from one source
  *
index 3673359..fe43635 100644 (file)
@@ -1,11 +1,28 @@
 <?php
 /**
+ * Session storage in object cache.
+ *
  * This file gets included if $wgSessionsInMemcache is set in the config.
  * It redirects session handling functions to store their data in memcached
  * instead of the local filesystem. Depending on circumstances, it may also
  * be necessary to change the cookie settings to work across hostnames.
  * See: http://www.php.net/manual/en/function.session-set-save-handler.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
  * @ingroup Cache
  */
index d1e658b..91de65f 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Localisation messages cache.
+ *
+ * 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
  * @ingroup Cache
  */
index 3356f1f..ed1e49a 100644 (file)
@@ -1,9 +1,31 @@
 <?php
 /**
- * Contain the ObjectFileCache class
+ * Object cache in the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Cache
  */
+
+/**
+ * Object cache in the file system.
+ *
+ * @ingroup Cache
+ */
 class ObjectFileCache extends FileCacheBase {
        /**
         * Construct an ObjectFileCache from a key and a type
index e73fc2d..61f1e8c 100644 (file)
@@ -1,9 +1,31 @@
 <?php
 /**
- * Contain the ResourceFileCache class
+ * Resource loader request result caching in the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Cache
  */
+
+/**
+ * Resource loader request result caching in the file system.
+ *
+ * @ingroup Cache
+ */
 class ResourceFileCache extends FileCacheBase {
        protected $mCacheWorthy;
 
index e560e0e..e8e57cd 100644 (file)
@@ -1,6 +1,22 @@
 <?php
 /**
- * See deferred.txt
+ * Squid cache purging.
+ *
+ * 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
  * @ingroup Cache
  */
index bd0895c..4e43642 100644 (file)
@@ -20,6 +20,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Database
  */
 
index 5c03617..6eb51af 100644 (file)
@@ -2,10 +2,26 @@
 /**
  * @defgroup Database Database
  *
+ * This file deals with database interface functions
+ * and query specifics/optimisations.
+ *
+ * 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
  * @ingroup Database
- * This file deals with database interface functions
- * and query specifics/optimisations
  */
 
 /** Number of times to re-try an operation in case of deadlock */
@@ -782,7 +798,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return bool
         */
        function isWriteQuery( $sql ) {
-               return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|\(SELECT)\b/i', $sql );
+               return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|EXPLAIN|\(SELECT)\b/i', $sql );
        }
 
        /**
@@ -1459,6 +1475,7 @@ abstract class DatabaseBase implements DatabaseType {
        function selectRow( $table, $vars, $conds, $fname = 'DatabaseBase::selectRow',
                $options = array(), $join_conds = array() )
        {
+               $options = (array)$options;
                $options['LIMIT'] = 1;
                $res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds );
 
index 836d781..6aed05c 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * This file contains database error classes.
+ *
+ * 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
+ * @ingroup Database
+ */
 
 /**
  * Database error base class
index c9c311d..5df6456 100644 (file)
@@ -2,7 +2,22 @@
 /**
  * This is the IBM DB2 database abstraction layer.
  * See maintenance/ibm_db2/README for development notes
- * and other specific information
+ * and other specific information.
+ *
+ * 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
  * @ingroup Database
index 61963b6..7a75e1e 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This is the MS SQL Server Native database abstraction layer.
  *
+ * 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
  * @ingroup Database
  * @author Joel Penner <a-joelpe at microsoft dot com>
index 4fce0a5..c334c38 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This is the MySQL database abstraction layer.
  *
+ * 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
  * @ingroup Database
  */
index 58cb28b..8ce6e70 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This is the Oracle database abstraction layer.
  *
+ * 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
  * @ingroup Database
  */
index fc9c65a..d058769 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This is the Postgres database abstraction layer.
  *
+ * 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
  * @ingroup Database
  */
@@ -559,7 +574,7 @@ class DatabasePostgres extends DatabaseBase {
                                i.indoption[s.g] as option,
                                pg_am.amname
                        FROM
-                               (SELECT generate_subscripts(isub.indkey, 1) AS g
+                               (SELECT generate_series(array_lower(isub.indkey,1), array_upper(isub.indkey,1)) AS g
                                        FROM
                                                pg_index isub
                                        JOIN pg_class cis
index dc086b4..15d1ad0 100644 (file)
@@ -3,6 +3,21 @@
  * This is the SQLite database abstraction layer.
  * See maintenance/sqlite/README for development notes and other specific information
  *
+ * 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
  * @ingroup Database
  */
index 0ea713c..eacebcf 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * This file contains database-related utiliy classes.
+ *
+ * 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
+ * @ingroup Database
+ */
+
 /**
  * Utility class.
  * @ingroup Database
index dec6ae1..aaca12c 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Generator of database load balancing objects
+ * Generator of database load balancing objects.
+ *
+ * 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
  * @ingroup Database
index b7977a2..6008813 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Advanced generator of database load balancing objects for wiki farms
+ * Advanced generator of database load balancing objects for wiki farms.
+ *
+ * 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
  * @ingroup Database
index f80aa4b..4b165b2 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Simple generator of database connections that always returns the same object.
+ *
+ * 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
+ * @ingroup Database
+ */
 
 /**
  * An LBFactory class that always returns a single database object.
index db348e8..c40ac0c 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Database load balancing
+ * Database load balancing.
+ *
+ * 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
  * @ingroup Database
index 16a0343..146ac61 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Database load monitoring
+ * Database load monitoring.
+ *
+ * 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
  * @ingroup Database
diff --git a/includes/db/ORMResult.php b/includes/db/ORMResult.php
new file mode 100644 (file)
index 0000000..31e0c19
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Result of a ORMTable::select, which returns ORMRow objects.
+ *
+ * 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
+ *
+ * @since 1.20
+ *
+ * @file ORMResult.php
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+class ORMResult implements Iterator {
+
+       /**
+        * @var ResultWrapper
+        */
+       protected $res;
+
+       /**
+        * @var integer
+        */
+       protected  $key;
+
+       /**
+        * @var ORMRow
+        */
+       protected $current;
+
+       /**
+        * @var ORMTable
+        */
+       protected $table;
+
+       /**
+        * @param ORMTable $table
+        * @param ResultWrapper $res
+        */
+       public function __construct( ORMTable $table, ResultWrapper $res ) {
+               $this->table = $table;
+               $this->res = $res;
+               $this->key = 0;
+               $this->setCurrent( $this->res->current() );
+       }
+
+       /**
+        * @param $row
+        */
+       protected function setCurrent( $row ) {
+               if ( $row === false ) {
+                       $this->current = false;
+               } else {
+                       $this->current = $this->table->newFromDBResult( $row );
+               }
+       }
+
+       /**
+        * @return integer
+        */
+       public function count() {
+               return $this->res->numRows();
+       }
+
+       /**
+        * @return boolean
+        */
+       public function isEmpty() {
+               return $this->res->numRows() === 0;
+       }
+
+       /**
+        * @return ORMRow
+        */
+       public function current() {
+               return $this->current;
+       }
+
+       /**
+        * @return integer
+        */
+       public function key() {
+               return $this->key;
+       }
+
+       public function next() {
+               $row = $this->res->next();
+               $this->setCurrent( $row );
+               $this->key++;
+       }
+
+       public function rewind() {
+               $this->res->rewind();
+               $this->key = 0;
+               $this->setCurrent( $this->res->current() );
+       }
+
+       /**
+        * @return boolean
+        */
+       public function valid() {
+               return $this->current !== false;
+       }
+
+}
diff --git a/includes/db/ORMRow.php b/includes/db/ORMRow.php
new file mode 100644 (file)
index 0000000..d3a97db
--- /dev/null
@@ -0,0 +1,676 @@
+<?php
+/**
+ * Abstract base class for representing objects that are stored in some DB table.
+ * This is basically an ORM-like wrapper around rows in database tables that
+ * aims to be both simple and very flexible. It is centered around an associative
+ * array of fields and various methods to do common interaction with the database.
+ *
+ * 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
+ *
+ * These methods are likely candidates for overriding:
+ * * getDefaults
+ * * remove
+ * * insert
+ * * saveExisting
+ * * loadSummaryFields
+ * * getSummaryFields
+ *
+ * Main instance methods:
+ * * getField(s)
+ * * setField(s)
+ * * save
+ * * remove
+ *
+ * Main static methods:
+ * * select
+ * * update
+ * * delete
+ * * count
+ * * has
+ * * selectRow
+ * * selectFields
+ * * selectFieldsRow
+ *
+ * @since 1.20
+ *
+ * @file ORMRow.php
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+abstract class ORMRow {
+
+       /**
+        * The fields of the object.
+        * field name (w/o prefix) => value
+        *
+        * @since 1.20
+        * @var array
+        */
+       protected $fields = array( 'id' => null );
+
+       /**
+        * @since 1.20
+        * @var ORMTable
+        */
+       protected $table;
+
+       /**
+        * If the object should update summaries of linked items when changed.
+        * For example, update the course_count field in universities when a course in courses is deleted.
+        * Settings this to false can prevent needless updating work in situations
+        * such as deleting a university, which will then delete all it's courses.
+        *
+        * @since 1.20
+        * @var bool
+        */
+       protected $updateSummaries = true;
+
+       /**
+        * Indicates if the object is in summary mode.
+        * This mode indicates that only summary fields got updated,
+        * which allows for optimizations.
+        *
+        * @since 1.20
+        * @var bool
+        */
+       protected $inSummaryMode = false;
+
+       /**
+        * Constructor.
+        *
+        * @since 1.20
+        *
+        * @param ORMTable $table
+        * @param array|null $fields
+        * @param boolean $loadDefaults
+        */
+       public function __construct( ORMTable $table, $fields = null, $loadDefaults = false ) {
+               $this->table = $table;
+
+               if ( !is_array( $fields ) ) {
+                       $fields = array();
+               }
+
+               if ( $loadDefaults ) {
+                       $fields = array_merge( $this->table->getDefaults(), $fields );
+               }
+
+               $this->setFields( $fields );
+       }
+
+       /**
+        * Load the specified fields from the database.
+        *
+        * @since 1.20
+        *
+        * @param array|null $fields
+        * @param boolean $override
+        * @param boolean $skipLoaded
+        *
+        * @return bool Success indicator
+        */
+       public function loadFields( $fields = null, $override = true, $skipLoaded = false ) {
+               if ( is_null( $this->getId() ) ) {
+                       return false;
+               }
+
+               if ( is_null( $fields ) ) {
+                       $fields = array_keys( $this->table->getFields() );
+               }
+
+               if ( $skipLoaded ) {
+                       $fields = array_diff( $fields, array_keys( $this->fields ) );
+               }
+
+               if ( !empty( $fields ) ) {
+                       $result = $this->table->rawSelectRow(
+                               $this->table->getPrefixedFields( $fields ),
+                               array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
+                               array( 'LIMIT' => 1 )
+                       );
+
+                       if ( $result !== false ) {
+                               $this->setFields( $this->table->getFieldsFromDBResult( $result ), $override );
+                               return true;
+                       }
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * Gets the value of a field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        * @param mixed $default
+        *
+        * @throws MWException
+        * @return mixed
+        */
+       public function getField( $name, $default = null ) {
+               if ( $this->hasField( $name ) ) {
+                       return $this->fields[$name];
+               } elseif ( !is_null( $default ) ) {
+                       return $default;
+               } else {
+                       throw new MWException( 'Attempted to get not-set field ' . $name );
+               }
+       }
+
+       /**
+        * Gets the value of a field but first loads it if not done so already.
+        *
+        * @since 1.20
+        *
+        * @param string$name
+        *
+        * @return mixed
+        */
+       public function loadAndGetField( $name ) {
+               if ( !$this->hasField( $name ) ) {
+                       $this->loadFields( array( $name ) );
+               }
+
+               return $this->getField( $name );
+       }
+
+       /**
+        * Remove a field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        */
+       public function removeField( $name ) {
+               unset( $this->fields[$name] );
+       }
+
+       /**
+        * Returns the objects database id.
+        *
+        * @since 1.20
+        *
+        * @return integer|null
+        */
+       public function getId() {
+               return $this->getField( 'id' );
+       }
+
+       /**
+        * Sets the objects database id.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $id
+        */
+       public function setId( $id ) {
+               $this->setField( 'id', $id );
+       }
+
+       /**
+        * Gets if a certain field is set.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        *
+        * @return boolean
+        */
+       public function hasField( $name ) {
+               return array_key_exists( $name, $this->fields );
+       }
+
+       /**
+        * Gets if the id field is set.
+        *
+        * @since 1.20
+        *
+        * @return boolean
+        */
+       public function hasIdField() {
+               return $this->hasField( 'id' )
+                       && !is_null( $this->getField( 'id' ) );
+       }
+
+       /**
+        * Sets multiple fields.
+        *
+        * @since 1.20
+        *
+        * @param array $fields The fields to set
+        * @param boolean $override Override already set fields with the provided values?
+        */
+       public function setFields( array $fields, $override = true ) {
+               foreach ( $fields as $name => $value ) {
+                       if ( $override || !$this->hasField( $name ) ) {
+                               $this->setField( $name, $value );
+                       }
+               }
+       }
+
+       /**
+        * Gets the fields => values to write to the table.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getWriteValues() {
+               $values = array();
+
+               foreach ( $this->table->getFields() as $name => $type ) {
+                       if ( array_key_exists( $name, $this->fields ) ) {
+                               $value = $this->fields[$name];
+
+                               switch ( $type ) {
+                                       case 'array':
+                                               $value = (array)$value;
+                                       case 'blob':
+                                               $value = serialize( $value );
+                               }
+
+                               $values[$this->table->getPrefixedField( $name )] = $value;
+                       }
+               }
+
+               return $values;
+       }
+
+       /**
+        * Serializes the object to an associative array which
+        * can then easily be converted into JSON or similar.
+        *
+        * @since 1.20
+        *
+        * @param null|array $fields
+        * @param boolean $incNullId
+        *
+        * @return array
+        */
+       public function toArray( $fields = null, $incNullId = false ) {
+               $data = array();
+               $setFields = array();
+
+               if ( !is_array( $fields ) ) {
+                       $setFields = $this->getSetFieldNames();
+               } else {
+                       foreach ( $fields as $field ) {
+                               if ( $this->hasField( $field ) ) {
+                                       $setFields[] = $field;
+                               }
+                       }
+               }
+
+               foreach ( $setFields as $field ) {
+                       if ( $incNullId || $field != 'id' || $this->hasIdField() ) {
+                               $data[$field] = $this->getField( $field );
+                       }
+               }
+
+               return $data;
+       }
+
+       /**
+        * Load the default values, via getDefaults.
+        *
+        *  @since 1.20
+        *
+        * @param boolean $override
+        */
+       public function loadDefaults( $override = true ) {
+               $this->setFields( $this->table->getDefaults(), $override );
+       }
+
+       /**
+        * Writes the answer to the database, either updating it
+        * when it already exists, or inserting it when it doesn't.
+        *
+        * @since 1.20
+        *
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function save( $functionName = null ) {
+               if ( $this->hasIdField() ) {
+                       return $this->saveExisting( $functionName );
+               } else {
+                       return $this->insert( $functionName );
+               }
+       }
+
+       /**
+        * Updates the object in the database.
+        *
+        * @since 1.20
+        *
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       protected function saveExisting( $functionName = null ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $success = $dbw->update(
+                       $this->table->getName(),
+                       $this->getWriteValues(),
+                       $this->table->getPrefixedValues( $this->getUpdateConditions() ),
+                       is_null( $functionName ) ? __METHOD__ : $functionName
+               );
+
+               return $success;
+       }
+
+       /**
+        * Returns the WHERE considtions needed to identify this object so
+        * it can be updated.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getUpdateConditions() {
+               return array( 'id' => $this->getId() );
+       }
+
+       /**
+        * Inserts the object into the database.
+        *
+        * @since 1.20
+        *
+        * @param string|null $functionName
+        * @param array|null $options
+        *
+        * @return boolean Success indicator
+        */
+       protected function insert( $functionName = null, array $options = null ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $result = $dbw->insert(
+                       $this->table->getName(),
+                       $this->getWriteValues(),
+                       is_null( $functionName ) ? __METHOD__ : $functionName,
+                       is_null( $options ) ? array( 'IGNORE' ) : $options
+               );
+
+               if ( $result ) {
+                       $this->setField( 'id', $dbw->insertId() );
+               }
+
+               return $result;
+       }
+
+       /**
+        * Removes the object from the database.
+        *
+        * @since 1.20
+        *
+        * @return boolean Success indicator
+        */
+       public function remove() {
+               $this->beforeRemove();
+
+               $success = $this->table->delete( array( 'id' => $this->getId() ) );
+
+               if ( $success ) {
+                       $this->onRemoved();
+               }
+
+               return $success;
+       }
+
+       /**
+        * Gets called before an object is removed from the database.
+        *
+        * @since 1.20
+        */
+       protected function beforeRemove() {
+               $this->loadFields( $this->getBeforeRemoveFields(), false, true );
+       }
+
+       /**
+        * Before removal of an object happens, @see beforeRemove gets called.
+        * This method loads the fields of which the names have been returned by this one (or all fields if null is returned).
+        * This allows for loading info needed after removal to get rid of linked data and the like.
+        *
+        * @since 1.20
+        *
+        * @return array|null
+        */
+       protected function getBeforeRemoveFields() {
+               return array();
+       }
+
+       /**
+        * Gets called after successfull removal.
+        * Can be overriden to get rid of linked data.
+        *
+        * @since 1.20
+        */
+       protected function onRemoved() {
+               $this->setField( 'id', null );
+       }
+
+       /**
+        * Return the names and values of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFields() {
+               return $this->fields;
+       }
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getSetFieldNames() {
+               return array_keys( $this->fields );
+       }
+
+       /**
+        * Sets the value of a field.
+        * Strings can be provided for other types,
+        * so this method can be called from unserialization handlers.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        * @param mixed $value
+        *
+        * @throws MWException
+        */
+       public function setField( $name, $value ) {
+               $fields = $this->table->getFields();
+
+               if ( array_key_exists( $name, $fields ) ) {
+                       switch ( $fields[$name] ) {
+                               case 'int':
+                                       $value = (int)$value;
+                                       break;
+                               case 'float':
+                                       $value = (float)$value;
+                                       break;
+                               case 'bool':
+                                       if ( is_string( $value ) ) {
+                                               $value = $value !== '0';
+                                       } elseif ( is_int( $value ) ) {
+                                               $value = $value !== 0;
+                                       }
+                                       break;
+                               case 'array':
+                                       if ( is_string( $value ) ) {
+                                               $value = unserialize( $value );
+                                       }
+
+                                       if ( !is_array( $value ) ) {
+                                               $value = array();
+                                       }
+                                       break;
+                               case 'blob':
+                                       if ( is_string( $value ) ) {
+                                               $value = unserialize( $value );
+                                       }
+                                       break;
+                               case 'id':
+                                       if ( is_string( $value ) ) {
+                                               $value = (int)$value;
+                                       }
+                                       break;
+                       }
+
+                       $this->fields[$name] = $value;
+               } else {
+                       throw new MWException( 'Attempted to set unknown field ' . $name );
+               }
+       }
+
+       /**
+        * Add an amount (can be negative) to the specified field (needs to be numeric).
+        *
+        * @since 1.20
+        *
+        * @param string $field
+        * @param integer $amount
+        *
+        * @return boolean Success indicator
+        */
+       public function addToField( $field, $amount ) {
+               if ( $amount == 0 ) {
+                       return true;
+               }
+
+               if ( !$this->hasIdField() ) {
+                       return false;
+               }
+
+               $absoluteAmount = abs( $amount );
+               $isNegative = $amount < 0;
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $fullField = $this->table->getPrefixedField( $field );
+
+               $success = $dbw->update(
+                       $this->table->getName(),
+                       array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
+                       array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
+                       __METHOD__
+               );
+
+               if ( $success && $this->hasField( $field ) ) {
+                       $this->setField( $field, $this->getField( $field ) + $amount );
+               }
+
+               return $success;
+       }
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldNames() {
+               return array_keys( $this->table->getFields() );
+       }
+
+       /**
+        * Computes and updates the values of the summary fields.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $summaryFields
+        */
+       public function loadSummaryFields( $summaryFields = null ) {
+
+       }
+
+       /**
+        * Sets the value for the @see $updateSummaries field.
+        *
+        * @since 1.20
+        *
+        * @param boolean $update
+        */
+       public function setUpdateSummaries( $update ) {
+               $this->updateSummaries = $update;
+       }
+
+       /**
+        * Sets the value for the @see $inSummaryMode field.
+        *
+        * @since 1.20
+        *
+        * @param boolean $summaryMode
+        */
+       public function setSummaryMode( $summaryMode ) {
+               $this->inSummaryMode = $summaryMode;
+       }
+
+       /**
+        * Return if any fields got changed.
+        *
+        * @since 1.20
+        *
+        * @param ORMRow $object
+        * @param boolean|array $excludeSummaryFields
+        *  When set to true, summary field changes are ignored.
+        *  Can also be an array of fields to ignore.
+        *
+        * @return boolean
+        */
+       protected function fieldsChanged( ORMRow $object, $excludeSummaryFields = false ) {
+               $exclusionFields = array();
+
+               if ( $excludeSummaryFields !== false ) {
+                       $exclusionFields = is_array( $excludeSummaryFields ) ? $excludeSummaryFields : $this->table->getSummaryFields();
+               }
+
+               foreach ( $this->fields as $name => $value ) {
+                       $excluded = $excludeSummaryFields && in_array( $name, $exclusionFields );
+
+                       if ( !$excluded && $object->getField( $name ) !== $value ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Returns the table this ORMRow is a row in.
+        *
+        * @since 1.20
+        *
+        * @return ORMTable
+        */
+       public function getTable() {
+               return $this->table;
+       }
+
+}
diff --git a/includes/db/ORMTable.php b/includes/db/ORMTable.php
new file mode 100644 (file)
index 0000000..2f02c6b
--- /dev/null
@@ -0,0 +1,715 @@
+<?php
+/**
+ * Abstract base class for representing a single database table.
+ *
+ * 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
+ *
+ * @since 1.20
+ *
+ * @file ORMTable.php
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+abstract class ORMTable {
+
+       /**
+        * Returns the name of the database table objects of this type are stored in.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public abstract function getName();
+
+       /**
+        * Returns the name of a ORMRow deriving class that
+        * represents single rows in this table.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public abstract function getRowClass();
+
+       /**
+        * Gets the db field prefix.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       protected abstract function getFieldPrefix();
+
+       /**
+        * Returns an array with the fields and their types this object contains.
+        * This corresponds directly to the fields in the database, without prefix.
+        *
+        * field name => type
+        *
+        * Allowed types:
+        * * id
+        * * str
+        * * int
+        * * float
+        * * bool
+        * * array
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public abstract function getFields();
+
+       /**
+        * Cache for instances, used by the singleton method.
+        *
+        * @since 1.20
+        * @var array of DBTable
+        */
+       protected static $instanceCache = array();
+
+       /**
+        * The database connection to use for read operations.
+        * Can be changed via @see setReadDb.
+        *
+        * @since 1.20
+        * @var integer DB_ enum
+        */
+       protected $readDb = DB_SLAVE;
+
+       /**
+        * Returns a list of default field values.
+        * field name => field value
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getDefaults() {
+               return array();
+       }
+
+       /**
+        * Returns a list of the summary fields.
+        * These are fields that cache computed values, such as the amount of linked objects of $type.
+        * This is relevant as one might not want to do actions such as log changes when these get updated.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getSummaryFields() {
+               return array();
+       }
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as DBDataObject. Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return ORMResult
+        */
+       public function select( $fields = null, array $conditions = array(),
+                                                       array $options = array(), $functionName  = null ) {
+               return new ORMResult( $this, $this->rawSelect( $fields, $conditions, $options, $functionName ) );
+       }
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as DBDataObject. Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return array of self
+        */
+       public function selectObjects( $fields = null, array $conditions = array(),
+                                                                  array $options = array(), $functionName  = null ) {
+               $result = $this->selectFields( $fields, $conditions, $options, false, $functionName );
+
+               $objects = array();
+
+               foreach ( $result as $record ) {
+                       $objects[] = $this->newFromArray( $record );
+               }
+
+               return $objects;
+       }
+
+       /**
+        * Do the actual select.
+        *
+        * @since 1.20
+        *
+        * @param null|string|array $fields
+        * @param array $conditions
+        * @param array $options
+        * @param null|string $functionName
+        *
+        * @return ResultWrapper
+        */
+       public function rawSelect( $fields = null, array $conditions = array(),
+                                                          array $options = array(), $functionName  = null ) {
+               if ( is_null( $fields ) ) {
+                       $fields = array_keys( $this->getFields() );
+               }
+               else {
+                       $fields = (array)$fields;
+               }
+
+               return wfGetDB( $this->getReadDb() )->select(
+                       $this->getName(),
+                       $this->getPrefixedFields( $fields ),
+                       $this->getPrefixedValues( $conditions ),
+                       is_null( $functionName ) ? __METHOD__ : $functionName,
+                       $options
+               );
+       }
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as associative arrays.
+        * Provided field names get prefixed.
+        * Returned field names will not have a prefix.
+        *
+        * When $collapse is true:
+        * If one field is selected, each item in the result array will be this field.
+        * If two fields are selected, each item in the result array will have as key
+        * the first field and as value the second field.
+        * If more then two fields are selected, each item will be an associative array.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param string|null $functionName
+        *
+        * @return array of array
+        */
+       public function selectFields( $fields = null, array $conditions = array(),
+                                                                 array $options = array(), $collapse = true, $functionName  = null ) {
+               $objects = array();
+
+               $result = $this->rawSelect( $fields, $conditions, $options, $functionName );
+
+               foreach ( $result as $record ) {
+                       $objects[] = $this->getFieldsFromDBResult( $record );
+               }
+
+               if ( $collapse ) {
+                       if ( count( $fields ) === 1 ) {
+                               $objects = array_map( 'array_shift', $objects );
+                       }
+                       elseif ( count( $fields ) === 2 ) {
+                               $o = array();
+
+                               foreach ( $objects as $object ) {
+                                       $o[array_shift( $object )] = array_shift( $object );
+                               }
+
+                               $objects = $o;
+                       }
+               }
+
+               return $objects;
+       }
+
+       /**
+        * Selects the the specified fields of the first matching record.
+        * Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return DBObject|bool False on failure
+        */
+       public function selectRow( $fields = null, array $conditions = array(),
+                                                          array $options = array(), $functionName = null ) {
+               $options['LIMIT'] = 1;
+
+               $objects = $this->select( $fields, $conditions, $options, $functionName );
+
+               return $objects->isEmpty() ? false : $objects->current();
+       }
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions. Field names do NOT get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return ResultWrapper
+        */
+       public function rawSelectRow( array $fields, array $conditions = array(),
+                                                                 array $options = array(), $functionName = null ) {
+               $dbr = wfGetDB( $this->getReadDb() );
+
+               return $dbr->selectRow(
+                       $this->getName(),
+                       $fields,
+                       $conditions,
+                       is_null( $functionName ) ? __METHOD__ : $functionName,
+                       $options
+               );
+       }
+
+       /**
+        * Selects the the specified fields of the first record matching the provided
+        * conditions and returns it as an associative array, or false when nothing matches.
+        * This method makes use of selectFields and expects the same parameters and
+        * returns the same results (if there are any, if there are none, this method returns false).
+        * @see ORMTable::selectFields
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param string|null $functionName
+        *
+        * @return mixed|array|bool False on failure
+        */
+       public function selectFieldsRow( $fields = null, array $conditions = array(),
+                                                                        array $options = array(), $collapse = true, $functionName = null ) {
+               $options['LIMIT'] = 1;
+
+               $objects = $this->selectFields( $fields, $conditions, $options, $collapse, $functionName );
+
+               return empty( $objects ) ? false : $objects[0];
+       }
+
+       /**
+        * Returns if there is at least one record matching the provided conditions.
+        * Condition field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        *
+        * @return boolean
+        */
+       public function has( array $conditions = array() ) {
+               return $this->selectRow( array( 'id' ), $conditions ) !== false;
+       }
+
+       /**
+        * Returns the amount of matching records.
+        * Condition field names get prefixed.
+        *
+        * Note that this can be expensive on large tables.
+        * In such cases you might want to use DatabaseBase::estimateRowCount instead.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        * @param array $options
+        *
+        * @return integer
+        */
+       public function count( array $conditions = array(), array $options = array() ) {
+               $res = $this->rawSelectRow(
+                       array( 'COUNT(*) AS rowcount' ),
+                       $this->getPrefixedValues( $conditions ),
+                       $options
+               );
+
+               return $res->rowcount;
+       }
+
+       /**
+        * Removes the object from the database.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function delete( array $conditions, $functionName = null ) {
+               return wfGetDB( DB_MASTER )->delete(
+                       $this->getName(),
+                       $this->getPrefixedValues( $conditions ),
+                       $functionName
+               );
+       }
+       
+       /**
+        * Get API parameters for the fields supported by this object.
+        *
+        * @since 1.20
+        *
+        * @param boolean $requireParams
+        * @param boolean $setDefaults
+        *
+        * @return array
+        */
+       public function getAPIParams( $requireParams = false, $setDefaults = false ) {
+               $typeMap = array(
+                       'id' => 'integer',
+                       'int' => 'integer',
+                       'float' => 'NULL',
+                       'str' => 'string',
+                       'bool' => 'integer',
+                       'array' => 'string',
+                       'blob' => 'string',
+               );
+
+               $params = array();
+               $defaults = $this->getDefaults();
+
+               foreach ( $this->getFields() as $field => $type ) {
+                       if ( $field == 'id' ) {
+                               continue;
+                       }
+
+                       $hasDefault = array_key_exists( $field, $defaults );
+
+                       $params[$field] = array(
+                               ApiBase::PARAM_TYPE => $typeMap[$type],
+                               ApiBase::PARAM_REQUIRED => $requireParams && !$hasDefault
+                       );
+
+                       if ( $type == 'array' ) {
+                               $params[$field][ApiBase::PARAM_ISMULTI] = true;
+                       }
+
+                       if ( $setDefaults && $hasDefault ) {
+                               $default = is_array( $defaults[$field] ) ? implode( '|', $defaults[$field] ) : $defaults[$field];
+                               $params[$field][ApiBase::PARAM_DFLT] = $default;
+                       }
+               }
+
+               return $params;
+       }
+
+       /**
+        * Returns an array with the fields and their descriptions.
+        *
+        * field name => field description
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldDescriptions() {
+               return array();
+       }
+
+       /**
+        * Get the database type used for read operations.
+        *
+        * @since 1.20
+        *
+        * @return integer DB_ enum
+        */
+       public function getReadDb() {
+               return $this->readDb;
+       }
+
+       /**
+        * Set the database type to use for read operations.
+        *
+        * @param integer $db
+        *
+        * @since 1.20
+        */
+       public function setReadDb( $db ) {
+               $this->readDb = $db;
+       }
+
+       /**
+        * Update the records matching the provided conditions by
+        * setting the fields that are keys in the $values param to
+        * their corresponding values.
+        *
+        * @since 1.20
+        *
+        * @param array $values
+        * @param array $conditions
+        *
+        * @return boolean Success indicator
+        */
+       public function update( array $values, array $conditions = array() ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               return $dbw->update(
+                       $this->getName(),
+                       $this->getPrefixedValues( $values ),
+                       $this->getPrefixedValues( $conditions ),
+                       __METHOD__
+               );
+       }
+
+       /**
+        * Computes the values of the summary fields of the objects matching the provided conditions.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $summaryFields
+        * @param array $conditions
+        */
+       public function updateSummaryFields( $summaryFields = null, array $conditions = array() ) {
+               $this->setReadDb( DB_MASTER );
+
+               foreach ( $this->select( null, $conditions ) as /* ORMRow */ $item ) {
+                       $item->loadSummaryFields( $summaryFields );
+                       $item->setSummaryMode( true );
+                       $item->save();
+               }
+
+               $this->setReadDb( DB_SLAVE );
+       }
+
+       /**
+        * Takes in an associative array with field names as keys and
+        * their values as value. The field names are prefixed with the
+        * db field prefix.
+        *
+        * Field names can also be provided as an array with as first element a table name, such as
+        * $conditions = array(
+        *       array( array( 'tablename', 'fieldname' ), $value ),
+        * );
+        *
+        * @since 1.20
+        *
+        * @param array $values
+        *
+        * @return array
+        */
+       public function getPrefixedValues( array $values ) {
+               $prefixedValues = array();
+
+               foreach ( $values as $field => $value ) {
+                       if ( is_integer( $field ) ) {
+                               if ( is_array( $value ) ) {
+                                       $field = $value[0];
+                                       $value = $value[1];
+                               }
+                               else {
+                                       $value = explode( ' ', $value, 2 );
+                                       $value[0] = $this->getPrefixedField( $value[0] );
+                                       $prefixedValues[] = implode( ' ', $value );
+                                       continue;
+                               }
+                       }
+
+                       $prefixedValues[$this->getPrefixedField( $field )] = $value;
+               }
+
+               return $prefixedValues;
+       }
+
+       /**
+        * Takes in a field or array of fields and returns an
+        * array with their prefixed versions, ready for db usage.
+        *
+        * @since 1.20
+        *
+        * @param array|string $fields
+        *
+        * @return array
+        */
+       public function getPrefixedFields( array $fields ) {
+               foreach ( $fields as &$field ) {
+                       $field = $this->getPrefixedField( $field );
+               }
+
+               return $fields;
+       }
+
+       /**
+        * Takes in a field and returns an it's prefixed version, ready for db usage.
+        *
+        * @since 1.20
+        *
+        * @param string|array $field
+        *
+        * @return string
+        */
+       public function getPrefixedField( $field ) {
+               return $this->getFieldPrefix() . $field;
+       }
+
+       /**
+        * Takes an array of field names with prefix and returns the unprefixed equivalent.
+        *
+        * @since 1.20
+        *
+        * @param array $fieldNames
+        *
+        * @return array
+        */
+       public function unprefixFieldNames( array $fieldNames ) {
+               return array_map( array( $this, 'unprefixFieldName' ), $fieldNames );
+       }
+
+       /**
+        * Takes a field name with prefix and returns the unprefixed equivalent.
+        *
+        * @since 1.20
+        *
+        * @param string $fieldName
+        *
+        * @return string
+        */
+       public function unprefixFieldName( $fieldName ) {
+               return substr( $fieldName, strlen( $this->getFieldPrefix() ) );
+       }
+
+       /**
+        * Get an instance of this class.
+        *
+        * @since 1.20
+        *
+        * @return ORMTable
+        */
+       public static function singleton() {
+               $class = function_exists( 'get_called_class' ) ? get_called_class() : self::get_called_class();
+
+               if ( !array_key_exists( $class, self::$instanceCache ) ) {
+                       self::$instanceCache[$class] = new $class;
+               }
+
+               return self::$instanceCache[$class];
+       }
+
+       /**
+        * Compatibility fallback function so the singleton method works on PHP < 5.3.
+        * Code borrowed from http://www.php.net/manual/en/function.get-called-class.php#107445
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       protected static function get_called_class() {
+               $bt = debug_backtrace();
+               $l = count($bt) - 1;
+               $matches = array();
+               while(empty($matches) && $l > -1){
+                       $lines = file($bt[$l]['file']);
+                       $callerLine = $lines[$bt[$l]['line']-1];
+                       preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l--]['function'].'/',
+                               $callerLine,
+                               $matches);
+               }
+               if (!isset($matches[1])) $matches[1]=NULL; //for notices
+               if ($matches[1] == 'self') {
+                       $line = $bt[$l]['line']-1;
+                       while ($line > 0 && strpos($lines[$line], 'class') === false) {
+                               $line--;
+                       }
+                       preg_match('/class[\s]+(.+?)[\s]+/si', $lines[$line], $matches);
+               }
+               return $matches[1];
+       }
+
+       /**
+        * Get an array with fields from a database result,
+        * that can be fed directly to the constructor or
+        * to setFields.
+        *
+        * @since 1.20
+        *
+        * @param stdClass $result
+        *
+        * @return array
+        */
+       public function getFieldsFromDBResult( stdClass $result ) {
+               $result = (array)$result;
+               return array_combine(
+                       $this->unprefixFieldNames( array_keys( $result ) ),
+                       array_values( $result )
+               );
+       }
+
+       /**
+        * Get a new instance of the class from a database result.
+        *
+        * @since 1.20
+        *
+        * @param stdClass $result
+        *
+        * @return ORMRow
+        */
+       public function newFromDBResult( stdClass $result ) {
+               return $this->newFromArray( $this->getFieldsFromDBResult( $result ) );
+       }
+
+       /**
+        * Get a new instance of the class from an array.
+        *
+        * @since 1.20
+        *
+        * @param array $data
+        * @param boolean $loadDefaults
+        *
+        * @return ORMRow
+        */
+       public function newFromArray( array $data, $loadDefaults = false ) {
+               $class = $this->getRowClass();
+               return new $class( $this, $data, $loadDefaults );
+       }
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldNames() {
+               return array_keys( $this->getFields() );
+       }
+
+       /**
+        * Gets if the object can take a certain field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        *
+        * @return boolean
+        */
+       public function canHaveField( $name ) {
+               return array_key_exists( $name, $this->getFields() );
+       }
+
+}
index 10905f2..ed73522 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Debug toolbar related code
+ *
+ * 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
+ */
 
 /**
  * New debugger system that outputs a toolbar on page view
index e8f35f0..37a732b 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * User interface for the difference engine
+ * User interface for the difference engine.
+ *
+ * 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
  * @ingroup DifferenceEngine
index 22dbdef..7435ca9 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * A repository for files accessible via the local filesystem.
  *
+ * 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
  * @ingroup FileRepo
  */
index dcc9610..6533dae 100644 (file)
 /**
  * Base code for file repositories.
  *
+ * 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
  * @ingroup FileRepo
  */
@@ -706,9 +721,7 @@ class FileRepo {
                        }
 
                        // Resolve source to a storage path if virtual
-                       if ( self::isVirtualUrl( $srcPath ) ) {
-                               $srcPath = $this->resolveVirtualUrl( $srcPath );
-                       }
+                       $srcPath = $this->resolveToStoragePath( $srcPath );
 
                        // Get the appropriate file operation
                        if ( FileBackend::isStoragePath( $srcPath ) ) {
@@ -767,9 +780,7 @@ class FileRepo {
                                $path = $this->getZonePath( $zone ) . "/$rel";
                        } else {
                                // Resolve source to a storage path if virtual
-                               if ( self::isVirtualUrl( $path ) ) {
-                                       $path = $this->resolveVirtualUrl( $path );
-                               }
+                               $path = $this->resolveToStoragePath( $path );
                        }
                        $operations[] = array( 'op' => 'delete', 'src' => $path );
                }
@@ -783,6 +794,101 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Import a file from the local file system into the repo.
+        * This does no locking nor journaling and overrides existing files.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This is intended for copying generated thumbnails into the repo.
+        *
+        * @param $src string File system path
+        * @param $dst string Virtual URL or storage path
+        * @return FileRepoStatus
+        */
+       final public function quickImport( $src, $dst ) {
+               return $this->quickImportBatch( array( array( $src, $dst ) ) );
+       }
+
+       /**
+        * Purge a file from the repo. This does no locking nor journaling.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This is intended for purging thumbnails.
+        *
+        * @param $path string Virtual URL or storage path
+        * @return FileRepoStatus
+        */
+       final public function quickPurge( $path ) {
+               return $this->quickPurgeBatch( array( $path ) );
+       }
+
+       /**
+        * Deletes a directory if empty.
+        * This function can be used to write to otherwise read-only foreign repos.
+        *
+        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @return Status
+        */
+       public function quickCleanDir( $dir ) {
+               $status = $this->newGood();
+               $status->merge( $this->backend->clean(
+                       array( 'dir' => $this->resolveToStoragePath( $dir ) ) ) );
+
+               return $status;
+       }
+
+       /**
+        * Import a batch of files from the local file system into the repo.
+        * This does no locking nor journaling and overrides existing files.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This is intended for copying generated thumbnails into the repo.
+        *
+        * @param $src Array List of tuples (file system path, virtual URL or storage path)
+        * @return FileRepoStatus
+        */
+       public function quickImportBatch( array $pairs ) {
+               $status = $this->newGood();
+               $operations = array();
+               foreach ( $pairs as $pair ) {
+                       list ( $src, $dst ) = $pair;
+                       $operations[] = array(
+                               'op'        => 'store',
+                               'src'       => $src,
+                               'dst'       => $this->resolveToStoragePath( $dst ),
+                               'overwrite' => true
+                       );
+                       $this->backend->prepare( array( 'dir' => dirname( $dst ) ) );
+               }
+               $status->merge( $this->backend->doOperations( $operations,
+                       array( 'force' => 1, 'nonLocking' => 1, 'allowStale' => 1, 'nonJournaled' => 1 )
+               ) );
+
+               return $status;
+       }
+
+       /**
+        * Purge a batch of files from the repo.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This does no locking nor journaling and is intended for purging thumbnails.
+        *
+        * @param $path Array List of virtual URLs or storage paths
+        * @return FileRepoStatus
+        */
+       public function quickPurgeBatch( array $paths ) {
+               $status = $this->newGood();
+               $operations = array();
+               foreach ( $paths as $path ) {
+                       $operations[] = array(
+                               'op'                  => 'delete',
+                               'src'                 => $this->resolveToStoragePath( $path ),
+                               'ignoreMissingSource' => true
+                       );
+               }
+               $status->merge( $this->backend->doOperations( $operations,
+                       array( 'force' => 1, 'nonLocking' => 1, 'allowStale' => 1, 'nonJournaled' => 1 )
+               ) );
+
+               return $status;
+       }
+
        /**
         * Pick a random name in the temp zone and store a file to it.
         * Returns a FileRepoStatus object with the file Virtual URL in the value,
@@ -927,9 +1033,7 @@ class FileRepo {
                foreach ( $triplets as $i => $triplet ) {
                        list( $srcPath, $dstRel, $archiveRel ) = $triplet;
                        // Resolve source to a storage path if virtual
-                       if ( substr( $srcPath, 0, 9 ) == 'mwrepo://' ) {
-                               $srcPath = $this->resolveVirtualUrl( $srcPath );
-                       }
+                       $srcPath = $this->resolveToStoragePath( $srcPath );
                        if ( !$this->validateFilename( $dstRel ) ) {
                                throw new MWException( 'Validation error in $dstRel' );
                        }
@@ -1012,6 +1116,22 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Deletes a directory if empty.
+        *
+        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @return Status
+        */
+       public function cleanDir( $dir ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
+               $status = $this->newGood();
+               $status->merge( $this->backend->clean(
+                       array( 'dir' => $this->resolveToStoragePath( $dir ) ) ) );
+
+               return $status;
+       }
+
        /**
         * Checks existence of a a file
         *
@@ -1032,9 +1152,7 @@ class FileRepo {
        public function fileExistsBatch( array $files ) {
                $result = array();
                foreach ( $files as $key => $file ) {
-                       if ( self::isVirtualUrl( $file ) ) {
-                               $file = $this->resolveVirtualUrl( $file );
-                       }
+                       $file = $this->resolveToStoragePath( $file );
                        $result[$key] = $this->backend->fileExists( array( 'src' => $file ) );
                }
                return $result;
index 4eea903..6f28b10 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Generic operation result for FileRepo-related operations
+ * Generic operation result for FileRepo-related operations.
+ *
+ * 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
  * @ingroup FileRepo
index ba2694e..5fab3ab 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Foreign repository accessible through api.php requests.
  *
+ * 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
  * @ingroup FileRepo
  */
@@ -87,6 +102,10 @@ class ForeignAPIRepo extends FileRepo {
                                # same repo.
                                $results[$k] = false;
                                unset( $files[$k] );
+                       } elseif ( FileBackend::isStoragePath( $f ) ) {
+                               $results[$k] = false;
+                               unset( $files[$k] );
+                               wfWarn( "Got mwstore:// path '$f'." );
                        }
                }
 
@@ -111,8 +130,8 @@ class ForeignAPIRepo extends FileRepo {
 
                $query = array_merge( $query,
                        array(
-                               'format' => 'json',
-                               'action' => 'query',
+                               'format'    => 'json',
+                               'action'    => 'query',
                                'redirects' => 'true'
                        ) );
                if ( $this->mApiBase ) {
@@ -203,6 +222,9 @@ class ForeignAPIRepo extends FileRepo {
         */
        function getThumbUrlFromCache( $name, $width, $height, $params="" ) {
                global $wgMemc;
+               // We can't check the local cache using FileRepo functions because
+               // we override fileExistsBatch(). We have to use the FileBackend directly.
+               $backend = $this->getBackend(); // convenience
 
                if ( !$this->canCacheThumbs() ) {
                        $result = null; // can't pass "null" by reference, but it's ok as default value
@@ -243,9 +265,11 @@ class ForeignAPIRepo extends FileRepo {
                $localFilename = $localPath . "/" . $fileName;
                $localUrl =  $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
 
-               if( $this->fileExists( $localFilename ) && isset( $metadata['timestamp'] ) ) {
+               if( $backend->fileExists( array( 'src' => $localFilename ) )
+                       && isset( $metadata['timestamp'] ) )
+               {
                        wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
-                       $modified = $this->getFileTimestamp( $localFilename );
+                       $modified = $backend->getFileTimestamp( array( 'src' => $localFilename ) );
                        $remoteModified = strtotime( $metadata['timestamp'] );
                        $current = time();
                        $diff = abs( $modified - $current );
@@ -264,15 +288,13 @@ class ForeignAPIRepo extends FileRepo {
                }
 
                # @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
-               wfSuppressWarnings();
-               $backend = $this->getBackend();
+               $backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
                $op = array( 'op' => 'create', 'dst' => $localFilename, 'content' => $thumb );
                if( !$backend->doOperation( $op )->isOK() ) {
                        wfRestoreWarnings();
                        wfDebug( __METHOD__ . " could not write to thumb path\n" );
                        return $foreignUrl;
                }
-               wfRestoreWarnings();
                $knownThumbUrls[$sizekey] = $localUrl;
                $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
                wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
index 30f9977..6a1cfaf 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * A foreign repository with an accessible MediaWiki database
+ * A foreign repository with an accessible MediaWiki database.
+ *
+ * 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
  * @ingroup FileRepo
index 602902d..2132ba6 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * A foreign repository with a MediaWiki database accessible via the configured LBFactory
+ * A foreign repository with a MediaWiki database accessible via the configured LBFactory.
+ *
+ * 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
  * @ingroup FileRepo
index eecd67a..1b8042d 100644 (file)
@@ -3,6 +3,21 @@
  * Local repository that stores files in the local filesystem and registers them
  * in the wiki's own database.
  *
+ * 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
  * @ingroup FileRepo
  */
index 9d58bc8..3f39f60 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * File repository with no files.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 FileRepo
  */
index b109803..0def2d8 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Prioritized list of file repositories
+ * Prioritized list of file repositories.
+ *
+ * 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
  * @ingroup FileRepo
index 5d2bb52..ec21c8f 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Non-directory file on the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 FileBackend
  */
index 4a27ca1..d9a9c59 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * File system based backend.
+ *
+ * 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
  * @ingroup FileBackend
  * @author Aaron Schulz
 
 /**
  * @brief Class for a file system (FS) based file backend.
- * 
+ *
  * All "containers" each map to a directory under the backend's base directory.
  * For backwards-compatibility, some container paths can be set to custom paths.
  * The wiki ID will not be used in any custom paths, so this should be avoided.
- * 
+ *
  * Having directories with thousands of files will diminish performance.
  * Sharding can be accomplished by using FileRepo-style hash paths.
  *
@@ -76,7 +93,7 @@ class FSFileBackend extends FileBackendStore {
 
        /**
         * Sanity check a relative file system path for validity
-        * 
+        *
         * @param $path string Normalized relative path
         * @return bool
         */
@@ -95,14 +112,14 @@ class FSFileBackend extends FileBackendStore {
        /**
         * Given the short (unresolved) and full (resolved) name of
         * a container, return the file system path of the container.
-        * 
+        *
         * @param $shortCont string
         * @param $fullCont string
-        * @return string|null 
+        * @return string|null
         */
        protected function containerFSRoot( $shortCont, $fullCont ) {
                if ( isset( $this->containerPaths[$shortCont] ) ) {
-                       return $this->containerPaths[$shortCont]; 
+                       return $this->containerPaths[$shortCont];
                } elseif ( isset( $this->basePath ) ) {
                        return "{$this->basePath}/{$fullCont}";
                }
@@ -111,7 +128,7 @@ class FSFileBackend extends FileBackendStore {
 
        /**
         * Get the absolute file system path for a storage path
-        * 
+        *
         * @param $storagePath string Storage path
         * @return string|null
         */
@@ -175,7 +192,12 @@ class FSFileBackend extends FileBackendStore {
                }
 
                $ok = copy( $params['src'], $dest );
-               if ( !$ok ) {
+               // In some cases (at least over NFS), copy() returns true when it fails.
+               if ( !$ok || ( filesize( $params['src'] ) !== filesize( $dest ) ) ) {
+                       if ( $ok ) { // PHP bug
+                               unlink( $dest ); // remove broken file
+                               trigger_error( __METHOD__ . ": copy() failed but returned true." );
+                       }
                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
                        return $status;
                }
@@ -218,7 +240,12 @@ class FSFileBackend extends FileBackendStore {
                }
 
                $ok = copy( $source, $dest );
-               if ( !$ok ) {
+               // In some cases (at least over NFS), copy() returns true when it fails.
+               if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
+                       if ( $ok ) { // PHP bug
+                               unlink( $dest ); // remove broken file
+                               trigger_error( __METHOD__ . ": copy() failed but returned true." );
+                       }
                        $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
                        return $status;
                }
@@ -439,6 +466,41 @@ class FSFileBackend extends FileBackendStore {
                clearstatcache(); // clear the PHP file stat cache
        }
 
+       /**
+        * @see FileBackendStore::doDirectoryExists()
+        * @return bool|null
+        */
+       protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+
+               $this->trapWarnings(); // don't trust 'false' if there were errors
+               $exists = is_dir( $dir );
+               $hadError = $this->untrapWarnings();
+
+               return $hadError ? null : $exists;
+       }
+
+       /**
+        * @see FileBackendStore::getDirectoryListInternal()
+        * @return Array|null
+        */
+       public function getDirectoryListInternal( $fullCont, $dirRel, array $params ) {
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+               $exists = is_dir( $dir );
+               if ( !$exists ) {
+                       wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
+                       return array(); // nothing under this dir
+               } elseif ( !is_readable( $dir ) ) {
+                       wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
+                       return null; // bad permissions?
+               }
+               return new FSFileBackendDirList( $dir, $params );
+       }
+
        /**
         * @see FileBackendStore::getFileListInternal()
         * @return array|FSFileBackendFileList|null
@@ -451,13 +513,11 @@ class FSFileBackend extends FileBackendStore {
                if ( !$exists ) {
                        wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
                        return array(); // nothing under this dir
-               }
-               $readable = is_readable( $dir );
-               if ( !$readable ) {
+               } elseif ( !is_readable( $dir ) ) {
                        wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
                        return null; // bad permissions?
                }
-               return new FSFileBackendFileList( $dir );
+               return new FSFileBackendFileList( $dir, $params );
        }
 
        /**
@@ -501,6 +561,14 @@ class FSFileBackend extends FileBackendStore {
                return $tmpFile;
        }
 
+       /**
+        * @see FileBackendStore::directoriesAreVirtual()
+        * @return bool
+        */
+       protected function directoriesAreVirtual() {
+               return false;
+       }
+
        /**
         * Chmod a file, suppressing the warnings
         *
@@ -543,51 +611,55 @@ class FSFileBackend extends FileBackendStore {
 }
 
 /**
- * Wrapper around RecursiveDirectoryIterator that catches
- * exception or does any custom behavoir that we may want.
+ * Wrapper around RecursiveDirectoryIterator/DirectoryIterator that
+ * catches exception or does any custom behavoir that we may want.
  * Do not use this class from places outside FSFileBackend.
  *
  * @ingroup FileBackend
  */
-class FSFileBackendFileList implements Iterator {
-       /** @var RecursiveIteratorIterator */
+abstract class FSFileBackendList implements Iterator {
+       /** @var Iterator */
        protected $iter;
        protected $suffixStart; // integer
        protected $pos = 0; // integer
+       /** @var Array */
+       protected $params = array();
 
        /**
         * @param $dir string file system directory
         */
-       public function __construct( $dir ) {
+       public function __construct( $dir, array $params ) {
                $dir = realpath( $dir ); // normalize
                $this->suffixStart = strlen( $dir ) + 1; // size of "path/to/dir/"
+               $this->params = $params;
+
                try {
-                       # Get an iterator that will return leaf nodes (non-directories)
-                       if ( MWInit::classExists( 'FilesystemIterator' ) ) { // PHP >= 5.3
-                               # RecursiveDirectoryIterator extends FilesystemIterator.
-                               # FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
-                               $flags = FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS;
-                               $this->iter = new RecursiveIteratorIterator( 
-                                       new RecursiveDirectoryIterator( $dir, $flags ) );
-                       } else { // PHP < 5.3
-                               # RecursiveDirectoryIterator extends DirectoryIterator
-                               $this->iter = new RecursiveIteratorIterator( 
-                                       new RecursiveDirectoryIterator( $dir ) );
-                       }
+                       $this->iter = $this->initIterator( $dir );
                } catch ( UnexpectedValueException $e ) {
                        $this->iter = null; // bad permissions? deleted?
                }
        }
 
        /**
-        * @see Iterator::current()
-        * @return string|bool String or false
+        * Return an appropriate iterator object to wrap
+        *
+        * @param $dir string file system directory
+        * @return Iterator
         */
-       public function current() {
-               // Return only the relative path and normalize slashes to FileBackend-style
-               // Make sure to use the realpath since the suffix is based upon that
-               return str_replace( '\\', '/',
-                       substr( realpath( $this->iter->current() ), $this->suffixStart ) );
+       protected function initIterator( $dir ) {
+               if ( !empty( $this->params['topOnly'] ) ) { // non-recursive
+                       # Get an iterator that will get direct sub-nodes
+                       return new DirectoryIterator( $dir );
+               } else { // recursive
+                       # Get an iterator that will return leaf nodes (non-directories)
+                       # RecursiveDirectoryIterator extends FilesystemIterator.
+                       # FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
+                       $flags = FilesystemIterator::CURRENT_AS_SELF | FilesystemIterator::SKIP_DOTS;
+                       return new RecursiveIteratorIterator(
+                               new RecursiveDirectoryIterator( $dir, $flags ),
+                               RecursiveIteratorIterator::CHILD_FIRST // include dirs
+                       );
+               }
        }
 
        /**
@@ -598,6 +670,14 @@ class FSFileBackendFileList implements Iterator {
                return $this->pos;
        }
 
+       /**
+        * @see Iterator::current()
+        * @return string|bool String or false
+        */
+       public function current() {
+               return $this->getRelPath( $this->iter->current()->getPathname() );
+       }
+
        /**
         * @see Iterator::next()
         * @return void
@@ -605,6 +685,7 @@ class FSFileBackendFileList implements Iterator {
        public function next() {
                try {
                        $this->iter->next();
+                       $this->filterViaNext();
                } catch ( UnexpectedValueException $e ) {
                        $this->iter = null;
                }
@@ -619,6 +700,7 @@ class FSFileBackendFileList implements Iterator {
                $this->pos = 0;
                try {
                        $this->iter->rewind();
+                       $this->filterViaNext();
                } catch ( UnexpectedValueException $e ) {
                        $this->iter = null;
                }
@@ -631,4 +713,44 @@ class FSFileBackendFileList implements Iterator {
        public function valid() {
                return $this->iter && $this->iter->valid();
        }
+
+       /**
+        * Filter out items by advancing to the next ones
+        */
+       protected function filterViaNext() {}
+
+       /**
+        * Return only the relative path and normalize slashes to FileBackend-style.
+        * Uses the "real path" since the suffix is based upon that.
+        *
+        * @param $path string
+        * @return string
+        */
+       protected function getRelPath( $path ) {
+               return strtr( substr( realpath( $path ), $this->suffixStart ), '\\', '/' );
+       }
+}
+
+class FSFileBackendDirList extends FSFileBackendList {
+       protected function filterViaNext() {
+               while ( $this->iter->valid() ) {
+                       if ( $this->iter->current()->isDot() || !$this->iter->current()->isDir() ) {
+                               $this->iter->next(); // skip non-directories and dot files
+                       } else {
+                               break;
+                       }
+               }
+       }
+}
+
+class FSFileBackendFileList extends FSFileBackendList {
+       protected function filterViaNext() {
+               while ( $this->iter->valid() ) {
+                       if ( !$this->iter->current()->isFile() ) {
+                               $this->iter->next(); // skip non-files and dot files
+                       } else {
+                               break;
+                       }
+               }
+       }
 }
index 44f4d94..6f2d291 100644 (file)
@@ -8,6 +8,23 @@
  */
 
 /**
+ * Base class for all file backends.
+ *
+ * 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
  * @ingroup FileBackend
  * @author Aaron Schulz
  *
  * This class defines the methods as abstract that subclasses must implement.
  * Outside callers can assume that all backends will have these functions.
- * 
+ *
  * All "storage paths" are of the format "mwstore://<backend>/<container>/<path>".
- * The <path> portion is a relative path that uses UNIX file system (FS) notation, 
- * though any particular backend may not actually be using a local filesystem. 
+ * The <path> portion is a relative path that uses UNIX file system (FS) notation,
+ * though any particular backend may not actually be using a local filesystem.
  * Therefore, the relative paths are only virtual.
- * 
+ *
  * Backend contents are stored under wiki-specific container names by default.
  * For legacy reasons, this has no effect for the FS backend class, and per-wiki
  * segregation must be done by setting the container paths appropriately.
- * 
+ *
  * FS-based backends are somewhat more restrictive due to the existence of real
  * directory files; a regular file cannot have the same name as a directory. Other
  * backends with virtual directories may not have this limitation. Callers should
  * store files in such a way that no files and directories are under the same path.
- * 
+ *
  * Methods should avoid throwing exceptions at all costs.
  * As a corollary, external dependencies should be kept to a minimum.
- * 
+ *
  * @ingroup FileBackend
  * @since 1.19
  */
@@ -51,7 +68,7 @@ abstract class FileBackend {
        /**
         * Create a new backend instance from configuration.
         * This should only be called from within FileBackendGroup.
-        * 
+        *
         * $config includes:
         *     'name'        : The unique name of this backend.
         *                     This should consist of alphanumberic, '-', and '_' characters.
@@ -63,7 +80,7 @@ abstract class FileBackend {
         *                     Journals simply log changes to files stored in the backend.
         *     'readOnly'    : Write operations are disallowed if this is a non-empty string.
         *                     It should be an explanation for the backend being read-only.
-        * 
+        *
         * @param $config Array
         */
        public function __construct( array $config ) {
@@ -89,7 +106,7 @@ abstract class FileBackend {
         * Get the unique backend name.
         * We may have multiple different backends of the same type.
         * For example, we can have two Swift backends using different proxies.
-        * 
+        *
         * @return string
         */
        final public function getName() {
@@ -98,7 +115,7 @@ abstract class FileBackend {
 
        /**
         * Check if this backend is read-only
-        * 
+        *
         * @return bool
         */
        final public function isReadOnly() {
@@ -107,7 +124,7 @@ abstract class FileBackend {
 
        /**
         * Get an explanatory message if this backend is read-only
-        * 
+        *
         * @return string|bool Returns false if the backend is not read-only
         */
        final public function getReadOnlyReason() {
@@ -119,10 +136,10 @@ abstract class FileBackend {
         * Callers supply an ordered list of operations to perform as a transaction.
         * Files will be locked, the stat cache cleared, and then the operations attempted.
         * If any serious errors occur, all attempted operations will be rolled back.
-        * 
+        *
         * $ops is an array of arrays. The outer array holds a list of operations.
         * Each inner array is a set of key value pairs that specify an operation.
-        * 
+        *
         * Supported operations and their parameters:
         * a) Create a new file in storage with the contents of a string
         *     array(
@@ -166,7 +183,7 @@ abstract class FileBackend {
         *     array(
         *         'op'                  => 'null',
         *     )
-        * 
+        *
         * Boolean flags for operations (operation-specific):
         * 'ignoreMissingSource' : The operation will simply succeed and do
         *                         nothing if the source file does not exist.
@@ -174,10 +191,11 @@ abstract class FileBackend {
         * 'overwriteSame'       : An error will not be given if a file already
         *                         exists at the destination that has the same
         *                         contents as the new contents to be written there.
-        * 
+        *
         * $opts is an associative of boolean flags, including:
-        * 'force'               : Errors that would normally cause a rollback do not.
-        *                         The remaining operations are still attempted if any fail.
+        * 'force'               : Operation precondition errors no longer trigger an abort.
+        *                         Any remaining operations are still attempted. Unexpected
+        *                         failures may still cause remaning operations to be aborted.
         * 'nonLocking'          : No locks are acquired for the operations.
         *                         This can increase performance for non-critical writes.
         *                         This has no effect unless the 'force' flag is set.
@@ -186,19 +204,19 @@ abstract class FileBackend {
         *                         This has no effect unless the 'force' flag is set.
         * 'nonJournaled'        : Don't log this operation batch in the file journal.
         *                         This limits the ability of recovery scripts.
-        * 
+        *
         * Remarks on locking:
         * File system paths given to operations should refer to files that are
         * already locked or otherwise safe from modification from other processes.
         * Normally these files will be new temp files, which should be adequate.
-        * 
+        *
         * Return value:
         * This returns a Status, which contains all warnings and fatals that occured
         * during the operation. The 'failCount', 'successCount', and 'success' members
         * will reflect each operation attempted. The status will be "OK" unless:
         *     a) unexpected operation errors occurred (network partitions, disk full...)
         *     b) significant operation errors occured and 'force' was not set
-        * 
+        *
         * @param $ops Array List of operations to execute in order
         * @param $opts Array Batch operation options
         * @return Status
@@ -315,8 +333,8 @@ abstract class FileBackend {
         * otherwise safe from modification from other processes. Normally,
         * the file will be a new temp file, which should be adequate.
         * $params include:
-        *     srcs          : ordered source storage paths (e.g. chunk1, chunk2, ...)
-        *     dst           : file system path to 0-byte temp file
+        *     srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
+        *     dst  : file system path to 0-byte temp file
         *
         * @param $params Array Operation parameters
         * @return Status
@@ -327,10 +345,10 @@ abstract class FileBackend {
         * Prepare a storage directory for usage.
         * This will create any required containers and parent directories.
         * Backends using key/value stores only need to create the container.
-        * 
+        *
         * $params include:
         *     dir : storage directory
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -352,12 +370,12 @@ abstract class FileBackend {
         * files whereas key/value store backends might restrict container
         * access to the auth user that represents end-users in web request.
         * This is not guaranteed to actually do anything.
-        * 
+        *
         * $params include:
         *     dir       : storage directory
         *     noAccess  : try to deny file access
         *     noListing : try to deny file listing
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -381,10 +399,11 @@ abstract class FileBackend {
         * Delete a storage directory if it is empty.
         * Backends using key/value stores may do nothing unless the directory
         * is that of an empty container, in which case it should be deleted.
-        * 
+        *
         * $params include:
-        *     dir : storage directory
-        * 
+        *     dir       : storage directory
+        *     recursive : recursively delete empty subdirectories first (@since 1.20)
+        *
         * @param $params Array
         * @return Status
         */
@@ -403,11 +422,11 @@ abstract class FileBackend {
        /**
         * Check if a file exists at a storage path in the backend.
         * This returns false if only a directory exists at the path.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return bool|null Returns null on failure
         */
@@ -415,11 +434,11 @@ abstract class FileBackend {
 
        /**
         * Get the last-modified timestamp of the file at a storage path.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return string|bool TS_MW timestamp or false on failure
         */
@@ -428,11 +447,11 @@ abstract class FileBackend {
        /**
         * Get the contents of a file at a storage path in the backend.
         * This should be avoided for potentially large files.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return string|bool Returns false on failure
         */
@@ -440,11 +459,11 @@ abstract class FileBackend {
 
        /**
         * Get the size (bytes) of a file at a storage path in the backend.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return integer|bool Returns false on failure
         */
@@ -457,11 +476,11 @@ abstract class FileBackend {
         *     mtime  : the last-modified timestamp (TS_MW)
         *     size   : the file size (bytes)
         * Additional values may be included for internal use only.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return Array|bool|null Returns null on failure
         */
@@ -469,11 +488,11 @@ abstract class FileBackend {
 
        /**
         * Get a SHA-1 hash of the file at a storage path in the backend.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return string|bool Hash string or false on failure
         */
@@ -482,11 +501,11 @@ abstract class FileBackend {
        /**
         * Get the properties of the file at a storage path in the backend.
         * Returns FSFile::placeholderProps() on failure.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return Array
         */
@@ -498,12 +517,12 @@ abstract class FileBackend {
         * Appropriate HTTP headers (Status, Content-Type, Content-Length)
         * must be sent if streaming began, while none should be sent otherwise.
         * Implementations should flush the output buffer before sending data.
-        * 
+        *
         * $params include:
         *     src     : source storage path
         *     headers : additional HTTP headers to send on success
         *     latest  : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -516,16 +535,16 @@ abstract class FileBackend {
         *    The temporary copy will have the same extension as the source.
         * b) An original of the file at a storage path in the backend.
         * Temporary files may be purged when the file object falls out of scope.
-        * 
+        *
         * Write operations should *never* be done on this file as some backends
         * may do internal tracking or may be instances of FileBackendMultiWrite.
         * In that later case, there are copies of the file that must stay in sync.
         * Additionally, further calls to this function may return the same file.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return FSFile|null Returns null on failure
         */
@@ -535,33 +554,100 @@ abstract class FileBackend {
         * Get a local copy on disk of the file at a storage path in the backend.
         * The temporary copy will have the same file extension as the source.
         * Temporary files may be purged when the file object falls out of scope.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return TempFSFile|null Returns null on failure
         */
        abstract public function getLocalCopy( array $params );
 
        /**
-        * Get an iterator to list out all stored files under a storage directory.
-        * If the directory is of the form "mwstore://backend/container", 
+        * Check if a directory exists at a given storage path.
+        * Backends using key/value stores will check if the path is a
+        * virtual directory, meaning there are files under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * $params include:
+        *     dir : storage directory
+        *
+        * @return bool|null Returns null on failure
+        * @since 1.20
+        */
+       abstract public function directoryExists( array $params );
+
+       /**
+        * Get an iterator to list *all* directories under a storage directory.
+        * If the directory is of the form "mwstore://backend/container",
+        * then all directories in the container should be listed.
+        * If the directory is of form "mwstore://backend/container/dir",
+        * then all directories directly under that directory should be listed.
+        * Results should be storage directories relative to the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * $params include:
+        *     dir     : storage directory
+        *     topOnly : only return direct child dirs of the directory
+        *
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       abstract public function getDirectoryList( array $params );
+
+       /**
+        * Same as FileBackend::getDirectoryList() except only lists
+        * directories that are immediately under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * $params include:
+        *     dir : storage directory
+        *
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       final public function getTopDirectoryList( array $params ) {
+               return $this->getDirectoryList( array( 'topOnly' => true ) + $params );
+       }
+
+       /**
+        * Get an iterator to list *all* stored files under a storage directory.
+        * If the directory is of the form "mwstore://backend/container",
         * then all files in the container should be listed.
         * If the directory is of form "mwstore://backend/container/dir",
-        * then all files under that container directory should be listed.
+        * then all files under that directory should be listed.
         * Results should be storage paths relative to the given directory.
-        * 
+        *
         * Storage backends with eventual consistency might return stale data.
-        * 
+        *
         * $params include:
-        *     dir : storage path directory
+        *     dir     : storage directory
+        *     topOnly : only return direct child files of the directory (@since 1.20)
         *
         * @return Traversable|Array|null Returns null on failure
         */
        abstract public function getFileList( array $params );
 
+       /**
+        * Same as FileBackend::getFileList() except only lists
+        * files that are immediately under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * $params include:
+        *     dir : storage directory
+        *
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       final public function getTopFileList( array $params ) {
+               return $this->getFileList( array( 'topOnly' => true ) + $params );
+       }
+
        /**
         * Invalidate any in-process file existence and property cache.
         * If $paths is given, then only the cache for those files will be cleared.
@@ -574,9 +660,9 @@ abstract class FileBackend {
        /**
         * Lock the files at the given storage paths in the backend.
         * This will either lock all the files or none (on failure).
-        * 
+        *
         * Callers should consider using getScopedFileLocks() instead.
-        * 
+        *
         * @param $paths Array Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
@@ -587,7 +673,7 @@ abstract class FileBackend {
 
        /**
         * Unlock the files at the given storage paths in the backend.
-        * 
+        *
         * @param $paths Array Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
@@ -600,10 +686,10 @@ abstract class FileBackend {
         * Lock the files at the given storage paths in the backend.
         * This will either lock all the files or none (on failure).
         * On failure, the status object will be updated with errors.
-        * 
+        *
         * Once the return value goes out scope, the locks will be released and
         * the status updated. Unlock fatals will not change the status "OK" value.
-        * 
+        *
         * @param $paths Array Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @param $status Status Status to update on lock/unlock
@@ -613,10 +699,21 @@ abstract class FileBackend {
                return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
        }
 
+       /**
+        * Get the root storage path of this backend.
+        * All container paths are "subdirectories" of this path.
+        *
+        * @return string Storage path
+        * @since 1.20
+        */
+       final public function getRootStoragePath() {
+               return "mwstore://{$this->name}";
+       }
+
        /**
         * Check if a given path is a "mwstore://" path.
         * This does not do any further validation or any existence checks.
-        * 
+        *
         * @param $path string
         * @return bool
         */
@@ -625,7 +722,7 @@ abstract class FileBackend {
        }
 
        /**
-        * Split a storage path into a backend name, a container name, 
+        * Split a storage path into a backend name, a container name,
         * and a relative file path. The relative path may be the empty string.
         * This does not do any path normalization or traversal checks.
         *
@@ -640,7 +737,7 @@ abstract class FileBackend {
                                if ( count( $parts ) == 3 ) {
                                        return $parts; // e.g. "backend/container/path"
                                } else {
-                                       return array( $parts[0], $parts[1], '' ); // e.g. "backend/container" 
+                                       return array( $parts[0], $parts[1], '' ); // e.g. "backend/container"
                                }
                        }
                }
@@ -650,9 +747,9 @@ abstract class FileBackend {
        /**
         * Normalize a storage path by cleaning up directory separators.
         * Returns null if the path is not of the format of a valid storage path.
-        * 
+        *
         * @param $storagePath string
-        * @return string|null 
+        * @return string|null
         */
        final public static function normalizeStoragePath( $storagePath ) {
                list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
@@ -671,7 +768,7 @@ abstract class FileBackend {
         * Get the parent storage directory of a storage path.
         * This returns a path like "mwstore://backend/container",
         * "mwstore://backend/container/...", or null if there is no parent.
-        * 
+        *
         * @param $storagePath string
         * @return string|null
         */
@@ -683,7 +780,7 @@ abstract class FileBackend {
 
        /**
         * Get the final extension from a storage or FS path
-        * 
+        *
         * @param $path string
         * @return string
         */
@@ -697,6 +794,7 @@ abstract class FileBackend {
         *
         * @param $path string
         * @return bool
+        * @since 1.20
         */
        final public static function isPathTraversalFree( $path ) {
                return ( self::normalizeContainerPath( $path ) !== null );
@@ -728,7 +826,7 @@ abstract class FileBackend {
                                strpos( $path, '../' ) === 0 ||
                                strpos( $path, '/./' ) !== false ||
                                strpos( $path, '/../' ) !== false
-                       ) { 
+                       ) {
                                return null;
                        }
                }
index 73815cf..69c227d 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * File backend registration handling.
+ *
+ * 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
  * @ingroup FileBackend
  * @author Aaron Schulz
@@ -21,7 +38,6 @@ class FileBackendGroup {
        protected $backends = array();
 
        protected function __construct() {}
-       protected function __clone() {}
 
        /**
         * @return FileBackendGroup
@@ -36,7 +52,7 @@ class FileBackendGroup {
 
        /**
         * Destroy the singleton instance
-        * 
+        *
         * @return void
         */
        public static function destroySingleton() {
@@ -45,7 +61,7 @@ class FileBackendGroup {
 
        /**
         * Register file backends from the global variables
-        * 
+        *
         * @return void
         */
        protected function initFromGlobals() {
index 9c3cf5b..769aef6 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Proxy backend that mirrors writes to several internal backends.
+ *
+ * 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
  * @ingroup FileBackend
  * @author Aaron Schulz
@@ -7,7 +24,7 @@
 
 /**
  * @brief Proxy backend that mirrors writes to several internal backends.
- * 
+ *
  * This class defines a multi-write backend. Multiple backends can be
  * registered to this proxy backend and it will act as a single backend.
  * Use this when all access to those backends is through this proxy backend.
@@ -84,8 +101,7 @@ class FileBackendMultiWrite extends FileBackend {
                $status = Status::newGood();
 
                $performOps = array(); // list of FileOp objects
-               $filesRead = array(); // storage paths read from
-               $filesChanged = array(); // storage paths written to
+               $paths = array(); // storage paths read from or written to
                // Build up a list of FileOps. The list will have all the ops
                // for one backend, then all the ops for the next, and so on.
                // These batches of ops are all part of a continuous array.
@@ -93,29 +109,23 @@ class FileBackendMultiWrite extends FileBackend {
                foreach ( $this->backends as $index => $backend ) {
                        $backendOps = $this->substOpBatchPaths( $ops, $backend );
                        // Add on the operation batch for this backend
-                       $performOps = array_merge( $performOps, $backend->getOperations( $backendOps ) );
+                       $performOps = array_merge( $performOps,
+                               $backend->getOperationsInternal( $backendOps ) );
                        if ( $index == 0 ) { // first batch
                                // Get the files used for these operations. Each backend has a batch of
                                // the same operations, so we only need to get them from the first batch.
-                               foreach ( $performOps as $fileOp ) {
-                                       $filesRead = array_merge( $filesRead, $fileOp->storagePathsRead() );
-                                       $filesChanged = array_merge( $filesChanged, $fileOp->storagePathsChanged() );
-                               }
+                               $paths = $backend->getPathsToLockForOpsInternal( $performOps );
                                // Get the paths under the proxy backend's name
-                               $filesRead = $this->unsubstPaths( $filesRead );
-                               $filesChanged = $this->unsubstPaths( $filesChanged );
+                               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
+                               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
                        }
                }
 
                // Try to lock those files for the scope of this function...
                if ( empty( $opts['nonLocking'] ) ) {
-                       $filesLockSh = array_diff( $filesRead, $filesChanged ); // optimization
-                       $filesLockEx = $filesChanged;
-                       // Get a shared lock on the parent directory of each path changed
-                       $filesLockSh = array_merge( $filesLockSh, array_map( 'dirname', $filesLockEx ) );
                        // Try to lock those files for the scope of this function...
-                       $scopeLockS = $this->getScopedFileLocks( $filesLockSh, LockManager::LOCK_UW, $status );
-                       $scopeLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
+                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
                        if ( !$status->isOK() ) {
                                return $status; // abort
                        }
@@ -126,7 +136,7 @@ class FileBackendMultiWrite extends FileBackend {
 
                // Do a consistency check to see if the backends agree
                if ( count( $this->backends ) > 1 ) {
-                       $status->merge( $this->consistencyCheck( array_merge( $filesRead, $filesChanged ) ) );
+                       $status->merge( $this->consistencyCheck( array_merge( $paths['sh'], $paths['ex'] ) ) );
                        if ( !$status->isOK() ) {
                                return $status; // abort
                        }
@@ -220,7 +230,7 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Substitute the backend name in storage path parameters
         * for a set of operations with that of a given internal backend.
-        * 
+        *
         * @param $ops Array List of file operation arrays
         * @param $backend FileBackendStore
         * @return Array
@@ -241,7 +251,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * Same as substOpBatchPaths() but for a single operation
-        * 
+        *
         * @param $op File operation array
         * @param $backend FileBackendStore
         * @return Array
@@ -253,7 +263,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * Substitute the backend of storage paths with an internal backend's name
-        * 
+        *
         * @param $paths Array|string List of paths or single string path
         * @param $backend FileBackendStore
         * @return Array|string
@@ -268,7 +278,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * Substitute the backend of internal storage paths with the proxy backend's name
-        * 
+        *
         * @param $paths Array|string List of paths or single string path
         * @return Array|string
         */
@@ -320,7 +330,7 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        /**
-        * @see FileBackend::getFileList()
+        * @see FileBackend::concatenate()
         */
        public function concatenate( array $params ) {
                // We are writing to an FS file, so we don't need to do this per-backend
@@ -408,6 +418,22 @@ class FileBackendMultiWrite extends FileBackend {
                return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
        }
 
+       /**
+        * @see FileBackend::directoryExists()
+        */
+       public function directoryExists( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->directoryExists( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getSubdirectoryList()
+        */
+       public function getDirectoryList( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getDirectoryList( $realParams );
+       }
+
        /**
         * @see FileBackend::getFileList()
         */
index 55dedc1..30a64e2 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Base class for all backends using particular storage medium.
+ *
+ * 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
  * @ingroup FileBackend
  * @author Aaron Schulz
  * @since 1.19
  */
 abstract class FileBackendStore extends FileBackend {
+       /** @var BagOStuff */
+       protected $memCache;
+
        /** @var Array Map of paths to small (RAM/disk) cache items */
        protected $cache = array(); // (storage path => key => value)
-       protected $maxCacheSize = 100; // integer; max paths with entries
+       protected $maxCacheSize = 300; // integer; max paths with entries
        /** @var Array Map of paths to large (RAM/disk) cache items */
        protected $expensiveCache = array(); // (storage path => key => value)
-       protected $maxExpensiveCacheSize = 10; // integer; max paths with entries
+       protected $maxExpensiveCacheSize = 5; // integer; max paths with entries
 
        /** @var Array Map of container names to sharding settings */
        protected $shardViaHashLevels = array(); // (container name => config array)
 
        protected $maxFileSize = 4294967296; // integer bytes (4GiB)
 
+       /**
+        * @see FileBackend::__construct()
+        *
+        * @param $config Array
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+               $this->memCache = new EmptyBagOStuff(); // disabled by default
+       }
+
        /**
         * Get the maximum allowable file size given backend
         * medium restrictions and basic performance constraints.
@@ -73,6 +103,7 @@ abstract class FileBackendStore extends FileBackend {
                } else {
                        $status = $this->doCreateInternal( $params );
                        $this->clearCache( array( $params['dst'] ) );
+                       $this->deleteFileCache( $params['dst'] ); // persistent cache
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -104,6 +135,7 @@ abstract class FileBackendStore extends FileBackend {
                } else {
                        $status = $this->doStoreInternal( $params );
                        $this->clearCache( array( $params['dst'] ) );
+                       $this->deleteFileCache( $params['dst'] ); // persistent cache
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -132,6 +164,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = $this->doCopyInternal( $params );
                $this->clearCache( array( $params['dst'] ) );
+               $this->deleteFileCache( $params['dst'] ); // persistent cache
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $status;
@@ -158,6 +191,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = $this->doDeleteInternal( $params );
                $this->clearCache( array( $params['src'] ) );
+               $this->deleteFileCache( $params['src'] ); // persistent cache
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $status;
@@ -185,6 +219,8 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = $this->doMoveInternal( $params );
                $this->clearCache( array( $params['src'], $params['dst'] ) );
+               $this->deleteFileCache( $params['src'] ); // persistent cache
+               $this->deleteFileCache( $params['dst'] ); // persistent cache
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $status;
@@ -371,6 +407,17 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = Status::newGood();
 
+               // Recursive: first delete all empty subdirs recursively
+               if ( !empty( $params['recursive'] ) && !$this->directoriesAreVirtual() ) {
+                       $subDirsRel = $this->getTopDirectoryList( array( 'dir' => $params['dir'] ) );
+                       if ( $subDirsRel !== null ) { // no errors
+                               foreach ( $subDirsRel as $subDirRel ) {
+                                       $subDir = $params['dir'] . "/{$subDirRel}"; // full path
+                                       $status->merge( $this->doClean( array( 'dir' => $subDir ) + $params ) );
+                               }
+                       }
+               }
+
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
@@ -390,11 +437,13 @@ abstract class FileBackendStore extends FileBackend {
 
                if ( $shard !== null ) { // confined to a single container/shard
                        $status->merge( $this->doCleanInternal( $fullCont, $dir, $params ) );
+                       $this->deleteContainerCache( $fullCont ); // purge cache
                } else { // directory is on several shards
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
                        list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
                        foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
                                $status->merge( $this->doCleanInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+                               $this->deleteContainerCache( "{$fullCont}{$suffix}" ); // purge cache
                        }
                }
 
@@ -463,7 +512,10 @@ abstract class FileBackendStore extends FileBackend {
                        wfProfileOut( __METHOD__ );
                        return false; // invalid storage path
                }
-               $latest = !empty( $params['latest'] );
+               $latest = !empty( $params['latest'] ); // use latest data?
+               if ( !isset( $this->cache[$path]['stat'] ) ) {
+                       $this->primeFileCache( array( $path ) ); // check persistent cache
+               }
                if ( isset( $this->cache[$path]['stat'] ) ) {
                        // If we want the latest data, check that this cached
                        // value was in fact fetched with the latest available data.
@@ -480,9 +532,10 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileOut( __METHOD__ . '-miss-' . $this->name );
                wfProfileOut( __METHOD__ . '-miss' );
                if ( is_array( $stat ) ) { // don't cache negatives
+                       $stat['latest'] = $latest;
                        $this->trimCache(); // limit memory
                        $this->cache[$path]['stat'] = $stat;
-                       $this->cache[$path]['stat']['latest'] = $latest;
+                       $this->setFileCache( $path, $stat ); // update persistent cache
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -646,8 +699,79 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        /**
-        * @copydoc FileBackend::getFileList()
-        * @return Array|null|Traversable
+        * @see FileBackend::directoryExists()
+        * @return bool|null
+        */
+       final public function directoryExists( array $params ) {
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) {
+                       return false; // invalid storage path
+               }
+               if ( $shard !== null ) { // confined to a single container/shard
+                       return $this->doDirectoryExists( $fullCont, $dir, $params );
+               } else { // directory is on several shards
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       $res = false; // response
+                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+                               $exists = $this->doDirectoryExists( "{$fullCont}{$suffix}", $dir, $params );
+                               if ( $exists ) {
+                                       $res = true;
+                                       break; // found one!
+                               } elseif ( $exists === null ) { // error?
+                                       $res = null; // if we don't find anything, it is indeterminate
+                               }
+                       }
+                       return $res;
+               }
+       }
+
+       /**
+        * @see FileBackendStore::directoryExists()
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return bool|null
+        */
+       abstract protected function doDirectoryExists( $container, $dir, array $params );
+
+       /**
+        * @see FileBackend::getDirectoryList()
+        * @return Traversable|Array|null Returns null on failure
+        */
+       final public function getDirectoryList( array $params ) {
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) { // invalid storage path
+                       return null;
+               }
+               if ( $shard !== null ) {
+                       // File listing is confined to a single container/shard
+                       return $this->getDirectoryListInternal( $fullCont, $dir, $params );
+               } else {
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       // File listing spans multiple containers/shards
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       return new FileBackendStoreShardDirIterator( $this,
+                               $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
+               }
+       }
+
+       /**
+        * Do not call this function from places outside FileBackend
+        *
+        * @see FileBackendStore::getDirectoryList()
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return Traversable|Array|null Returns null on failure
+        */
+       abstract public function getDirectoryListInternal( $container, $dir, array $params );
+
+       /**
+        * @see FileBackend::getFileList()
+        * @return Traversable|Array|null Returns null on failure
         */
        final public function getFileList( array $params ) {
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
@@ -661,7 +785,7 @@ abstract class FileBackendStore extends FileBackend {
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
                        // File listing spans multiple containers/shards
                        list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
-                       return new FileBackendStoreShardListIterator( $this,
+                       return new FileBackendStoreShardFileIterator( $this,
                                $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
                }
        }
@@ -674,7 +798,7 @@ abstract class FileBackendStore extends FileBackend {
         * @param $container string Resolved container name
         * @param $dir string Resolved path relative to container
         * @param $params Array
-        * @return Traversable|Array|null
+        * @return Traversable|Array|null Returns null on failure
         */
        abstract public function getFileListInternal( $container, $dir, array $params );
 
@@ -705,7 +829,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Array List of FileOp objects
         * @throws MWException
         */
-       final public function getOperations( array $ops ) {
+       final public function getOperationsInternal( array $ops ) {
                $supportedOps = $this->supportedOperations();
 
                $performOps = array(); // array of FileOp objects
@@ -719,13 +843,36 @@ abstract class FileBackendStore extends FileBackend {
                                // Append the FileOp class
                                $performOps[] = new $class( $this, $params );
                        } else {
-                               throw new MWException( "Operation `$opName` is not supported." );
+                               throw new MWException( "Operation '$opName' is not supported." );
                        }
                }
 
                return $performOps;
        }
 
+       /**
+        * Get a list of storage paths to lock for a list of operations
+        * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
+        * each corresponding to a list of storage paths to be locked.
+        *
+        * @param $performOps Array List of FileOp objects
+        * @return Array ('sh' => list of paths, 'ex' => list of paths)
+        */
+       final public function getPathsToLockForOpsInternal( array $performOps ) {
+               // Build up a list of files to lock...
+               $paths = array( 'sh' => array(), 'ex' => array() );
+               foreach ( $performOps as $fileOp ) {
+                       $paths['sh'] = array_merge( $paths['sh'], $fileOp->storagePathsRead() );
+                       $paths['ex'] = array_merge( $paths['ex'], $fileOp->storagePathsChanged() );
+               }
+               // Optimization: if doing an EX lock anyway, don't also set an SH one
+               $paths['sh'] = array_diff( $paths['sh'], $paths['ex'] );
+               // Get a shared lock on the parent directory of each path changed
+               $paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) );
+
+               return $paths;
+       }
+
        /**
         * @see FileBackend::doOperationsInternal()
         * @return Status
@@ -736,23 +883,15 @@ abstract class FileBackendStore extends FileBackend {
                $status = Status::newGood();
 
                // Build up a list of FileOps...
-               $performOps = $this->getOperations( $ops );
+               $performOps = $this->getOperationsInternal( $ops );
 
                // Acquire any locks as needed...
                if ( empty( $opts['nonLocking'] ) ) {
                        // Build up a list of files to lock...
-                       $filesLockEx = $filesLockSh = array();
-                       foreach ( $performOps as $fileOp ) {
-                               $filesLockSh = array_merge( $filesLockSh, $fileOp->storagePathsRead() );
-                               $filesLockEx = array_merge( $filesLockEx, $fileOp->storagePathsChanged() );
-                       }
-                       // Optimization: if doing an EX lock anyway, don't also set an SH one
-                       $filesLockSh = array_diff( $filesLockSh, $filesLockEx );
-                       // Get a shared lock on the parent directory of each path changed
-                       $filesLockSh = array_merge( $filesLockSh, array_map( 'dirname', $filesLockEx ) );
+                       $paths = $this->getPathsToLockForOpsInternal( $performOps );
                        // Try to lock those files for the scope of this function...
-                       $scopeLockS = $this->getScopedFileLocks( $filesLockSh, LockManager::LOCK_UW, $status );
-                       $scopeLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
+                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
                        if ( !$status->isOK() ) {
                                wfProfileOut( __METHOD__ . '-' . $this->name );
                                wfProfileOut( __METHOD__ );
@@ -760,9 +899,13 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               // Clear any cache entries (after locks acquired)
+               // Clear any file cache entries (after locks acquired)
                $this->clearCache();
 
+               // Load from the persistent file and container caches
+               $this->primeFileCache( $performOps );
+               $this->primeContainerCache( $performOps );
+
                // Actually attempt the operation batch...
                $subStatus = FileOp::attemptBatch( $performOps, $opts, $this->fileJournal );
 
@@ -805,10 +948,20 @@ abstract class FileBackendStore extends FileBackend {
         */
        protected function doClearCache( array $paths = null ) {}
 
+       /**
+        * Is this a key/value store where directories are just virtual?
+        * Virtual directories exists in so much as files exists that are
+        * prefixed with the directory path followed by a forward slash.
+        *
+        * @return bool
+        */
+       abstract protected function directoriesAreVirtual();
+
        /**
         * Move a cache entry to the top (such as when accessed)
         *
         * @param $path string Storage path
+        * @return void
         */
        protected function pingCache( $path ) {
                if ( isset( $this->cache[$path] ) ) {
@@ -834,6 +987,7 @@ abstract class FileBackendStore extends FileBackend {
         * Move a cache entry to the top (such as when accessed)
         *
         * @param $path string Storage path
+        * @return void
         */
        protected function pingExpensiveCache( $path ) {
                if ( isset( $this->expensiveCache[$path] ) ) {
@@ -962,6 +1116,19 @@ abstract class FileBackendStore extends FileBackend {
                return ''; // no sharding
        }
 
+       /**
+        * Check if a storage path maps to a single shard.
+        * Container dirs like "a", where the container shards on "x/xy",
+        * can reside on several shards. Such paths are tricky to handle.
+        *
+        * @param $storagePath string Storage path
+        * @return bool
+        */
+       final public function isSingleShardPathInternal( $storagePath ) {
+               list( $c, $r, $shard ) = $this->resolveStoragePath( $storagePath );
+               return ( $shard !== null );
+       }
+
        /**
         * Get the sharding config for a container.
         * If greater than 0, then all file storage paths within
@@ -1041,29 +1208,198 @@ abstract class FileBackendStore extends FileBackend {
        protected function resolveContainerPath( $container, $relStoragePath ) {
                return $relStoragePath;
        }
+
+       /**
+        * Get the cache key for a container
+        *
+        * @param $container Resolved container name
+        * @return string
+        */
+       private function containerCacheKey( $container ) {
+               return wfMemcKey( 'backend', $this->getName(), 'container', $container );
+       }
+
+       /**
+        * Set the cached info for a container
+        *
+        * @param $container Resolved container name
+        * @param $val mixed Information to cache
+        * @return void
+        */
+       final protected function setContainerCache( $container, $val ) {
+               $this->memCache->set( $this->containerCacheKey( $container ), $val, 14*86400 );
+       }
+
+       /**
+        * Delete the cached info for a container
+        *
+        * @param $container Resolved container name
+        * @return void
+        */
+       final protected function deleteContainerCache( $container ) {
+               for ( $attempts=1; $attempts <= 3; $attempts++ ) {
+                       if ( $this->memCache->delete( $this->containerCacheKey( $container ) ) ) {
+                               return; // done!
+                       }
+               }
+               trigger_error( "Unable to delete stat cache for container $container." );
+       }
+
+       /**
+        * Do a batch lookup from cache for container stats for all containers
+        * used in a list of container names, storage paths, or FileOp objects.
+        *
+        * @param $items Array
+        * @return void
+        */
+       final protected function primeContainerCache( array $items ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $paths = array(); // list of storage paths
+               $contNames = array(); // (cache key => resolved container name)
+               // Get all the paths/containers from the items...
+               foreach ( $items as $item ) {
+                       if ( $item instanceof FileOp ) {
+                               $paths = array_merge( $paths, $item->storagePathsRead() );
+                               $paths = array_merge( $paths, $item->storagePathsChanged() );
+                       } elseif ( self::isStoragePath( $item ) ) {
+                               $paths[] = $item;
+                       } elseif ( is_string( $item ) ) { // full container name
+                               $contNames[$this->containerCacheKey( $item )] = $item;
+                       }
+               }
+               // Get all the corresponding cache keys for paths...
+               foreach ( $paths as $path ) {
+                       list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+                       if ( $fullCont !== null ) { // valid path for this backend
+                               $contNames[$this->containerCacheKey( $fullCont )] = $fullCont;
+                       }
+               }
+
+               $contInfo = array(); // (resolved container name => cache value)
+               // Get all cache entries for these container cache keys...
+               $values = $this->memCache->getBatch( array_keys( $contNames ) );
+               foreach ( $values as $cacheKey => $val ) {
+                       $contInfo[$contNames[$cacheKey]] = $val;
+               }
+
+               // Populate the container process cache for the backend...
+               $this->doPrimeContainerCache( array_filter( $contInfo, 'is_array' ) );
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Fill the backend-specific process cache given an array of
+        * resolved container names and their corresponding cached info.
+        * Only containers that actually exist should appear in the map.
+        *
+        * @param $containerInfo Array Map of resolved container names to cached info
+        * @return void
+        */
+       protected function doPrimeContainerCache( array $containerInfo ) {}
+
+       /**
+        * Get the cache key for a file path
+        *
+        * @param $path Storage path
+        * @return string
+        */
+       private function fileCacheKey( $path ) {
+               return wfMemcKey( 'backend', $this->getName(), 'file', sha1( $path ) );
+       }
+
+       /**
+        * Set the cached stat info for a file path
+        *
+        * @param $path Storage path
+        * @param $val mixed Information to cache
+        * @return void
+        */
+       final protected function setFileCache( $path, $val ) {
+               $this->memCache->set( $this->fileCacheKey( $path ), $val, 7*86400 );
+       }
+
+       /**
+        * Delete the cached stat info for a file path
+        *
+        * @param $path Storage path
+        * @return void
+        */
+       final protected function deleteFileCache( $path ) {
+               for ( $attempts=1; $attempts <= 3; $attempts++ ) {
+                       if ( $this->memCache->delete( $this->fileCacheKey( $path ) ) ) {
+                               return; // done!
+                       }
+               }
+               trigger_error( "Unable to delete stat cache for file $path." );
+       }
+
+       /**
+        * Do a batch lookup from cache for file stats for all paths
+        * used in a list of storage paths or FileOp objects.
+        *
+        * @param $items Array List of storage paths or FileOps
+        * @return void
+        */
+       final protected function primeFileCache( array $items ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $paths = array(); // list of storage paths
+               $pathNames = array(); // (cache key => storage path)
+               // Get all the paths/containers from the items...
+               foreach ( $items as $item ) {
+                       if ( $item instanceof FileOp ) {
+                               $paths = array_merge( $paths, $item->storagePathsRead() );
+                               $paths = array_merge( $paths, $item->storagePathsChanged() );
+                       } elseif ( self::isStoragePath( $item ) ) {
+                               $paths[] = $item;
+                       }
+               }
+               // Get all the corresponding cache keys for paths...
+               foreach ( $paths as $path ) {
+                       list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
+                       if ( $rel !== null ) { // valid path for this backend
+                               $pathNames[$this->fileCacheKey( $path )] = $path;
+                       }
+               }
+               // Get all cache entries for these container cache keys...
+               $values = $this->memCache->getBatch( array_keys( $pathNames ) );
+               foreach ( $values as $cacheKey => $val ) {
+                       if ( is_array( $val ) ) {
+                               $this->trimCache(); // limit memory
+                               $this->cache[$pathNames[$cacheKey]]['stat'] = $val;
+                       }
+               }
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+       }
 }
 
 /**
- * FileBackendStore helper function to handle file listings that span container shards.
+ * FileBackendStore helper function to handle listings that span container shards.
  * Do not use this class from places outside of FileBackendStore.
  *
  * @ingroup FileBackend
  */
-class FileBackendStoreShardListIterator implements Iterator {
-       /* @var FileBackendStore */
+abstract class FileBackendStoreShardListIterator implements Iterator {
+       /** @var FileBackendStore */
        protected $backend;
-       /* @var Array */
+       /** @var Array */
        protected $params;
-       /* @var Array */
+       /** @var Array */
        protected $shardSuffixes;
-       protected $container; // string
-       protected $directory; // string
+       protected $container; // string; full container name
+       protected $directory; // string; resolved relative path
 
-       /* @var Traversable */
+       /** @var Traversable */
        protected $iter;
        protected $curShard = 0; // integer
        protected $pos = 0; // integer
 
+       /** @var Array */
+       protected $multiShardPaths = array(); // (rel path => 1)
+
        /**
         * @param $backend FileBackendStore
         * @param $container string Full storage container name
@@ -1112,6 +1448,8 @@ class FileBackendStoreShardListIterator implements Iterator {
                } else {
                        $this->iter->next();
                }
+               // Filter out items that we already listed
+               $this->filterViaNext();
                // Find the next non-empty shard if no elements are left
                $this->nextShardIteratorIfNotValid();
        }
@@ -1124,6 +1462,8 @@ class FileBackendStoreShardListIterator implements Iterator {
                $this->pos = 0;
                $this->curShard = 0;
                $this->setIteratorFromCurrentShard();
+               // Filter out items that we already listed
+               $this->filterViaNext();
                // Find the next non-empty shard if this one has no elements
                $this->nextShardIteratorIfNotValid();
        }
@@ -1133,7 +1473,7 @@ class FileBackendStoreShardListIterator implements Iterator {
         * @return bool
         */
        public function valid() {
-               if ( $this->iter == null ) {
+               if ( $this->iter === null ) {
                        return false; // some failure?
                } elseif ( is_array( $this->iter ) ) {
                        return ( current( $this->iter ) !== false ); // no paths can have this value
@@ -1142,6 +1482,25 @@ class FileBackendStoreShardListIterator implements Iterator {
                }
        }
 
+       /**
+        * Filter out duplicate items by advancing to the next ones
+        */
+       protected function filterViaNext() {
+               while ( $this->iter->valid() ) {
+                       $rel = $this->iter->current(); // path relative to given directory
+                       $path = $this->params['dir'] . "/{$rel}"; // full storage path
+                       if ( !$this->backend->isSingleShardPathInternal( $path ) ) {
+                               // Don't keep listing paths that are on multiple shards
+                               if ( isset( $this->multiShardPaths[$rel] ) ) {
+                                       $this->iter->next(); // we already listed this path
+                               } else {
+                                       $this->multiShardPaths[$rel] = 1;
+                                       break;
+                               }
+                       }
+               }
+       }
+
        /**
         * If the list iterator for this container shard is out of items,
         * then move on to the next container that has items.
@@ -1161,7 +1520,35 @@ class FileBackendStoreShardListIterator implements Iterator {
         */
        protected function setIteratorFromCurrentShard() {
                $suffix = $this->shardSuffixes[$this->curShard];
-               $this->iter = $this->backend->getFileListInternal(
+               $this->iter = $this->listFromShard(
                        "{$this->container}{$suffix}", $this->directory, $this->params );
        }
+
+       /**
+        * Get the list for a given container shard
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return Traversable|Array|null
+        */
+       abstract protected function listFromShard( $container, $dir, array $params );
+}
+
+/**
+ * Iterator for listing directories
+ */
+class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator {
+       protected function listFromShard( $container, $dir, array $params ) {
+               return $this->backend->getDirectoryListInternal( $container, $dir, $params );
+       }
+}
+
+/**
+ * Iterator for listing regular files
+ */
+class FileBackendStoreShardFileIterator extends FileBackendStoreShardListIterator {
+       protected function listFromShard( $container, $dir, array $params ) {
+               return $this->backend->getFileListInternal( $container, $dir, $params );
+       }
 }
index 9c9f3e2..8a2d428 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Helper class for representing operations with transaction support.
+ *
+ * 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
  * @ingroup FileBackend
  * @author Aaron Schulz
index 3ad78e3..f40c323 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * OpenStack Swift based file backend.
+ *
+ * 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
  * @ingroup FileBackend
  * @author Russ Nelson
@@ -24,7 +41,7 @@ class SwiftFileBackend extends FileBackendStore {
        protected $auth; // Swift authentication handler
        protected $authTTL; // integer seconds
        protected $swiftAnonUser; // string; username to handle unauthenticated requests
-       protected $maxContCacheSize = 100; // integer; max containers with entries
+       protected $maxContCacheSize = 300; // integer; max containers with entries
 
        /** @var CF_Connection */
        protected $conn; // Swift connection handle
@@ -42,28 +59,30 @@ class SwiftFileBackend extends FileBackendStore {
         *    shardViaHashLevels : Map of container names to sharding config with:
         *                         'base'   : base of hash characters, 16 or 36
         *                         'levels' : the number of hash levels (and digits)
-        *                         'repeat' : hash subdirectories are prefixed with all the 
+        *                         'repeat' : hash subdirectories are prefixed with all the
         *                                    parent hash directory names (e.g. "a/ab/abc")
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
                // Required settings
                $this->auth = new CF_Authentication(
-                       $config['swiftUser'], 
-                       $config['swiftKey'], 
+                       $config['swiftUser'],
+                       $config['swiftKey'],
                        null, // account; unused
-                       $config['swiftAuthUrl'] 
+                       $config['swiftAuthUrl']
                );
                // Optional settings
                $this->authTTL = isset( $config['swiftAuthTTL'] )
                        ? $config['swiftAuthTTL']
-                       : 120; // some sane number
+                       : 5 * 60; // some sane number
                $this->swiftAnonUser = isset( $config['swiftAnonUser'] )
                        ? $config['swiftAnonUser']
                        : '';
                $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
                        ? $config['shardViaHashLevels']
                        : '';
+               // Cache container info to mask latency
+               $this->memCache = wfGetMainCache();
        }
 
        /**
@@ -116,7 +135,7 @@ class SwiftFileBackend extends FileBackendStore {
                try {
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -179,7 +198,7 @@ class SwiftFileBackend extends FileBackendStore {
                try {
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -255,7 +274,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $sContObj = $this->getContainer( $srcCont );
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -480,7 +499,7 @@ class SwiftFileBackend extends FileBackendStore {
 
        /**
         * Fill in any missing object metadata and save it to Swift
-        * 
+        *
         * @param $obj CF_Object
         * @param $path string Storage path to object
         * @return bool Success
@@ -535,32 +554,137 @@ class SwiftFileBackend extends FileBackendStore {
                return $data;
        }
 
+       /**
+        * @see FileBackendStore::doDirectoryExists()
+        * @return bool|null
+        */
+       protected function doDirectoryExists( $fullCont, $dir, array $params ) {
+               try {
+                       $container = $this->getContainer( $fullCont );
+                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
+                       return ( count( $container->list_objects( 1, null, $prefix ) ) > 0 );
+               } catch ( NoSuchContainerException $e ) {
+                       return false;
+               } catch ( InvalidResponseException $e ) {
+               } catch ( Exception $e ) { // some other exception?
+                       $this->logException( $e, __METHOD__, array( 'cont' => $fullCont, 'dir' => $dir ) );
+               }
+
+               return null; // error
+       }
+
+       /**
+        * @see FileBackendStore::getDirectoryListInternal()
+        * @return SwiftFileBackendDirList
+        */
+       public function getDirectoryListInternal( $fullCont, $dir, array $params ) {
+               return new SwiftFileBackendDirList( $this, $fullCont, $dir, $params );
+       }
+
        /**
         * @see FileBackendStore::getFileListInternal()
         * @return SwiftFileBackendFileList
         */
        public function getFileListInternal( $fullCont, $dir, array $params ) {
-               return new SwiftFileBackendFileList( $this, $fullCont, $dir );
+               return new SwiftFileBackendFileList( $this, $fullCont, $dir, $params );
        }
 
        /**
         * Do not call this function outside of SwiftFileBackendFileList
-        * 
+        *
         * @param $fullCont string Resolved container name
         * @param $dir string Resolved storage directory with no trailing slash
-        * @param $after string Storage path of file to list items after
+        * @param $after string|null Storage path of file to list items after
         * @param $limit integer Max number of items to list
-        * @return Array
+        * @param $params Array Includes flag for 'topOnly'
+        * @return Array List of relative paths of dirs directly under $dir
+        */
+       public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
+               $dirs = array();
+
+               try {
+                       $container = $this->getContainer( $fullCont );
+                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
+                       // Non-recursive: only list dirs right under $dir
+                       if ( !empty( $params['topOnly'] ) ) {
+                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+                               foreach ( $objects as $object ) { // files and dirs
+                                       if ( substr( $object, -1 ) === '/' ) {
+                                               $dirs[] = $object; // directories end in '/'
+                                       }
+                                       $after = $object; // update last item
+                               }
+                       // Recursive: list all dirs under $dir and its subdirs
+                       } else {
+                               // Get directory from last item of prior page
+                               $lastDir = $this->getParentDir( $after ); // must be first page
+                               $objects = $container->list_objects( $limit, $after, $prefix );
+                               foreach ( $objects as $object ) { // files
+                                       $objectDir = $this->getParentDir( $object ); // directory of object
+                                       if ( $objectDir !== false ) { // file has a parent dir
+                                               // Swift stores paths in UTF-8, using binary sorting.
+                                               // See function "create_container_table" in common/db.py.
+                                               // If a directory is not "greater" than the last one,
+                                               // then it was already listed by the calling iterator.
+                                               if ( $objectDir > $lastDir ) {
+                                                       $pDir = $objectDir;
+                                                       do { // add dir and all its parent dirs
+                                                               $dirs[] = "{$pDir}/";
+                                                               $pDir = $this->getParentDir( $pDir );
+                                                       } while ( $pDir !== false // sanity
+                                                               && $pDir > $lastDir // not done already
+                                                               && strlen( $pDir ) > strlen( $dir ) // within $dir
+                                                       );
+                                               }
+                                               $lastDir = $objectDir;
+                                       }
+                                       $after = $object; // update last item
+                               }
+                       }
+               } catch ( NoSuchContainerException $e ) {
+               } catch ( InvalidResponseException $e ) {
+               } catch ( Exception $e ) { // some other exception?
+                       $this->logException( $e, __METHOD__, array( 'cont' => $fullCont, 'dir' => $dir ) );
+               }
+
+               return $dirs;
+       }
+
+       protected function getParentDir( $path ) {
+               return ( strpos( $path, '/' ) !== false ) ? dirname( $path ) : false;
+       }
+
+       /**
+        * Do not call this function outside of SwiftFileBackendFileList
+        *
+        * @param $fullCont string Resolved container name
+        * @param $dir string Resolved storage directory with no trailing slash
+        * @param $after string|null Storage path of file to list items after
+        * @param $limit integer Max number of items to list
+        * @param $params Array Includes flag for 'topOnly'
+        * @return Array List of relative paths of files under $dir
         */
-       public function getFileListPageInternal( $fullCont, $dir, $after, $limit ) {
+       public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
                $files = array();
 
                try {
                        $container = $this->getContainer( $fullCont );
                        $prefix = ( $dir == '' ) ? null : "{$dir}/";
-                       $files = $container->list_objects( $limit, $after, $prefix );
+                       // Non-recursive: only list files right under $dir
+                       if ( !empty( $params['topOnly'] ) ) { // files and dirs
+                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+                               foreach ( $objects as $object ) {
+                                       if ( substr( $object, -1 ) !== '/' ) {
+                                               $files[] = $object; // directories end in '/'
+                                       }
+                               }
+                       // Recursive: list all files under $dir and its subdirs
+                       } else { // files
+                               $files = $container->list_objects( $limit, $after, $prefix );
+                       }
+                       $after = end( $files ); // update last item
+                       reset( $files ); // reset pointer
                } catch ( NoSuchContainerException $e ) {
-               } catch ( NoSuchObjectException $e ) {
                } catch ( InvalidResponseException $e ) {
                } catch ( Exception $e ) { // some other exception?
                        $this->logException( $e, __METHOD__, array( 'cont' => $fullCont, 'dir' => $dir ) );
@@ -573,7 +697,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @see FileBackendStore::doGetFileSha1base36()
         * @return bool
         */
-       public function doGetFileSha1base36( array $params ) {
+       protected function doGetFileSha1base36( array $params ) {
                $stat = $this->getFileStat( $params );
                if ( $stat ) {
                        return $stat['sha1'];
@@ -665,13 +789,21 @@ class SwiftFileBackend extends FileBackendStore {
                return $tmpFile;
        }
 
+       /**
+        * @see FileBackendStore::directoriesAreVirtual()
+        * @return bool
+        */
+       protected function directoriesAreVirtual() {
+               return true;
+       }
+
        /**
         * Get headers to send to Swift when reading a file based
-        * on a FileBackend params array, e.g. that of getLocalCopy(). 
+        * on a FileBackend params array, e.g. that of getLocalCopy().
         * $params is currently only checked for a 'latest' flag.
-        * 
+        *
         * @param $params Array
-        * @return Array 
+        * @return Array
         */
        protected function headersFromParams( array $params ) {
                $hdrs = array();
@@ -751,23 +883,30 @@ class SwiftFileBackend extends FileBackendStore {
         * Use $reCache if the file count or byte count is needed.
         *
         * @param $container string Container name
-        * @param $reCache bool Refresh the process cache
+        * @param $bypassCache bool Bypass all caches and load from Swift
         * @return CF_Container
+        * @throws InvalidResponseException
         */
-       protected function getContainer( $container, $reCache = false ) {
+       protected function getContainer( $container, $bypassCache = false ) {
                $conn = $this->getConnection(); // Swift proxy connection
-               if ( $reCache ) {
-                       unset( $this->connContainers[$container] ); // purge cache
+               if ( $bypassCache ) { // purge cache
+                       unset( $this->connContainers[$container] );
+               } elseif ( !isset( $this->connContainers[$container] ) ) {
+                       $this->primeContainerCache( array( $container ) ); // check persistent cache
                }
                if ( !isset( $this->connContainers[$container] ) ) {
                        $contObj = $conn->get_container( $container );
                        // NoSuchContainerException not thrown: container must exist
                        if ( count( $this->connContainers ) >= $this->maxContCacheSize ) { // trim cache?
                                reset( $this->connContainers );
-                               $key = key( $this->connContainers );
-                               unset( $this->connContainers[$key] );
+                               unset( $this->connContainers[key( $this->connContainers )] );
                        }
                        $this->connContainers[$container] = $contObj; // cache it
+                       if ( !$bypassCache ) {
+                               $this->setContainerCache( $container, // update persistent cache
+                                       array( 'bytes' => $contObj->bytes_used, 'count' => $contObj->object_count )
+                               );
+                       }
                }
                return $this->connContainers[$container];
        }
@@ -777,6 +916,7 @@ class SwiftFileBackend extends FileBackendStore {
         *
         * @param $container string Container name
         * @return CF_Container
+        * @throws InvalidResponseException
         */
        protected function createContainer( $container ) {
                $conn = $this->getConnection(); // Swift proxy connection
@@ -790,6 +930,7 @@ class SwiftFileBackend extends FileBackendStore {
         *
         * @param $container string Container name
         * @return void
+        * @throws InvalidResponseException
         */
        protected function deleteContainer( $container ) {
                $conn = $this->getConnection(); // Swift proxy connection
@@ -797,9 +938,31 @@ class SwiftFileBackend extends FileBackendStore {
                unset( $this->connContainers[$container] ); // purge cache
        }
 
+       /**
+        * @see FileBackendStore::doPrimeContainerCache()
+        * @return void
+        */
+       protected function doPrimeContainerCache( array $containerInfo ) {
+               try {
+                       $conn = $this->getConnection(); // Swift proxy connection
+                       foreach ( $containerInfo as $container => $info ) {
+                               $this->connContainers[$container] = new CF_Container(
+                                       $conn->cfs_auth,
+                                       $conn->cfs_http,
+                                       $container,
+                                       $info['count'],
+                                       $info['bytes']
+                               );
+                       }
+               } catch ( InvalidResponseException $e ) {
+               } catch ( Exception $e ) { // some other exception?
+                       $this->logException( $e, __METHOD__, array() );
+               }
+       }
+
        /**
         * Log an unexpected exception for this backend
-        * 
+        *
         * @param $e Exception
         * @param $func string
         * @param $params Array
@@ -817,22 +980,24 @@ class SwiftFileBackend extends FileBackendStore {
 }
 
 /**
- * SwiftFileBackend helper class to page through object listings.
+ * SwiftFileBackend helper class to page through listings.
  * Swift also has a listing limit of 10,000 objects for sanity.
  * Do not use this class from places outside SwiftFileBackend.
  *
  * @ingroup FileBackend
  */
-class SwiftFileBackendFileList implements Iterator {
+abstract class SwiftFileBackendList implements Iterator {
        /** @var Array */
        protected $bufferIter = array();
        protected $bufferAfter = null; // string; list items *after* this path
        protected $pos = 0; // integer
+       /** @var Array */
+       protected $params = array();
 
        /** @var SwiftFileBackend */
-       protected $backend; 
-       protected $container; //
-       protected $dir; // string storage directory
+       protected $backend;
+       protected $container; // string; container name
+       protected $dir; // string; storage directory
        protected $suffixStart; // integer
 
        const PAGE_SIZE = 5000; // file listing buffer size
@@ -841,8 +1006,9 @@ class SwiftFileBackendFileList implements Iterator {
         * @param $backend SwiftFileBackend
         * @param $fullCont string Resolved container name
         * @param $dir string Resolved directory relative to container
+        * @param $params Array
         */
-       public function __construct( SwiftFileBackend $backend, $fullCont, $dir ) {
+       public function __construct( SwiftFileBackend $backend, $fullCont, $dir, array $params ) {
                $this->backend = $backend;
                $this->container = $fullCont;
                $this->dir = $dir;
@@ -854,14 +1020,7 @@ class SwiftFileBackendFileList implements Iterator {
                } else { // dir within container
                        $this->suffixStart = strlen( $this->dir ) + 1; // size of "path/to/dir/"
                }
-       }
-
-       /**
-        * @see Iterator::current()
-        * @return string|bool String or false
-        */
-       public function current() {
-               return substr( current( $this->bufferIter ), $this->suffixStart );
+               $this->params = $params;
        }
 
        /**
@@ -883,10 +1042,9 @@ class SwiftFileBackendFileList implements Iterator {
                // Check if there are no files left in this page and
                // advance to the next page if this page was not empty.
                if ( !$this->valid() && count( $this->bufferIter ) ) {
-                       $this->bufferAfter = end( $this->bufferIter );
-                       $this->bufferIter = $this->backend->getFileListPageInternal(
-                               $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE
-                       );
+                       $this->bufferIter = $this->pageFromList(
+                               $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
+                       ); // updates $this->bufferAfter
                }
        }
 
@@ -897,9 +1055,9 @@ class SwiftFileBackendFileList implements Iterator {
        public function rewind() {
                $this->pos = 0;
                $this->bufferAfter = null;
-               $this->bufferIter = $this->backend->getFileListPageInternal(
-                       $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE
-               );
+               $this->bufferIter = $this->pageFromList(
+                       $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
+               ); // updates $this->bufferAfter
        }
 
        /**
@@ -907,6 +1065,64 @@ class SwiftFileBackendFileList implements Iterator {
         * @return bool
         */
        public function valid() {
-               return ( current( $this->bufferIter ) !== false ); // no paths can have this value
+               if ( $this->bufferIter === null ) {
+                       return false; // some failure?
+               } else {
+                       return ( current( $this->bufferIter ) !== false ); // no paths can have this value
+               }
+       }
+
+       /**
+        * Get the given list portion (page)
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $after string|null
+        * @param $limit integer
+        * @param $params Array
+        * @return Traversable|Array|null Returns null on failure
+        */
+       abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
+}
+
+/**
+ * Iterator for listing directories
+ */
+class SwiftFileBackendDirList extends SwiftFileBackendList {
+       /**
+        * @see Iterator::current()
+        * @return string|bool String (relative path) or false
+        */
+       public function current() {
+               return substr( current( $this->bufferIter ), $this->suffixStart, -1 );
+       }
+
+       /**
+        * @see SwiftFileBackendList::pageFromList()
+        * @return Array|null
+        */
+       protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
+               return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
+       }
+}
+
+/**
+ * Iterator for listing regular files
+ */
+class SwiftFileBackendFileList extends SwiftFileBackendList {
+       /**
+        * @see Iterator::current()
+        * @return string|bool String (relative path) or false
+        */
+       public function current() {
+               return substr( current( $this->bufferIter ), $this->suffixStart );
+       }
+
+       /**
+        * @see SwiftFileBackendList::pageFromList()
+        * @return Array|null
+        */
+       protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
+               return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
        }
 }
index 7843d6c..ae22a1c 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Location holder of files stored temporarily
+ *
+ * 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
  * @ingroup FileBackend
  */
index 1eb9eca..078f3be 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Version of FileJournal that logs to a DB table.
+ *
+ * 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
  * @ingroup FileJournal
  * @author Aaron Schulz
index f60b7f9..99f2887 100644 (file)
@@ -5,6 +5,23 @@
  */
 
 /**
+ * File operation journaling.
+ *
+ * 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
  * @ingroup FileJournal
  * @author Aaron Schulz
index dcba1eb..0a0ba54 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Version of LockManager based on using DB table locks.
+ *
+ * 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
+ * @ingroup LockManager
+ */
 
 /**
  * Version of LockManager based on using DB table locks.
index d35a1ae..21a3a4e 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Simple version of LockManager based on using FS lock files.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 LockManager
+ */
 
 /**
  * Simple version of LockManager based on using FS lock files.
@@ -27,7 +48,7 @@ class FSLockManager extends LockManager {
 
        /**
         * Construct a new instance from configuration.
-        * 
+        *
         * $config includes:
         *     'lockDirectory' : Directory containing the lock files
         *
@@ -80,7 +101,7 @@ class FSLockManager extends LockManager {
         *
         * @param $path string
         * @param $type integer
-        * @return Status 
+        * @return Status
         */
        protected function doSingleLock( $path, $type ) {
                $status = Status::newGood();
@@ -118,10 +139,10 @@ class FSLockManager extends LockManager {
 
        /**
         * Unlock a single resource key
-        * 
+        *
         * @param $path string
         * @param $type integer
-        * @return Status 
+        * @return Status
         */
        protected function doSingleUnlock( $path, $type ) {
                $status = Status::newGood();
@@ -138,8 +159,16 @@ class FSLockManager extends LockManager {
                                // If a LOCK_SH comes in while we have a LOCK_EX, we don't
                                // actually add a handler, so check for handler existence.
                                if ( isset( $this->handles[$path][$type] ) ) {
-                                       // Mark this handle to be unlocked and closed
-                                       $handlesToClose[] = $this->handles[$path][$type];
+                                       if ( $type === self::LOCK_EX
+                                               && isset( $this->locksHeld[$path][self::LOCK_SH] )
+                                               && !isset( $this->handles[$path][self::LOCK_SH] ) )
+                                       {
+                                               // EX lock came first: move this handle to the SH one
+                                               $this->handles[$path][self::LOCK_SH] = $this->handles[$path][$type];
+                                       } else {
+                                               // Mark this handle to be unlocked and closed
+                                               $handlesToClose[] = $this->handles[$path][$type];
+                                       }
                                        unset( $this->handles[$path][$type] );
                                }
                        }
@@ -151,7 +180,7 @@ class FSLockManager extends LockManager {
                                $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
                                $status->merge( $this->pruneKeyLockFiles( $path ) );
                        } else {
-                               // Unix: unlink() can be used on files currently open by this 
+                               // Unix: unlink() can be used on files currently open by this
                                // process and we must do so in order to avoid race conditions
                                $status->merge( $this->pruneKeyLockFiles( $path ) );
                                $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
@@ -164,14 +193,12 @@ class FSLockManager extends LockManager {
        private function closeLockHandles( $path, array $handlesToClose ) {
                $status = Status::newGood();
                foreach ( $handlesToClose as $handle ) {
-                       wfSuppressWarnings();
                        if ( !flock( $handle, LOCK_UN ) ) {
                                $status->fatal( 'lockmanager-fail-releaselock', $path );
                        }
                        if ( !fclose( $handle ) ) {
                                $status->warning( 'lockmanager-fail-closelock', $path );
                        }
-                       wfRestoreWarnings();
                }
                return $status;
        }
@@ -179,12 +206,10 @@ class FSLockManager extends LockManager {
        private function pruneKeyLockFiles( $path ) {
                $status = Status::newGood();
                if ( !count( $this->locksHeld[$path] ) ) {
-                       wfSuppressWarnings();
                        # No locks are held for the lock file anymore
                        if ( !unlink( $this->getLockPath( $path ) ) ) {
                                $status->warning( 'lockmanager-fail-deletelock', $path );
                        }
-                       wfRestoreWarnings();
                        unset( $this->locksHeld[$path] );
                        unset( $this->handles[$path] );
                }
index 742c9d0..4f78ede 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Version of LockManager based on using lock daemon servers.
+ *
+ * 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
+ * @ingroup LockManager
+ */
 
 /**
  * Manage locks using a lock daemon server.
index 506d850..8b3e229 100644 (file)
@@ -5,6 +5,23 @@
  */
 
 /**
+ * Resource locking handling.
+ *
+ * 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
  * @ingroup LockManager
  * @author Aaron Schulz
@@ -139,8 +156,6 @@ class ScopedLock {
                $this->type = $type;
        }
 
-       protected function __clone() {}
-
        /**
         * Get a ScopedLock object representing a lock on resource paths.
         * Any locks are released once this object goes out of scope.
index 5e53366..7caff62 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Lock manager registration handling.
+ *
+ * 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
+ * @ingroup LockManager
+ */
+
 /**
  * Class to handle file lock manager registration
  * 
@@ -17,8 +39,6 @@ class LockManagerGroup {
        protected $managers = array();
 
        protected function __construct() {}
-       protected function __clone() {}
-
        /**
         * @return LockManagerGroup
         */
index 9b0844b..c5a0bd1 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Deleted file in the 'filearchive' table
+ * Deleted file in the 'filearchive' table.
+ *
+ * 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
  * @ingroup FileAbstraction
@@ -143,7 +158,7 @@ class ArchivedFile {
                                array( 'ORDER BY' => 'fa_timestamp DESC' ) );
                        if ( $res == false || $dbr->numRows( $res ) == 0 ) {
                        // this revision does not exist?
-                               return;
+                               return null;
                        }
                        $ret = $dbr->resultObject( $res );
                        $row = $ret->fetchObject();
index ce69a03..c9395c6 100644 (file)
@@ -9,6 +9,21 @@
 /**
  * Base code for files.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 FileAbstraction
  */
@@ -842,6 +857,13 @@ abstract class File {
                                }
                        }
 
+                       // If the backend is ready-only, don't keep generating thumbnails
+                       // only to return transformation errors, just return the error now.
+                       if ( $this->repo->getReadOnlyReason() !== false ) {
+                               $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
+                               break;
+                       }
+
                        // Create a temp FS file with the same extension and the thumbnail
                        $thumbExt = FileBackend::extensionFromPath( $thumbPath );
                        $tmpFile = TempFSFile::factory( 'transform_', $thumbExt );
@@ -864,19 +886,15 @@ abstract class File {
                                        $thumb = $this->handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $params );
                                }
                        } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
-                               $backend = $this->repo->getBackend();
-                               // Copy the thumbnail from the file system into storage. This avoids using
-                               // FileRepo::store(); getThumbPath() uses a different zone in some subclasses.
-                               $backend->prepare( array( 'dir' => dirname( $thumbPath ) ) );
-                               $status = $backend->store(
-                                       array( 'src' => $tmpThumbPath, 'dst' => $thumbPath, 'overwrite' => 1 ),
-                                       array( 'force' => 1, 'nonLocking' => 1, 'allowStale' => 1 )
-                               );
+                               // Copy the thumbnail from the file system into storage...
+                               $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath );
                                if ( $status->isOK() ) {
                                        $thumb->setStoragePath( $thumbPath );
                                } else {
                                        $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
                                }
+                               // Give extensions a chance to do something with this thumbnail...
+                               wfRunHooks( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
                        }
 
                        // Purge. Useful in the event of Core -> Squid connection failure or squid
index 16828fa..ef9c3a5 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Foreign file accessible through api.php requests.
  *
+ * 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
  * @ingroup FileAbstraction
  */
@@ -39,9 +54,9 @@ class ForeignAPIFile extends File {
         */
        static function newFromTitle( Title $title, $repo ) {
                $data = $repo->fetchImageQuery( array(
-                       'titles' => 'File:' . $title->getDBKey(),
-                       'iiprop' => self::getProps(),
-                       'prop'   => 'imageinfo',
+                       'titles'            => 'File:' . $title->getDBKey(),
+                       'iiprop'            => self::getProps(),
+                       'prop'              => 'imageinfo',
                        'iimetadataversion' => MediaHandler::getMetadataVersion()
                ) );
 
@@ -247,8 +262,8 @@ class ForeignAPIFile extends File {
                }
 
                # Delete the thumbnails
-               $this->repo->cleanupBatch( $purgeList, FileRepo::SKIP_LOCKING );
+               $this->repo->quickPurgeBatch( $purgeList );
                # Clear out the thumbnail directory if empty
-               $this->repo->getBackend()->clean( array( 'dir' => $dir ) );
+               $this->repo->quickCleanDir( $dir );
        }
 }
index 191a712..fa7834a 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Foreign file with an accessible MediaWiki database
+ * Foreign file with an accessible MediaWiki database.
+ *
+ * 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
  * @ingroup FileAbstraction
index 04d7a47..467bf1b 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Local file in the wiki's own database
+ * Local file in the wiki's own database.
+ *
+ * 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
  * @ingroup FileAbstraction
@@ -777,9 +792,9 @@ class LocalFile extends File {
                }
 
                # Delete the thumbnails
-               $this->repo->cleanupBatch( $purgeList, FileRepo::SKIP_LOCKING );
+               $this->repo->quickPurgeBatch( $purgeList );
                # Clear out the thumbnail directory if empty
-               $this->repo->getBackend()->clean( array( 'dir' => $dir ) );
+               $this->repo->quickCleanDir( $dir );
        }
 
        /** purgeDescription inherited */
@@ -1231,19 +1246,18 @@ class LocalFile extends File {
                }
 
                wfDebugLog( 'imagemove', "Got request to move {$this->name} to " . $target->getText() );
-               $this->lock(); // begin
-
                $batch = new LocalFileMoveBatch( $this, $target );
+
+               $this->lock(); // begin
                $batch->addCurrent();
                $batch->addOlds();
-
                $status = $batch->execute();
+               $this->unlock(); // done
+
                wfDebugLog( 'imagemove', "Finished moving {$this->name}" );
 
                $this->purgeEverything();
-               $this->unlock(); // done
-
-               if ( $status->isOk() ) {
+               if ( $status->isOK() ) {
                        // Now switch the object
                        $this->title = $target;
                        // Force regeneration of the name and hashpath
@@ -1273,31 +1287,33 @@ class LocalFile extends File {
                        return $this->readOnlyFatalStatus();
                }
 
-               $this->lock(); // begin
-
+               $dbw = $this->repo->getMasterDB();
                $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
-               $batch->addCurrent();
+               $archiveNames = array();
 
+               $this->lock(); // begin
+               $batch->addCurrent();
                # Get old version relative paths
-               $dbw = $this->repo->getMasterDB();
                $result = $dbw->select( 'oldimage',
                        array( 'oi_archive_name' ),
                        array( 'oi_name' => $this->getName() ) );
                foreach ( $result as $row ) {
                        $batch->addOld( $row->oi_archive_name );
-                       $this->purgeOldThumbnails( $row->oi_archive_name );
+                       $archiveNames[] = $row->oi_archive_name;
                }
                $status = $batch->execute();
-
                if ( $status->isOK() ) {
                        // Update site_stats
                        $site_stats = $dbw->tableName( 'site_stats' );
                        $dbw->query( "UPDATE $site_stats SET ss_images=ss_images-1", __METHOD__ );
-                       $this->purgeEverything();
                }
-
                $this->unlock(); // done
 
+               $this->purgeEverything();
+               foreach ( $archiveNames as $archiveName ) {
+                       $this->purgeOldThumbnails( $archiveName );
+               }
+
                return $status;
        }
 
@@ -1353,25 +1369,21 @@ class LocalFile extends File {
                        return $this->readOnlyFatalStatus();
                }
 
-               $this->lock(); // begin
-
                $batch = new LocalFileRestoreBatch( $this, $unsuppress );
 
+               $this->lock(); // begin
                if ( !$versions ) {
                        $batch->addAll();
                } else {
                        $batch->addIds( $versions );
                }
-
                $status = $batch->execute();
-
                if ( $status->isGood() ) {
                        $cleanupStatus = $batch->cleanup();
                        $cleanupStatus->successCount = 0;
                        $cleanupStatus->failCount = 0;
                        $status->merge( $cleanupStatus );
                }
-
                $this->unlock(); // done
 
                return $status;
@@ -2171,7 +2183,7 @@ class LocalFileRestoreBatch {
 class LocalFileMoveBatch {
 
        /**
-        * @var File
+        * @var LocalFile
         */
        var $file;
 
@@ -2266,17 +2278,17 @@ class LocalFileMoveBatch {
                        return $statusMove;
                }
 
-               $this->db->begin( __METHOD__ );
+               $this->file->lock(); // begin
                $statusDb = $this->doDBUpdates();
                wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: {$statusDb->successCount} successes, {$statusDb->failCount} failures" );
                if ( !$statusDb->isGood() ) {
-                       $this->db->rollback( __METHOD__ );
+                       $this->file->unlockAndRollback();
                        // Something went wrong with the DB updates, so remove the target files
                        $this->cleanupTarget( $triplets );
                        $statusDb->ok = false;
                        return $statusDb;
                }
-               $this->db->commit( __METHOD__ );
+               $this->file->unlock(); // done
 
                // Everything went ok, remove the source files
                $this->cleanupSource( $triplets );
@@ -2319,7 +2331,8 @@ class LocalFileMoveBatch {
                        'oldimage',
                        array(
                                'oi_name' => $this->newName,
-                               'oi_archive_name = ' . $dbw->strreplace( 'oi_archive_name', $dbw->addQuotes( $this->oldName ), $dbw->addQuotes( $this->newName ) ),
+                               'oi_archive_name = ' . $dbw->strreplace( 'oi_archive_name',
+                                       $dbw->addQuotes( $this->oldName ), $dbw->addQuotes( $this->newName ) ),
                        ),
                        array( 'oi_name' => $this->oldName ),
                        __METHOD__
@@ -2328,7 +2341,10 @@ class LocalFileMoveBatch {
                $affected = $dbw->affectedRows();
                $total = $this->oldCount;
                $status->successCount += $affected;
-               $status->failCount += $total - $affected;
+               // Bug 34934: $total is based on files that actually exist.
+               // There may be more DB rows than such files, in which case $affected
+               // can be greater than $total. We use max() to avoid negatives here.
+               $status->failCount += max( 0, $total - $affected );
                if ( $status->failCount ) {
                        $status->error( 'imageinvalidfilename' );
                }
index cec70d6..bd3ff1e 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Old file in the oldimage table
+ * Old file in the oldimage table.
+ *
+ * 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
  * @ingroup FileAbstraction
index 7c5eab0..b217d60 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * File without associated database record
+ * File without associated database record.
+ *
+ * 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
  * @ingroup FileAbstraction
index f9afbb2..0c3876c 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Core installer command line interface.
  *
+ * 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
  * @ingroup Deployment
  */
index 046fa16..2cc539b 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * DBMS-specific installation helper.
  *
+ * 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
  * @ingroup Deployment
  */
index fee4b2a..6483c4e 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * DBMS-specific updater helper.
  *
+ * 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
  * @ingroup Deployment
  */
@@ -230,6 +245,7 @@ abstract class DatabaseUpdater {
         * @since 1.20
         *
         * @param $tableName string
+        * @return bool
         */
        public function tableExists( $tableName ) {
                return ( $this->db->tableExists( $tableName, __METHOD__ ) );
index a6c4fd6..76df7af 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * IBM_DB2-specific installer.
  *
+ * 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
  * @ingroup Deployment
  */
index 02d7cb1..f812ac2 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * IBM_DB2-specific updater.
  *
+ * 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
  * @ingroup Deployment
  */
index 5801f26..9a389dd 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Installer-specific wikitext formating.
+ *
+ * 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
+ */
 
 class InstallDocFormatter {
        static function format( $text ) {
index b380787..f703c7a 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Base code for MediaWiki installer.
  *
+ * 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
  * @ingroup Deployment
  */
@@ -24,7 +39,7 @@
 abstract class Installer {
 
        // This is the absolute minimum PHP version we can support
-       const MINIMUM_PHP_VERSION = '5.2.3';
+       const MINIMUM_PHP_VERSION = '5.3.2';
 
        /**
         * @var array
index 89154e5..9ed486c 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Generator for LocalSettings.php file.
  *
+ * 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
  * @ingroup Deployment
  */
@@ -244,7 +259,8 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 {$metaNamespace}
 ## The URL base path to the directory containing the wiki;
 ## defaults for all runtime URL paths are based off of this.
-## For more information on customizing the URLs please see:
+## For more information on customizing the URLs
+## (like /w/index.php/Page_title to /wiki/Page_title) please see:
 ## http://www.mediawiki.org/wiki/Manual:Short_URL
 \$wgScriptPath       = \"{$this->values['wgScriptPath']}\";
 \$wgScriptExtension  = \"{$this->values['wgScriptExtension']}\";
index caec558..5230c81 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * MySQL-specific installer.
  *
+ * 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
  * @ingroup Deployment
  */
index 5e6ae7e..e453b01 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * MySQL-specific updater.
  *
+ * 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
  * @ingroup Deployment
  */
@@ -196,6 +211,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        // 1.20
                        array( 'addTable', 'config',                            'patch-config.sql' ),
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
+                       array( 'addField', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id.sql' ),
+                       array( 'addIndex', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id-index.sql' ),
                );
        }
 
index 50f18c9..863a625 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Oracle-specific installer.
  *
+ * 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
  * @ingroup Deployment
  */
index 73bbc57..aa3c334 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Oracle-specific updater.
  *
+ * 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
  * @ingroup Deployment
  */
index 5144686..641f6e3 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * PostgreSQL-specific installer.
  *
+ * 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
  * @ingroup Deployment
  */
index 0d27c5a..43005a8 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * PostgreSQL-specific updater.
  *
+ * 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
  * @ingroup Deployment
  */
@@ -97,6 +112,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'ipblocks',      'ipb_create_account',   'SMALLINT NOT NULL DEFAULT 1' ),
                        array( 'addPgField', 'ipblocks',      'ipb_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'ipblocks',      'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
+                       array( 'addPgField', 'ipblocks',      'ipb_parent_block_id',            'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
                        array( 'addPgField', 'filearchive',   'fa_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'logging',       'log_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'logging',       'log_id',               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
@@ -185,9 +201,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'changeNullableField', 'oldimage', 'oi_timestamp',  'NULL' ),
                        array( 'changeNullableField', 'oldimage', 'oi_major_mime', 'NULL' ),
                        array( 'changeNullableField', 'oldimage', 'oi_minor_mime', 'NULL' ),
-                       array( 'setDefault', 'image', 'img_metadata', '\'\x\'::bytea'),
                        array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL'),
-                       array( 'setDefault', 'filearchive', 'fa_metadata', '\'\x\'::bytea'),
                        array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL'),
                        array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ),
 
@@ -196,6 +210,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        # New indexes
                        array( 'addPgIndex', 'archive',       'archive_user_text',      '(ar_user_text)' ),
                        array( 'addPgIndex', 'image',         'img_sha1',               '(img_sha1)' ),
+                       array( 'addPgIndex', 'ipblocks',      'ipb_parent_block_id',              '(ipb_parent_block_id)' ),
                        array( 'addPgIndex', 'oldimage',      'oi_sha1',                '(oi_sha1)' ),
                        array( 'addPgIndex', 'page',          'page_mediawiki_title',   '(page_title) WHERE page_namespace = 8' ),
                        array( 'addPgIndex', 'pagelinks',     'pagelinks_title',        '(pl_title)' ),
@@ -292,6 +307,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'changeFkeyDeferrable', 'imagelinks',       'il_from',         'page(page_id) ON DELETE CASCADE' ),
                        array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_by',          'mwuser(user_id) ON DELETE CASCADE' ),
                        array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_user',        'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_parent_block_id',       'ipblocks(ipb_id) ON DELETE SET NULL' ),
                        array( 'changeFkeyDeferrable', 'langlinks',        'll_from',         'page(page_id) ON DELETE CASCADE' ),
                        array( 'changeFkeyDeferrable', 'logging',          'log_user',        'mwuser(user_id) ON DELETE SET NULL' ),
                        array( 'changeFkeyDeferrable', 'oldimage',         'oi_name',         'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
index 89444bc..6e1a74f 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Sqlite-specific installer.
  *
+ * 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
  * @ingroup Deployment
  */
index a98c4db..8146274 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Sqlite-specific updater.
  *
+ * 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
  * @ingroup Deployment
  */
@@ -75,6 +90,8 @@ class SqliteUpdater extends DatabaseUpdater {
                        // 1.20
                        array( 'addTable', 'config',                            'patch-config.sql' ),
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
+                       array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
                );
        }
 
index eeeb768..5bbe642 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Core installer web interface.
  *
+ * 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
  * @ingroup Deployment
  */
index fdc1746..aabc1f3 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Output handler for the web installer.
  *
+ * 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
  * @ingroup Deployment
  */
@@ -101,9 +116,15 @@ class WebInstallerOutput {
                // by '../skins/$skinName/images/', where $skinName is what appears
                // before the last '/' in each of the strings.
                $cssFileNames = array(
-                       "common/shared.css",
-                       "vector/screen.css",
-                       "common/config.css",
+
+                       // Basically the "skins.vector" ResourceLoader module styles
+                       'common/commonElements.css',
+                       'common/commonContent.css',
+                       'common/commonInterface.css',
+                       'vector/screen.css',
+
+                       // mw-config specific
+                       'common/config.css',
                );
 
                $css = '';
index 73a5ef2..b6e7717 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Base code for web installer pages.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Deployment
  */
index 2dacd85..179ff4c 100644 (file)
@@ -1,7 +1,23 @@
 <?php
 /**
+ * Interwiki table entry.
+ *
+ * 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
- * Interwiki table entry
  */
 
 /**
index 2a14445..4e02258 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Job to fix double redirects after moving a page
+ * Job to fix double redirects after moving a page.
+ *
+ * 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
  * @ingroup JobQueue
index 89b74a4..d359988 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Old job for notification emails.
  *
+ * 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
  * @ingroup JobQueue
  */
index eb154ec..b4c925e 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Job for notification emails.
  *
+ * 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
  * @ingroup JobQueue
  */
index ac70dcb..a53905f 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Job queue base code
+ * Job queue base code.
+ *
+ * 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
  * @defgroup JobQueue JobQueue
@@ -186,6 +201,11 @@ abstract class Job {
                $namespace = $row->job_namespace;
                $dbkey = $row->job_title;
                $title = Title::makeTitleSafe( $namespace, $dbkey );
+
+               if ( is_null( $title ) ) {
+                       return false;
+               }
+
                $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
 
                // Remove any duplicates it may have later in the queue
@@ -204,7 +224,7 @@ abstract class Job {
         * @param $id Int: Job identifier
         * @return Job
         */
-       static function factory( $command, $title, $params = false, $id = 0 ) {
+       static function factory( $command, Title $title, $params = false, $id = 0 ) {
                global $wgJobClasses;
                if( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
index 1aa206f..f711f8d 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Job to update links for a given title.
  *
+ * 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
  * @ingroup JobQueue
  */
index 26f6e4b..55ccc27 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Job for asynchronous upload-by-url.
  *
+ * 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
  * @ingroup JobQueue
  */
index f7373e4..4ef59ed 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Simple wrapper for json_econde and json_decode that falls back on Services_JSON class
+ * Simple wrapper for json_econde and json_decode that falls back on Services_JSON class.
+ *
+ * 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
  */
index 792079a..e6672b4 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * PHP port of CSSJanus.
+ *
  * 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
@@ -15,6 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  */
 
 /**
index 4f4b28b..e9c2bad 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Minification of CSS stylesheets.
+ *
  * Copyright 2010 Wikimedia Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may
  * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  * OF ANY KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
- */
-
-/**
- * Transforms CSS data
- *
- * This class provides minification, URL remapping, URL extracting, and data-URL embedding.
  *
  * @file
  * @version 0.1.1 -- 2010-09-11
  * @copyright Copyright 2010 Wikimedia Foundation
  * @license http://www.apache.org/licenses/LICENSE-2.0
  */
+
+/**
+ * Transforms CSS data
+ *
+ * This class provides minification, URL remapping, URL extracting, and data-URL embedding.
+ */
 class CSSMin {
 
        /* Constants */
index 2985c65..78d8180 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * List of HTTP status codes.
+ *
+ * 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
+ */
+
 /**
  * @todo document
  */
index 01e72e6..cfc7f53 100644 (file)
@@ -1,4 +1,10 @@
 <?php
+/**
+ * Simulation of Microsoft Internet Explorer's MIME type detection algorithm.
+ *
+ * @file
+ * @todo Define the exact license of this file.
+ */
 
 /**
  * This class simulates Microsoft Internet Explorer's terribly broken and
index 99461b0..e9cfa99 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Checks for validity of requested URL's extension.
+ *
+ * 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
+ */
 
 /**
  * Internet Explorer derives a cache filename from a URL, and then in certain
index baf9338..0b4be9a 100644 (file)
@@ -2,17 +2,19 @@
 /**
  * JavaScript Minifier
  *
+ * @file
+ * @author Paul Copperman <paul.copperman@gmail.com>
+ * @license Choose any of Apache, MIT, GPL, LGPL
+ */
+
+/**
  * This class is meant to safely minify javascript code, while leaving syntactically correct
  * programs intact. Other libraries, such as JSMin require a certain coding style to work
  * correctly. OTOH, libraries like jsminplus, that do parse the code correctly are rather
  * slow, because they construct a complete parse tree before outputting the code minified.
  * So this class is meant to allow arbitrary (but syntactically correct) input, while being
  * fast enough to be used for on-the-fly minifying.
- *
- * Author: Paul Copperman <paul.copperman@gmail.com>
- * License: choose any of Apache, MIT, GPL, LGPL
  */
-
 class JavaScriptMinifier {
 
        /* Class constants */
index 8ed08d7..7c4e32b 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * JSMinPlus version 1.4
  *
@@ -25,6 +24,7 @@
  *
  * Latest version of this script: http://files.tweakers.net/jsminplus/jsminplus.zip
  *
+ * @file
  */
 
 /* ***** BEGIN LICENSE BLOCK *****
index 0be0740..37560d8 100644 (file)
@@ -7,6 +7,21 @@
  * - formatting log entries based on database fields
  * - user is now part of the action message
  *
+ * 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
  * @author Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
index eccbcdb..ef63335 100644 (file)
@@ -515,16 +515,9 @@ class LogEventsList {
                                $canHide = $wgUser->isAllowed( 'deleterevision' );
                                // If event was hidden from sysops
                                if( !self::userCan( $row, LogPage::DELETED_RESTRICTED ) ) {
-                                       $del = Linker::revDeleteLinkDisabled( $canHide );
+                                       $del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
                                } else {
-                                       $target = SpecialPage::getTitleFor( 'Log', $row->log_type );
-                                       $query = array(
-                                               'target' => $target->getPrefixedDBkey(),
-                                               'type'   => 'logging',
-                                               'ids'    => $row->log_id,
-                                       );
-                                       $del = Linker::revDeleteLink( $query,
-                                               self::isDeleted( $row, LogPage::DELETED_RESTRICTED ), $canHide );
+                                       $del = Xml::check( 'showhiderevisions', false, array( 'name' => 'ids[' . $row->log_id . ']' ) );
                                }
                        }
                }
index e463c45..6d8ece1 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Contains classes for formatting log entries
  *
+ * 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
  * @author Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
index 65c523d..339688d 100644 (file)
@@ -1,12 +1,31 @@
 <?php
-
 /**
- * Class containing static functions for working with
- * logs of patrol events
+ * Specific methods for the patrol log.
+ *
+ * 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
  * @author Rob Church <robchur@gmail.com>
  * @author Niklas Laxström
  */
+
+/**
+ * Class containing static functions for working with
+ * logs of patrol events
+ */
 class PatrolLog {
 
        /**
index 6886e95..a515c63 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Handler for Microsoft's bitmap format
+ * Handler for Microsoft's bitmap format.
+ *
+ * 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
  * @ingroup Media
index 3e039ff..8cf30ab 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Generic handler for bitmap images
+ * Generic handler for bitmap images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Media
index d158fe4..0a19554 100644 (file)
@@ -1,13 +1,36 @@
 <?php
 /**
-Class to deal with reconciling and extracting metadata from bitmap images.
-This is meant to comply with http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
+ * Extraction of metadata from different bitmap image types.
+ *
+ * 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
+ * @ingroup Media
+ */
 
-This sort of acts as an intermediary between MediaHandler::getMetadata
-and the various metadata extractors.
-
-@todo other image formats.
-*/
+/**
+ * Class to deal with reconciling and extracting metadata from bitmap images.
+ * This is meant to comply with http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
+ *
+ * This sort of acts as an intermediary between MediaHandler::getMetadata
+ * and the various metadata extractors.
+ *
+ * @todo other image formats.
+ * @ingroup Media
+ */
 class BitmapMetadataHandler {
 
        private $metadata = array();
index 3c5d973..8cb5138 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Handler for bitmap images that will be resized by clients
+ * Handler for bitmap images that will be resized by clients.
+ *
+ * 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
  * @ingroup Media
index 2f960d9..ed38bd1 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Handler for DjVu images
+ * Handler for DjVu images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Media
index 25aacdc..6aef562 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * DjVu image handler
+ * DjVu image handler.
  *
  * Copyright © 2006 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
@@ -21,6 +21,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
+ * @ingroup Media
  */
 
 /**
index 4fb13c6..f5dc020 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Extraction and validation of image metadata.
+ *
  * 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
index 7b9867f..65575ec 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Handler for bitmap images with exif metadata.
+ *
+ * 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
  * @ingroup Media
  */
index 2416252..c22ea08 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Formating of image metadata values into human readable form.
+ *
  * 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
index 32618e9..2ec523d 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Handler for GIF images.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Media
  */
index 90bc726..5fc5c1a 100644 (file)
@@ -7,6 +7,21 @@
  * Deliberately not using MWExceptions to avoid external dependencies, encouraging
  * redistribution.
  *
+ * 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
  * @ingroup Media
  */
index c6833f3..b41ac32 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Media-handling base classes and generic functionality
+ * Media-handling base classes and generic functionality.
+ *
+ * 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
  * @ingroup Media
index 666ce40..8fd3552 100644 (file)
@@ -1,8 +1,31 @@
 <?php
 /**
-*Class for some IPTC functions.
+ * Class for some IPTC functions.
+ *
+ * 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
+ * @ingroup Media
+ */
 
-*/
+/**
+ * Class for some IPTC functions.
+ *
+ * @ingroup Media
+ */
 class IPTC {
 
        /**
index 7033409..a15b652 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Handler for JPEG images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Media
  */
index 0522dfc..8d7e43b 100644 (file)
@@ -1,10 +1,34 @@
 <?php
 /**
-* Class for reading jpegs and extracting metadata.
-* see also BitmapMetadataHandler.
-*
-* Based somewhat on GIFMetadataExtrator.
-*/
+ * Extraction of JPEG image metadata.
+ *
+ * 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
+ * @ingroup Media
+ */
+
+/**
+ * Class for reading jpegs and extracting metadata.
+ * see also BitmapMetadataHandler.
+ *
+ * Based somewhat on GIFMetadataExtrator.
+ *
+ * @ingroup Media
+ */
 class JpegMetadataExtractor {
 
        const MAX_JPEG_SEGMENTS = 200;
index 380731c..bf08de6 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Base class for the output of file transformation methods.
  *
+ * 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
  * @ingroup Media
  */
index 8fe9ecb..afc7d6a 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Handler for PNG images.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Media
  */
index d3c44d4..9dcde40 100644 (file)
@@ -1,10 +1,26 @@
 <?php
 /**
  * PNG frame counter and metadata extractor.
+ *
  * Slightly derived from GIFMetadataExtractor.php
  * Deliberately not using MWExceptions to avoid external dependencies, encouraging
  * redistribution.
  *
+ * 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
  * @ingroup Media
  */
index 5e72ab0..9c8fc5e 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Handler for SVG images.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Media
  */
index 26e42d1..da7d428 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * SVGMetadataExtractor.php
+ * Extraction of SVG image metadata.
  *
  * 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
@@ -25,6 +25,9 @@
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
  */
 
+/**
+ * @ingroup Media
+ */
 class SVGMetadataExtractor {
        static function getMetadata( $filename ) {
                $svg = new SVGReader( $filename );
@@ -32,6 +35,9 @@ class SVGMetadataExtractor {
        }
 }
 
+/**
+ * @ingroup Media
+ */
 class SVGReader {
        const DEFAULT_WIDTH = 512;
        const DEFAULT_HEIGHT = 512;
index 0f317e1..d95c907 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Handler for Tiff images.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Media
  */
index ce71290..555fa1f 100644 (file)
@@ -7,6 +7,21 @@
  * Specification in Gnome repository:
  *   http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup
  *
+ * 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
  * @ingroup Media
  */
index 0dbf563..adb85df 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Reader for XMP data containing properties relevant to images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Media
+ */
+
 /**
 * Class for reading xmp data containing properties relevant to
 * images, and spitting out an array that FormatExif accepts.
index 156d9b5..83b8a10 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Definitions for XMPReader class.
+ *
+ * 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
+ * @ingroup Media
+ */
+
 /**
 * This class is just a container for a big array
 * used by XMPReader to determine which XMP items to
index 600d99d..5ce3c00 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Methods for validating XMP properties.
+ *
+ * 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
+ * @ingroup Media
+ */
+
 /**
 * This contains some static methods for
 * validating XMP properties. See XMPInfo and XMPReader classes.
index dd4a76e..b9a6a69 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using PHP's APC accelerator.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * This is a wrapper for APC's shared memory functions
index a4545ef..cdb66c4 100644 (file)
@@ -56,16 +56,30 @@ abstract class BagOStuff {
        /**
         * Get an item with the given key. Returns false if it does not exist.
         * @param $key string
-        *
-        * @return bool|Object
+        * @return mixed Returns false on failure
         */
        abstract public function get( $key );
 
+       /**
+        * Get an associative array containing the item for each of the given keys.
+        * Each item will be false if it does not exist.
+        * @param $keys Array List of strings
+        * @return Array
+        */
+       public function getBatch( array $keys ) {
+               $res = array();
+               foreach ( $keys as $key ) {
+                       $res[$key] = $this->get( $key );
+               }
+               return $res;
+       }
+
        /**
         * Set an item.
         * @param $key string
         * @param $value mixed
         * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
+        * @return bool success
         */
        abstract public function set( $key, $value, $exptime = 0 );
 
@@ -73,19 +87,33 @@ abstract class BagOStuff {
         * Delete an item.
         * @param $key string
         * @param $time int Amount of time to delay the operation (mostly memcached-specific)
+        * @return bool success
         */
        abstract public function delete( $key, $time = 0 );
 
+       /**
+        * @param $key string
+        * @param $timeout integer
+        * @return bool success
+        */
        public function lock( $key, $timeout = 0 ) {
                /* stub */
                return true;
        }
 
+       /**
+        * @param $key string
+        * @return bool success
+        */
        public function unlock( $key ) {
                /* stub */
                return true;
        }
 
+       /**
+        * @todo: what is this?
+        * @return Array
+        */
        public function keys() {
                /* stub */
                return array();
@@ -107,24 +135,36 @@ abstract class BagOStuff {
 
        /* *** Emulated functions *** */
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime integer
+        * @return bool success
+        */
        public function add( $key, $value, $exptime = 0 ) {
                if ( !$this->get( $key ) ) {
-                       $this->set( $key, $value, $exptime );
-
-                       return true;
+                       return $this->set( $key, $value, $exptime );
                }
+               return true;
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @return bool success
+        */
        public function replace( $key, $value, $exptime = 0 ) {
                if ( $this->get( $key ) !== false ) {
-                       $this->set( $key, $value, $exptime );
+                       return $this->set( $key, $value, $exptime );
                }
+               return true;
        }
 
        /**
         * @param $key String: Key to increase
         * @param $value Integer: Value to add to $key (Default 1)
         * @return null if lock is not possible else $key value increased by $value
+        * @return success
         */
        public function incr( $key, $value = 1 ) {
                if ( !$this->lock( $key ) ) {
@@ -142,10 +182,18 @@ abstract class BagOStuff {
                return $n;
        }
 
+       /**
+        * @param $key String
+        * @param $value Integer
+        * @return bool success
+        */
        public function decr( $key, $value = 1 ) {
                return $this->incr( $key, - $value );
        }
 
+       /**
+        * @param $text string
+        */
        public function debug( $text ) {
                if ( $this->debugMode ) {
                        $class = get_class( $this );
@@ -155,6 +203,7 @@ abstract class BagOStuff {
 
        /**
         * Convert an optionally relative time to an absolute time
+        * @param $exptime integer
         * @return int
         */
        protected function convertExpiry( $exptime ) {
@@ -165,5 +214,3 @@ abstract class BagOStuff {
                }
        }
 }
-
-
index ade8c0a..d03771e 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using DBA backend.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * Cache that uses DBA as a backend.
index 75aad27..fb31d5c 100644 (file)
@@ -1,8 +1,31 @@
 <?php
+/**
+ * Object caching using the Ehcache RESTful web service.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * Client for the Ehcache RESTful web service - http://ehcache.org/documentation/cache_server.html
  * TODO: Simplify configuration and add to the installer.
+ *
+ * @ingroup Cache
  */
 class EhcacheBagOStuff extends BagOStuff {
        var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions, 
index 2aee6b1..abc6bcf 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Dummy object caching.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * A BagOStuff object with no objects in it. Used to provide a no-op object to calling code.
index 3677330..26b949f 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using PHP arrays.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * This is a test of the interface, mainly. It stores things in an associative
index 4f49f7d..e816078 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Memcached client for PHP.
+ *
  * +---------------------------------------------------------------------------+
  * | memcached client, PHP                                                     |
  * +---------------------------------------------------------------------------+
@@ -338,9 +340,10 @@ class MWMemcached {
                        $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
                }
 
-               if ( $res == "DELETED" ) {
+               if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
                        return true;
                }
+
                return false;
        }
 
@@ -1139,7 +1142,13 @@ class MWMemcached {
 // }}}
 
 class MemCachedClientforWiki extends MWMemcached {
+
        function _debugprint( $text ) {
-               wfDebug( "memcached: $text" );
+               global $wgDebugLogGroups;
+               if( !isset( $wgDebugLogGroups['memcached'] ) ) {
+                       # Prefix message since it will end up in main debug log file
+                       $text = "memcached: $text";
+               }
+               wfDebugLog( 'memcached', $text );
        }
 }
index 021dfb7..79f3241 100644 (file)
@@ -1,7 +1,30 @@
 <?php
+/**
+ * Object caching using memcached.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
+ *
+ * @ingroup Cache
  */
 class MemcachedPhpBagOStuff extends BagOStuff {
 
@@ -63,6 +86,15 @@ class MemcachedPhpBagOStuff extends BagOStuff {
                return $this->client->get( $this->encodeKey( $key ) );
        }
 
+       /**
+        * @param $keys Array
+        * @return Array
+        */
+       public function getBatch( array $keys ) {
+               $callback = array( $this, 'encodeKey' );
+               return $this->client->get_multi( array_map( $callback, $keys ) );
+       }
+
        /**
         * @param $key string
         * @param $value
@@ -137,7 +169,7 @@ class MemcachedPhpBagOStuff extends BagOStuff {
        }
 
        /**
-        * Get the underlying client object. This is provided for debugging 
+        * Get the underlying client object. This is provided for debugging
         * purposes.
         *
         * @return MemCachedClientforWiki
@@ -149,14 +181,14 @@ class MemcachedPhpBagOStuff extends BagOStuff {
        /**
         * Encode a key for use on the wire inside the memcached protocol.
         *
-        * We encode spaces and line breaks to avoid protocol errors. We encode 
-        * the other control characters for compatibility with libmemcached 
+        * We encode spaces and line breaks to avoid protocol errors. We encode
+        * the other control characters for compatibility with libmemcached
         * verify_key. We leave other punctuation alone, to maximise backwards
         * compatibility.
         * @return string
         */
        public function encodeKey( $key ) {
-               return preg_replace_callback( '/[\x00-\x20\x25\x7f]+/', 
+               return preg_replace_callback( '/[\x00-\x20\x25\x7f]+/',
                        array( $this, 'encodeKeyCallback' ), $key );
        }
 
@@ -165,7 +197,7 @@ class MemcachedPhpBagOStuff extends BagOStuff {
        }
 
        /**
-        * Decode a key encoded with encodeKey(). This is provided as a convenience 
+        * Decode a key encoded with encodeKey(). This is provided as a convenience
         * function for debugging.
         *
         * @param $key string
index 9063093..fd60e72 100644 (file)
@@ -1,9 +1,32 @@
 <?php
+/**
+ * Wrapper for object caching in different caches.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * A cache class that replicates all writes to multiple child caches. Reads 
  * are implemented by reading from the caches in the order they are given in 
  * the configuration until a cache gives a positive result.
+ *
+ * @ingroup Cache
  */
 class MultiWriteBagOStuff extends BagOStuff {
        var $caches;
index 6225bb2..a59ca05 100644 (file)
@@ -1,10 +1,31 @@
 <?php
 /**
- * Functions to get cache objects
+ * Functions to get cache objects.
+ *
+ * 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
  * @ingroup Cache
  */
+
+/**
+ * Functions to get cache objects
+ *
+ * @ingroup Cache
+ */
 class ObjectCache {
        static $instances = array();
 
index 4dfa574..54a67e0 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using a SQL database.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * Class to store objects in the database
@@ -118,40 +139,64 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        public function get( $key ) {
-               # expire old entries if any
-               $this->garbageCollect();
-               $db = $this->getDB();
-               $tableName = $this->getTableByKey( $key );
-               $row = $db->selectRow( $tableName, array( 'value', 'exptime' ),
-                       array( 'keyname' => $key ), __METHOD__ );
+               $values = $this->getBatch( array( $key ) );
+               return $values[$key];
+       }
 
-               if ( !$row ) {
-                       $this->debug( 'get: no matching rows' );
-                       return false;
+       public function getBatch( array $keys ) {
+               $values = array(); // array of (key => value)
+
+               $keysByTableName = array();
+               foreach ( $keys as $key ) {
+                       $tableName = $this->getTableByKey( $key );
+                       if ( !isset( $keysByTableName[$tableName] ) ) {
+                               $keysByTableName[$tableName] = array();
+                       }
+                       $keysByTableName[$tableName][] = $key;
                }
 
-               $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
+               $db = $this->getDB();
+               $this->garbageCollect(); // expire old entries if any
 
-               if ( $this->isExpired( $row->exptime ) ) {
-                       $this->debug( "get: key has expired, deleting" );
-                       try {
-                               $db->begin( __METHOD__ );
-                               # Put the expiry time in the WHERE condition to avoid deleting a
-                               # newly-inserted value
-                               $db->delete( $tableName,
-                                       array(
-                                               'keyname' => $key,
-                                               'exptime' => $row->exptime
-                                       ), __METHOD__ );
-                               $db->commit( __METHOD__ );
-                       } catch ( DBQueryError $e ) {
-                               $this->handleWriteError( $e );
+               $dataRows = array();
+               foreach ( $keysByTableName as $tableName => $tableKeys ) {
+                       $res = $db->select( $tableName,
+                               array( 'keyname', 'value', 'exptime' ),
+                               array( 'keyname' => $tableKeys ),
+                               __METHOD__ );
+                       foreach ( $res as $row ) {
+                               $dataRows[$row->keyname] = $row;
                        }
+               }
 
-                       return false;
+               foreach ( $keys as $key ) {
+                       if ( isset( $dataRows[$key] ) ) { // HIT?
+                               $row = $dataRows[$key];
+                               $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
+                               if ( $this->isExpired( $row->exptime ) ) { // MISS
+                                       $this->debug( "get: key has expired, deleting" );
+                                       try {
+                                               $db->begin( __METHOD__ );
+                                               # Put the expiry time in the WHERE condition to avoid deleting a
+                                               # newly-inserted value
+                                               $db->delete( $this->getTableByKey( $key ),
+                                                       array( 'keyname' => $key, 'exptime' => $row->exptime ),
+                                                       __METHOD__ );
+                                               $db->commit( __METHOD__ );
+                                       } catch ( DBQueryError $e ) {
+                                               $this->handleWriteError( $e );
+                                       }
+                                       $values[$key] = false;
+                               } else { // HIT
+                                       $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
+                               }
+                       } else { // MISS
+                               $values[$key] = false;
+                               $this->debug( 'get: no matching rows' );
+                       }
                }
 
-               return $this->unserialize( $db->decodeBlob( $row->value ) );
+               return $values;
        }
 
        public function set( $key, $value, $exptime = 0 ) {
@@ -328,7 +373,7 @@ class SqlBagOStuff extends BagOStuff {
                                        if ( $maxExpTime !== false ) {
                                                $conds[] = 'exptime > ' . $db->addQuotes( $maxExpTime );
                                        }
-                                       $rows = $db->select( 
+                                       $rows = $db->select(
                                                $this->getTableByShard( $i ),
                                                array( 'keyname', 'exptime' ),
                                                $conds,
@@ -352,7 +397,7 @@ class SqlBagOStuff extends BagOStuff {
                                        $db->begin( __METHOD__ );
                                        $db->delete(
                                                $this->getTableByShard( $i ),
-                                               array( 
+                                               array(
                                                        'exptime >= ' . $db->addQuotes( $minExpTime ),
                                                        'exptime < ' . $db->addQuotes( $dbTimestamp ),
                                                        'keyname' => $keys
@@ -364,12 +409,12 @@ class SqlBagOStuff extends BagOStuff {
                                                if ( intval( $totalSeconds ) === 0 ) {
                                                        $percent = 0;
                                                } else {
-                                                       $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp ) 
+                                                       $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp )
                                                                - wfTimestamp( TS_UNIX, $maxExpTime );
                                                        if ( $remainingSeconds > $totalSeconds ) {
                                                                $totalSeconds = $remainingSeconds;
                                                        }
-                                                       $percent = ( $i + $remainingSeconds / $totalSeconds ) 
+                                                       $percent = ( $i + $remainingSeconds / $totalSeconds )
                                                                / $this->shards * 100;
                                                }
                                                call_user_func( $progressCallback, $percent );
index 7f46494..4fd3cf4 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using WinCache.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * Wrapper for WinCache object caching functions; identical interface
index 0ddf124..08f52b7 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using XCache.
+ *
+ * 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
+ * @ingroup Cache
+ */
 
 /**
  * Wrapper for XCache object caching functions; identical interface
index 8de1327..4bfa9d3 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Link functions provided by MediaWiki core; experimental
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
index 8be9946..912de41 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Parser functions provided by MediaWiki core
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
index 7d488c4..296be66 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Tag hooks provided by MediaWiki core
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
index 2199004..1638fb0 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Date formatter
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
index b5d5cb4..def1aee 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Holder of replacement pairs for wiki links
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
index 8954031..ba7ff60 100644 (file)
@@ -1,12 +1,29 @@
 <?php
 /**
- * @defgroup Parser Parser
+ * PHP parser that converts wiki markup to HTML.
+ *
+ * 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
  * @ingroup Parser
- * File for Parser and related classes
  */
 
+/**
+ * @defgroup Parser Parser
+ */
 
 /**
  * PHP Parser - Processes wiki markup (which uses a more user-friendly
@@ -144,7 +161,7 @@ class Parser {
        var $mLinkHolders;
 
        var $mLinkID;
-       var $mIncludeSizes, $mPPNodeCount, $mDefaultSort;
+       var $mIncludeSizes, $mPPNodeCount, $mHighestExpansionDepth, $mDefaultSort;
        var $mTplExpandCache; # empty-frame expansion cache
        var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
        var $mExpensiveFunctionCount; # number of expensive parser function calls
@@ -188,7 +205,7 @@ class Parser {
        public function __construct( $conf = array() ) {
                $this->mConf = $conf;
                $this->mUrlProtocols = wfUrlProtocols();
-               $this->mExtLinkBracketedRegex = '/\[((' . wfUrlProtocols() . ')'.
+               $this->mExtLinkBracketedRegex = '/\[((' . $this->mUrlProtocols . ')'.
                        self::EXT_LINK_URL_CLASS.'+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
@@ -287,6 +304,7 @@ class Parser {
                        'arg' => 0,
                );
                $this->mPPNodeCount = 0;
+               $this->mHighestExpansionDepth = 0;
                $this->mDefaultSort = false;
                $this->mHeadings = array();
                $this->mDoubleUnderscores = array();
@@ -445,9 +463,12 @@ class Parser {
                                array_values( $tidyregs ),
                                $text );
                }
-               global $wgExpensiveParserFunctionLimit;
-               if ( $this->mExpensiveFunctionCount > $wgExpensiveParserFunctionLimit ) {
-                       $this->limitationWarn( 'expensive-parserfunction', $this->mExpensiveFunctionCount, $wgExpensiveParserFunctionLimit );
+
+               if ( $this->mExpensiveFunctionCount > $this->mOptions->getExpensiveParserFunctionLimit() ) {
+                       $this->limitationWarn( 'expensive-parserfunction',
+                               $this->mExpensiveFunctionCount,
+                               $this->mOptions->getExpensiveParserFunctionLimit()
+                       );
                }
 
                wfRunHooks( 'ParserAfterTidy', array( &$this, &$text ) );
@@ -455,12 +476,13 @@ class Parser {
                # Information on include size limits, for the benefit of users who try to skirt them
                if ( $this->mOptions->getEnableLimitReport() ) {
                        $max = $this->mOptions->getMaxIncludeSize();
-                       $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/$wgExpensiveParserFunctionLimit\n";
+                       $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/{$this->mOptions->getExpensiveParserFunctionLimit()}\n";
                        $limitReport =
                                "NewPP limit report\n" .
                                "Preprocessor node count: {$this->mPPNodeCount}/{$this->mOptions->getMaxPPNodeCount()}\n" .
                                "Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
                                "Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n".
+                               "Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n".
                                $PFreport;
                        wfRunHooks( 'ParserLimitReport', array( $this, &$limitReport ) );
                        $text .= "\n<!-- \n$limitReport-->\n";
@@ -707,8 +729,8 @@ class Parser {
        }
 
        /**
-        * Get the target language for the content being parsed. This is usually the 
-        * language that the content is in. 
+        * Get the target language for the content being parsed. This is usually the
+        * language that the content is in.
         */
        function getTargetLanguage() {
                $target = $this->mOptions->getTargetLanguage();
@@ -1254,7 +1276,7 @@ class Parser {
                $text = $this->maybeMakeExternalImage( $url );
                if ( $text === false ) {
                        # Not an image, make a link
-                       $text = Linker::makeExternalLink( $url, 
+                       $text = Linker::makeExternalLink( $url,
                                $this->getConverterLanguage()->markNoConversion($url), true, 'free',
                                $this->getExternalLinkAttribs( $url ) );
                        # Register it in the output object...
@@ -1735,7 +1757,7 @@ class Parser {
                }
 
                if ( $this->getConverterLanguage()->hasVariants() ) {
-                       $selflink = $this->getConverterLanguage()->autoConvertToAllVariants( 
+                       $selflink = $this->getConverterLanguage()->autoConvertToAllVariants(
                                $this->mTitle->getPrefixedText() );
                } else {
                        $selflink = array( $this->mTitle->getPrefixedText() );
@@ -1814,7 +1836,7 @@ class Parser {
                        # Don't allow internal links to pages containing
                        # PROTO: where PROTO is a valid URL protocol; these
                        # should be external links.
-                       if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $m[1] ) ) {
+                       if ( preg_match( '/^(?:' . $this->mUrlProtocols . ')/', $m[1] ) ) {
                                $s .= $prefix . '[[' . $line ;
                                wfProfileOut( __METHOD__."-misc" );
                                continue;
@@ -2051,7 +2073,7 @@ class Parser {
         * @return String: less-or-more HTML with NOPARSE bits
         */
        function armorLinks( $text ) {
-               return preg_replace( '/\b(' . wfUrlProtocols() . ')/',
+               return preg_replace( '/\b(' . $this->mUrlProtocols . ')/',
                        "{$this->mUniqPrefix}NOPARSE$1", $text );
        }
 
@@ -3054,7 +3076,7 @@ class Parser {
         * @private
         */
        function braceSubstitution( $piece, $frame ) {
-               global $wgNonincludableNamespaces, $wgContLang;
+               global $wgContLang;
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__.'-setup' );
 
@@ -3249,8 +3271,11 @@ class Parser {
 
                # Load from database
                if ( !$found && $title ) {
-                       $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
-                       wfProfileIn( $titleProfileIn ); // template in
+                       if ( !Profiler::instance()->isPersistent() ) {
+                               # Too many unique items can kill profiling DBs/collectors
+                               $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
+                               wfProfileIn( $titleProfileIn ); // template in
+                       }
                        wfProfileIn( __METHOD__ . '-loadtpl' );
                        if ( !$title->isExternal() ) {
                                if ( $title->isSpecialPage()
@@ -3284,7 +3309,7 @@ class Parser {
                                                $isHTML = true;
                                                $this->disableCache();
                                        }
-                               } elseif ( $wgNonincludableNamespaces && in_array( $title->getNamespace(), $wgNonincludableNamespaces ) ) {
+                               } elseif ( MWNamespace::isNonincludableNamespace( $title->getNamespace() ) ) {
                                        $found = false; # access denied
                                        wfDebug( __METHOD__.": template inclusion denied for " . $title->getPrefixedDBkey() );
                                } else {
@@ -3811,12 +3836,8 @@ class Parser {
         * @return Boolean: false if the limit has been exceeded
         */
        function incrementExpensiveFunctionCount() {
-               global $wgExpensiveParserFunctionLimit;
                $this->mExpensiveFunctionCount++;
-               if ( $this->mExpensiveFunctionCount <= $wgExpensiveParserFunctionLimit ) {
-                       return true;
-               }
-               return false;
+               return $this->mExpensiveFunctionCount <= $this->mOptions->getExpensiveParserFunctionLimit();
        }
 
        /**
@@ -4377,8 +4398,7 @@ class Parser {
                ) );
 
                # Context links: [[|name]] and [[name (context)|]]
-               global $wgLegalTitleChars;
-               $tc = "[$wgLegalTitleChars]";
+               $tc = '[' . Title::legalChars() . ']';
                $nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
 
                $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";           # [[ns:page (context)|]]
@@ -4854,30 +4874,41 @@ class Parser {
 
                        $label = '';
                        $alt = '';
+                       $link = '';
                        if ( isset( $matches[3] ) ) {
                                // look for an |alt= definition while trying not to break existing
                                // captions with multiple pipes (|) in it, until a more sensible grammar
                                // is defined for images in galleries
 
                                $matches[3] = $this->recursiveTagParse( trim( $matches[3] ) );
-                               $altmatches = StringUtils::explode('|', $matches[3]);
+                               $parameterMatches = StringUtils::explode('|', $matches[3]);
                                $magicWordAlt = MagicWord::get( 'img_alt' );
+                               $magicWordLink = MagicWord::get( 'img_link' );
 
-                               foreach ( $altmatches as $altmatch ) {
-                                       $match = $magicWordAlt->matchVariableStartToEnd( $altmatch );
-                                       if ( $match ) {
+                               foreach ( $parameterMatches as $parameterMatch ) {
+                                       if ( $match = $magicWordAlt->matchVariableStartToEnd( $parameterMatch ) ) {
                                                $alt = $this->stripAltText( $match, false );
                                        }
+                                       elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ){
+                                               $link = strip_tags($this->replaceLinkHoldersText($match));
+                                               $chars = self::EXT_LINK_URL_CLASS;
+                                               $prots = $this->mUrlProtocols;
+                                               //check to see if link matches an absolute url, if not then it must be a wiki link.
+                                               if(!preg_match( "/^($prots)$chars+$/u", $link)){
+                                                       $localLinkTitle = Title::newFromText($link);
+                                                       $link = $localLinkTitle->getLocalURL();
+                                               }
+                                       }
                                        else {
                                                // concatenate all other pipes
-                                               $label .= '|' . $altmatch;
+                                               $label .= '|' . $parameterMatch;
                                        }
                                }
                                // remove the first pipe
                                $label = substr( $label, 1 );
                        }
 
-                       $ig->add( $title, $label, $alt );
+                       $ig->add( $title, $label, $alt ,$link);
                }
                return $ig->toHTML();
        }
@@ -5562,7 +5593,7 @@ class Parser {
                # @todo FIXME: Not tolerant to blank link text
                # I.E. [http://www.mediawiki.org] will render as [1] or something depending
                # on how many empty links there are on the page - need to figure that out.
-               $text = preg_replace( '/\[(?:' . wfUrlProtocols() . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
+               $text = preg_replace( '/\[(?:' . $this->mUrlProtocols . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
 
                # Parse wikitext quotes (italics & bold)
                $text = $this->doQuotes( $text );
index a8899cb..bb99039 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Cache for outputs of the PHP parser
  *
+ * 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
+ * @ingroup Cache Parser
  */
 
 /**
index bf9611f..211fcd6 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * \brief Options for the PHP parser
+ * Options for the PHP parser
+ *
+ * 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
  * @ingroup Parser
@@ -90,6 +105,11 @@ class ParserOptions {
         */
        var $mMaxTemplateDepth;
        
+       /**
+        * Maximum number of calls per parse to expensive parser functions
+        */
+       var $mExpensiveParserFunctionLimit;
+       
        /**
         * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
         */
@@ -201,6 +221,8 @@ class ParserOptions {
        function getMaxPPNodeCount()                { return $this->mMaxPPNodeCount; }
        function getMaxPPExpandDepth()              { return $this->mMaxPPExpandDepth; }
        function getMaxTemplateDepth()              { return $this->mMaxTemplateDepth; }
+       /* @since 1.20 */
+       function getExpensiveParserFunctionLimit()  { return $this->mExpensiveParserFunctionLimit; }
        function getRemoveComments()                { return $this->mRemoveComments; }
        function getTemplateCallback()              { return $this->mTemplateCallback; }
        function getEnableLimitReport()             { return $this->mEnableLimitReport; }
@@ -286,6 +308,8 @@ class ParserOptions {
        function setMaxIncludeSize( $x )            { return wfSetVar( $this->mMaxIncludeSize, $x ); }
        function setMaxPPNodeCount( $x )            { return wfSetVar( $this->mMaxPPNodeCount, $x ); }
        function setMaxTemplateDepth( $x )          { return wfSetVar( $this->mMaxTemplateDepth, $x ); }
+       /* @since 1.20 */
+       function setExpensiveParserFunctionLimit( $x ) { return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); }
        function setRemoveComments( $x )            { return wfSetVar( $this->mRemoveComments, $x ); }
        function setTemplateCallback( $x )          { return wfSetVar( $this->mTemplateCallback, $x ); }
        function enableLimitReport( $x = true )     { return wfSetVar( $this->mEnableLimitReport, $x ); }
@@ -380,7 +404,7 @@ class ParserOptions {
                global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages,
                        $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion,
                        $wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth,
-                       $wgCleanSignatures, $wgExternalLinkTarget;
+                       $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit;
 
                wfProfileIn( __METHOD__ );
 
@@ -394,6 +418,7 @@ class ParserOptions {
                $this->mMaxPPNodeCount = $wgMaxPPNodeCount;
                $this->mMaxPPExpandDepth = $wgMaxPPExpandDepth;
                $this->mMaxTemplateDepth = $wgMaxTemplateDepth;
+               $this->mExpensiveParserFunctionLimit = $wgExpensiveParserFunctionLimit;
                $this->mCleanSignatures = $wgCleanSignatures;
                $this->mExternalLinkTarget = $wgExternalLinkTarget;
 
index 0d597e8..6340787 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Output of the PHP parser
  *
+ * 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
  * @ingroup Parser
  */
@@ -10,7 +25,6 @@
  * @todo document
  * @ingroup Parser
  */
-
 class CacheTime {
        var     $mVersion = Parser::VERSION,  # Compatibility check
                $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
index efad33f..f25340f 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Fake parser that output the difference of two different parsers
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
index 244890f..9555bdb 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Modified version of the PHP parser with hooks for wiki links; experimental
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
index ae088fd..3d2f2f8 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Interfaces for preprocessors
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
index f129f73..602d88f 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Preprocessor using PHP's dom extension
  *
+ * 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
  * @ingroup Parser
  */
@@ -958,14 +973,25 @@ class PPFrame_DOM implements PPFrame {
                }
 
                if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+                       $this->parser->limitationWarn( 'node-count-exceeded',
+                               $this->parser->mPPNodeCount,
+                               $this->parser->mOptions->getMaxPPNodeCount()
+                       );
                        return '<span class="error">Node-count limit exceeded</span>';
                }
 
                if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+                       $this->parser->limitationWarn( 'expansion-depth-exceeded',
+                               $expansionDepth,
+                               $this->parser->mOptions->getMaxPPExpandDepth()
+                       );
                        return '<span class="error">Expansion depth limit exceeded</span>';
                }
                wfProfileIn( __METHOD__ );
                ++$expansionDepth;
+               if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+                       $this->parser->mHighestExpansionDepth = $expansionDepth;
+               }
 
                if ( $root instanceof PPNode_DOM ) {
                        $root = $root->node;
index 28283c7..dc2d63a 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Preprocessor using PHP arrays
  *
+ * 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
  * @ingroup Parser
  */
@@ -915,12 +930,23 @@ class PPFrame_Hash implements PPFrame {
                }
 
                if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+                       $this->parser->limitationWarn( 'node-count-exceeded',
+                                       $this->parser->mPPNodeCount,
+                                       $this->parser->mOptions->getMaxPPNodeCount()
+                       );
                        return '<span class="error">Node-count limit exceeded</span>';
                }
                if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+                       $this->parser->limitationWarn( 'expansion-depth-exceeded',
+                                       $expansionDepth,
+                                       $this->parser->mOptions->getMaxPPExpandDepth()
+                       );
                        return '<span class="error">Expansion depth limit exceeded</span>';
                }
                ++$expansionDepth;
+               if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+                       $this->parser->mHighestExpansionDepth = $expansionDepth;
+               }
 
                $outStack = array( '', '' );
                $iteratorStack = array( false, $root );
index aedcac2..b30b096 100644 (file)
@@ -3,6 +3,21 @@
  * A preprocessor optimised for HipHop, using HipHop-specific syntax.
  * vim: ft=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
  * @ingroup Parser
  */
@@ -1073,12 +1088,23 @@ class PPFrame_HipHop implements PPFrame {
                }
 
                if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+                       $this->parser->limitationWarn( 'node-count-exceeded',
+                                       $this->parser->mPPNodeCount,
+                                       $this->parser->mOptions->getMaxPPNodeCount()
+                       );
                        return '<span class="error">Node-count limit exceeded</span>';
                }
                if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+                       $this->parser->limitationWarn( 'expansion-depth-exceeded',
+                                       $expansionDepth,
+                                       $this->parser->mOptions->getMaxPPExpandDepth()
+                       );
                        return '<span class="error">Expansion depth limit exceeded</span>';
                }
                ++$expansionDepth;
+               if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+                       $this->parser->mHighestExpansionDepth = $expansionDepth;
+               }
 
                $outStack = array( '', '' );
                $iteratorStack = array( false, $root );
index 7ad80fa..b08aa14 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Holder for stripped items when parsing wiki markup.
+ *
+ * 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
+ * @ingroup Parser
+ */
 
 /**
  * @todo document, briefly.
@@ -10,6 +31,10 @@ class StripState {
        protected $regex;
 
        protected $tempType, $tempMergePrefix;
+       protected $circularRefGuard;
+       protected $recursionLevel = 0;
+
+       const UNSTRIP_RECURSION_LIMIT = 20;
 
        /**
         * @param $prefix string
@@ -21,6 +46,7 @@ class StripState {
                        'general' => array()
                );
                $this->regex = "/{$this->prefix}([^\x7f]+)" . Parser::MARKER_SUFFIX . '/';
+               $this->circularRefGuard = array();
        }
 
        /**
@@ -92,12 +118,10 @@ class StripState {
                }
 
                wfProfileIn( __METHOD__ );
+               $oldType = $this->tempType;
                $this->tempType = $type;
-               do {
-                       $oldText = $text;
-                       $text = preg_replace_callback( $this->regex, array( $this, 'unstripCallback' ), $text );
-               } while ( $text !== $oldText );
-               $this->tempType = null;
+               $text = preg_replace_callback( $this->regex, array( $this, 'unstripCallback' ), $text );
+               $this->tempType = $oldType;
                wfProfileOut( __METHOD__ );
                return $text;
        }
@@ -107,8 +131,22 @@ class StripState {
         * @return array
         */
        protected function unstripCallback( $m ) {
-               if ( isset( $this->data[$this->tempType][$m[1]] ) ) {
-                       return $this->data[$this->tempType][$m[1]];
+               $marker = $m[1];
+               if ( isset( $this->data[$this->tempType][$marker] ) ) {
+                       if ( isset( $this->circularRefGuard[$marker] ) ) {
+                               return '<span class="error">' . wfMsgForContent( 'parser-unstrip-loop-warning' ) . '</span>';
+                       }
+                       if ( $this->recursionLevel >= self::UNSTRIP_RECURSION_LIMIT ) {
+                               return '<span class="error">' . 
+                                       wfMsgForContent( 'parser-unstrip-recursion-limit', self::UNSTRIP_RECURSION_LIMIT ) . 
+                                       '</span>';
+                       }
+                       $this->circularRefGuard[$marker] = true;
+                       $this->recursionLevel++;
+                       $ret = $this->unstripType( $this->tempType, $this->data[$this->tempType][$marker] );
+                       $this->recursionLevel--;
+                       unset( $this->circularRefGuard[$marker] );
+                       return $ret;
                } else {
                        return $m[0];
                }
index 8bd80b2..ed2d436 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * HTML validation and correction
  *
+ * 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
+ * @ingroup Parser
  */
 
 /**
@@ -14,6 +30,8 @@
  *
  * This re-uses some of the parser's UNIQ tricks, though some of it is private so it's
  * duplicated. Perhaps we should create an abstract marker hiding class.
+ *
+ * @ingroup Parser
  */
 class MWTidyWrapper {
 
index f884063..62be39e 100644 (file)
@@ -1,12 +1,31 @@
 <?php
 /**
- * @defgroup Profiler Profiler
+ * Base class and functions for profiling.
+ *
+ * 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
  * @ingroup Profiler
  * This file is only included if profiling is enabled
  */
 
+/**
+ * @defgroup Profiler Profiler
+ */
+
 /**
  * Begin profiling of a function
  * @param $functionname String: name of the function we will profile
@@ -95,6 +114,16 @@ class Profiler {
                return false;
        }
 
+       /**
+        * Return whether this profiler stores data
+        *
+        * @see Profiler::logData()
+        * @return Boolean
+        */
+       public function isPersistent() {
+               return true;
+       }
+
        public function setProfileID( $id ) {
                $this->mProfileID = $id;
        }
@@ -460,7 +489,7 @@ class Profiler {
                }
                wfProfileOut( '-overhead-total' );
        }
-       
+
        /**
         * Counts the number of profiled function calls sitting under
         * the given point in the call graph. Not the most efficient algo.
@@ -530,7 +559,7 @@ class Profiler {
                        $rc = $dbw->affectedRows();
                        if ( $rc == 0 ) {
                                $dbw->insert('profiling', array ('pf_name' => $name, 'pf_count' => $eventCount,
-                                       'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ), 
+                                       'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
                                        __METHOD__, array ('IGNORE'));
                        }
                        // When we upgrade to mysql 4.1, the insert+update
index 1091495..d1d1c5d 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Base class for simple profiling.
+ *
+ * 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
  * @ingroup Profiler
  */
@@ -15,6 +32,11 @@ class ProfilerSimple extends Profiler {
        var $zeroEntry = array('cpu'=> 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0);
        var $errorEntry;
 
+       public function isPersistent() {
+               /* Implement in output subclasses */
+               return false;
+       }
+
        protected function addInitialStack() {
                $this->errorEntry = $this->zeroEntry;
                $this->errorEntry['count'] = 1;
index 3621a41..3e7d6fa 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Profiler showing output in page source.
+ *
+ * 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
  * @ingroup Profiler
  */
index 7602f06..822e9fe 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Profiler showing execution trace.
+ *
+ * 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
  * @ingroup Profiler
  */
@@ -44,7 +61,7 @@ class ProfilerSimpleTrace extends ProfilerSimple {
                                        str_repeat(" ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
                }
        }
-       
+
        function memoryDiff() {
                $diff = memory_get_usage() - $this->memory;
                $this->memory = memory_get_usage();
index ae607aa..a95ccb0 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Profiler sending messages over UDP.
+ *
+ * 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
  * @ingroup Profiler
  */
  * @ingroup Profiler
  */
 class ProfilerSimpleUDP extends ProfilerSimple {
+       public function isPersistent() {
+               return true;
+       }
+
        public function logData() {
                global $wgUDPProfilerHost, $wgUDPProfilerPort;
 
index 1a0933c..c0eb0fb 100644 (file)
@@ -1,13 +1,38 @@
 <?php
 /**
- * Stub profiling functions
+ * Stub profiling functions.
+ *
+ * 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
  * @ingroup Profiler
  */
+
+/**
+ * Stub profiler that does nothing
+ *
+ * @ingroup Profiler
+ */
 class ProfilerStub extends Profiler {
        public function isStub() {
                return true;
        }
+       public function isPersistent() {
+               return false;
+       }
        public function profileIn( $fn ) {}
        public function profileOut( $fn ) {}
        public function getOutput() {}
index 7a036b8..71e68d1 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Base class for resource loading system.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -500,10 +502,6 @@ class ResourceLoader {
                        $response = $this->makeComment( $warnings ) . $response;
                }
 
-               // Remove the output buffer and output the response
-               ob_end_clean();
-               echo $response;
-
                // Save response to file cache unless there are errors
                if ( isset( $fileCache ) && !$errors && !$missing ) {
                        // Cache single modules...and other requests if there are enough hits
@@ -516,6 +514,10 @@ class ResourceLoader {
                        }
                }
 
+               // Remove the output buffer and output the response
+               ob_end_clean();
+               echo $response;
+
                wfProfileOut( __METHOD__ );
        }
 
@@ -599,7 +601,7 @@ class ResourceLoader {
        /**
         * Send out code for a response from file cache if possible
         *
-        * @param $fileCache ObjectFileCache: Cache object for this request URL
+        * @param $fileCache ResourceFileCache: Cache object for this request URL
         * @param $context ResourceLoaderContext: Context in which to generate a response
         * @return bool If this found a cache file and handled the response
         */
index dd69bb0..4e28e76 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Context for resource loader modules.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 3d657e1..e8542ac 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module based on local JavaScript/CSS files.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index e3b719b..61ed520 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Resource loader module for MediaWiki:Filepage.css
+ *
+ * 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
+ */
+
 /**
  * ResourceLoader definition for MediaWiki:Filepage.css
  */
index e1d6fb4..4eb38f6 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for populating language specific data.
+ *
  * 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
index 1a232ec..fa76a25 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Abstraction for resource loader modules.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 28f629a..8e81c8d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader for site customizations for users without JavaScript enabled.
+ *
  * 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
index 2527a0a..03fe1fe 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for site customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 5dbce43..74724a6 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Module for resource loader initialization.
+ *
  * 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
@@ -80,7 +82,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgDefaultDateFormat' => $wgContLang->getDefaultDateFormat(),
                        'wgMonthNames' => $wgContLang->getMonthNamesArray(),
                        'wgMonthNamesShort' => $wgContLang->getMonthAbbreviationsArray(),
-                       'wgMainPageTitle' => $mainPage ? $mainPage->getPrefixedText() : null,
+                       'wgMainPageTitle' => $mainPage->getPrefixedText(),
                        'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
                        'wgNamespaceIds' => $namespaceIds,
                        'wgSiteName' => $wgSitename,
@@ -125,12 +127,12 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
+                       $deps = $module->getDependencies();
+                       $group = $module->getGroup();
+                       $source = $module->getSource();
                        // Support module loader scripts
                        $loader = $module->getLoaderScript();
                        if ( $loader !== false ) {
-                               $deps = $module->getDependencies();
-                               $group = $module->getGroup();
-                               $source = $module->getSource();
                                $version = wfTimestamp( TS_ISO_8601_BASIC,
                                        $module->getModifiedTime( $context ) );
                                $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
@@ -143,26 +145,23 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
                                // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
                                // mw.loader.register()
-                               if ( !count( $module->getDependencies() && $module->getGroup() === null && $module->getSource() === 'local' ) ) {
+                               if ( !count( $deps ) && $group === null && $source === 'local' ) {
                                        $registrations[] = array( $name, $mtime );
                                }
                                // Modules with dependencies but no group or foreign source pass three arguments
                                // (name, timestamp, dependencies) to mw.loader.register()
-                               elseif ( $module->getGroup() === null && $module->getSource() === 'local' ) {
-                                       $registrations[] = array(
-                                               $name, $mtime,  $module->getDependencies() );
+                               elseif ( $group === null && $source === 'local' ) {
+                                       $registrations[] = array( $name, $mtime, $deps );
                                }
                                // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
                                // to mw.loader.register()
-                               elseif ( $module->getSource() === 'local' ) {
-                                       $registrations[] = array(
-                                               $name, $mtime,  $module->getDependencies(), $module->getGroup() );
+                               elseif ( $source === 'local' ) {
+                                       $registrations[] = array( $name, $mtime, $deps, $group );
                                }
                                // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
                                // to mw.loader.register()
                                else {
-                                       $registrations[] = array(
-                                               $name, $mtime, $module->getDependencies(), $module->getGroup(), $module->getSource() );
+                                       $registrations[] = array( $name, $mtime, $deps, $group, $source );
                                }
                        }
                }
@@ -185,19 +184,20 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                if ( $context->getOnly() === 'scripts' ) {
 
                        // The core modules:
-                       $modules = array( 'jquery', 'mediawiki' );
-                       wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$modules ) );
+                       $moduleNames = array( 'jquery', 'mediawiki' );
+                       wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ) );
 
                        // Get the latest version
+                       $loader = $context->getResourceLoader();
                        $version = 0;
-                       foreach ( $modules as $moduleName ) {
+                       foreach ( $moduleNames as $moduleName ) {
                                $version = max( $version,
-                                       $context->getResourceLoader()->getModule( $moduleName )->getModifiedTime( $context )
+                                       $loader->getModule( $moduleName )->getModifiedTime( $context )
                                );
                        }
                        // Build load query for StartupModules
                        $query = array(
-                               'modules' => ResourceLoader::makePackedModulesString( $modules ),
+                               'modules' => ResourceLoader::makePackedModulesString( $moduleNames ),
                                'only' => 'scripts',
                                'lang' => $context->getLanguage(),
                                'skin' => $context->getSkin(),
@@ -210,6 +210,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // Startup function
                        $configuration = $this->getConfig( $context );
                        $registrations = self::getModuleRegistrations( $context );
+                       $registrations = str_replace( "\n", "\n\t", trim( $registrations ) ); // fix indentation
                        $out .= "var startUp = function() {\n" .
                                "\tmw.config = new " . Xml::encodeJsCall( 'mw.Map', array( $wgLegacyJavaScriptGlobals ) ) . "\n" .
                                "\t$registrations\n" .
index ccfc378..139048c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user preference customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index b5d96ca..36ca712 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 9fa9bce..58fa79b 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 933c55e..4624cbc 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user preference customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 852cc2c..62d096a 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user tokens.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 91a51f8..a69676d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Abstraction for resource loader modules which pull from wiki pages.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -70,8 +72,10 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         */
        protected function getContent( $title ) {
                if ( $title->getNamespace() === NS_MEDIAWIKI ) {
-                       $message = wfMessage( $title->getDBkey() )->inContentLanguage();
-                       return $message->exists() ? $message->plain() : '';
+                       // The first "true" is to use the database, the second is to use the content langue
+                       // and the last one is to specify the message key already contains the language in it ("/de", etc.)
+                       $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
+                       return $text === false ? '' : $text;
                }
                if ( !$title->isCssJsSubpage() && !$title->isCssOrJsPage() ) {
                        return null;
index 9ca98e5..2c55980 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Base implementations for deletable items.
+ *
+ * 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
+ * @ingroup RevisionDelete
+ */
+
 /**
  * List for revision table items
  *
index e109e65..4f58099 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Interface definition for deletable items.
+ *
+ * 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
+ * @ingroup RevisionDelete
+ */
 
 /**
  * Abstract base class for a list of deletable items. The list class
index 0e965c8..c02e9c7 100644 (file)
@@ -1,9 +1,6 @@
 <?php
 /**
- * Backend functions for suppressing and unsuppressing all references to a given user,
- * used when blocking with HideUser enabled.  This was spun out of SpecialBlockip.php
- * in 1.18; at some point it needs to be rewritten to either use RevisionDelete abstraction,
- * or at least schema abstraction.
+ * Backend functions for suppressing and unsuppressing all references to a given user.
  *
  * 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
  * @file
  * @ingroup RevisionDelete
  */
+
+/**
+ * Backend functions for suppressing and unsuppressing all references to a given user,
+ * used when blocking with HideUser enabled.  This was spun out of SpecialBlockip.php
+ * in 1.18; at some point it needs to be rewritten to either use RevisionDelete abstraction,
+ * or at least schema abstraction.
+ *
+ * @ingroup RevisionDelete
+ */
 class RevisionDeleteUser {
 
        /**
index 8f85ae3..95d372c 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Revision/log/file deletion backend
  *
+ * 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
+ * @ingroup RevisionDelete
  */
 
 /**
index 0348ed1..678c530 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Basic search engine
  *
+ * 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
  * @ingroup Search
  */
index a162d2b..40dd36c 100644 (file)
@@ -4,6 +4,21 @@
  *
  * See deferred.txt
  *
+ * 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
  * @ingroup Search
  */
index 31a3994..0f8b255 100644 (file)
@@ -477,7 +477,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 
                        if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
                                # $s is the first link of the next chunk
-                               $t = Title::MakeTitle($namespace, $s->page_title);
+                               $t = Title::makeTitle($namespace, $s->page_title);
                                $query = array( 'from' => $t->getText() );
 
                                if( $namespace )
index a58e62e..4d74fe1 100644 (file)
@@ -277,7 +277,7 @@ class SpecialBlock extends FormSpecialPage {
                        }
 
                        $this->alreadyBlocked = true;
-                       $this->preErrors[] = array( 'ipb-needreblock', (string)$block->getTarget() );
+                       $this->preErrors[] = array( 'ipb-needreblock', wfEscapeWikiText( (string)$block->getTarget() ) );
                }
 
                # We always need confirmation to do HideUser
@@ -349,7 +349,7 @@ class SpecialBlock extends FormSpecialPage {
 
                # Link to unblock the specified user, or to a blank unblock form
                if( $this->target instanceof User ) {
-                       $message = $this->msg( 'ipb-unblock-addr', $this->target->getName() )->parse();
+                       $message = $this->msg( 'ipb-unblock-addr', wfEscapeWikiText( $this->target->getName() ) )->parse();
                        $list = SpecialPage::getTitleFor( 'Unblock', $this->target->getName() );
                } else {
                        $message = $this->msg( 'ipb-unblock' )->parse();
@@ -904,7 +904,7 @@ class SpecialBlock extends FormSpecialPage {
        public function onSuccess() {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'blockipsuccesssub' ) );
-               $out->addWikiMsg( 'blockipsuccesstext',  $this->target );
+               $out->addWikiMsg( 'blockipsuccesstext', wfEscapeWikiText( $this->target ) );
        }
 }
 
index b8dbe9e..d624430 100644 (file)
@@ -27,7 +27,7 @@
  *
  * @ingroup SpecialPage
  */
-class BrokenRedirectsPage extends PageQueryPage {
+class BrokenRedirectsPage extends QueryPage {
 
        function __construct( $name = 'BrokenRedirects' ) {
                parent::__construct( $name );
diff --git a/includes/specials/SpecialCachedPage.php b/includes/specials/SpecialCachedPage.php
new file mode 100644 (file)
index 0000000..7b59b93
--- /dev/null
@@ -0,0 +1,169 @@
+<?php
+
+/**
+ * Abstract special page class with scaffolding for caching HTML and other values
+ * in a single blob.
+ *
+ * Before using any of the caching functionality, call startCache.
+ * After the last call to either getCachedValue or addCachedHTML, call saveCache.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * @since 1.20
+ *
+ * @file SpecialCachedPage.php
+ * @ingroup SpecialPage
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
+
+       /**
+        * CacheHelper object to which we forward the non-SpecialPage specific caching work.
+        * Initialized in startCache.
+        *
+        * @since 1.20
+        * @var CacheHelper
+        */
+       protected $cacheHelper;
+
+       /**
+        * If the cache is enabled or not.
+        *
+        * @since 1.20
+        * @var boolean
+        */
+       protected $cacheEnabled = true;
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       public function setCacheEnabled( $cacheEnabled ) {
+               $this->cacheHelper->setCacheEnabled( $cacheEnabled );
+       }
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
+               $this->cacheHelper = new CacheHelper();
+
+               $this->cacheHelper->setCacheEnabled( $this->cacheEnabled );
+               $this->cacheHelper->setOnInitializedHandler( array( $this, 'onCacheInitialized' ) );
+
+               $keyArgs = $this->getCacheKey();
+
+               if ( array_key_exists( 'action', $keyArgs ) && $keyArgs['action'] === 'purge' ) {
+                       unset( $keyArgs['action'] );
+               }
+
+               $this->cacheHelper->setCacheKey( $keyArgs );
+
+               if ( $this->getRequest()->getText( 'action' ) === 'purge' ) {
+                       $this->cacheHelper->rebuildOnDemand();
+               }
+
+               $this->cacheHelper->startCache( $cacheExpiry, $cacheEnabled );
+       }
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               return $this->cacheHelper->getCachedValue( $computeFunction, $args, $key );
+       }
+
+       /**
+        * Add some HTML to be cached.
+        * This is done by providing a callback function that should
+        * return the HTML to be added. It will only be called if the
+        * item is not in the cache yet or when the cache has been invalidated.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array $args
+        * @param string|null $key
+        */
+       public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
+               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+       }
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       public function saveCache() {
+               $this->cacheHelper->saveCache();
+       }
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       public function setExpiry( $cacheExpiry ) {
+               $this->cacheHelper->setExpiry( $cacheExpiry );
+       }
+
+       /**
+        * Returns the variables used to constructed the cache key in an array.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getCacheKey() {
+               return array(
+                       $this->mName,
+                       $this->getLanguage()->getCode()
+               );
+       }
+
+       /**
+        * Gets called after the cache got initialized.
+        *
+        * @since 1.20
+        *
+        * @param boolean $hasCached
+        */
+       public function onCacheInitialized( $hasCached ) {
+               if ( $hasCached ) {
+                       $this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
+               }
+       }
+
+}
\ No newline at end of file
index 338cd70..6d2831c 100644 (file)
@@ -59,16 +59,12 @@ class SpecialCategories extends SpecialPage {
  * @ingroup SpecialPage Pager
  */
 class CategoryPager extends AlphabeticPager {
-       private $conds = array( 'cat_pages > 0' );
-
        function __construct( IContextSource $context, $from ) {
                parent::__construct( $context );
                $from = str_replace( ' ', '_', $from );
                if( $from !== '' ) {
                        $from = Title::capitalize( $from, NS_CATEGORY );
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $this->conds[] = 'cat_title >= ' . $dbr->addQuotes( $from );
-                       $this->setOffset( '' );
+                       $this->mOffset = $from;
                }
        }
 
@@ -76,7 +72,7 @@ class CategoryPager extends AlphabeticPager {
                return array(
                        'tables' => array( 'category' ),
                        'fields' => array( 'cat_title','cat_pages' ),
-                       'conds' => $this->conds,
+                       'conds' => array( 'cat_pages > 0' ),
                        'options' => array( 'USE INDEX' => 'cat_title' ),
                );
        }
index e84118b..1b7494f 100644 (file)
@@ -54,6 +54,9 @@ class SpecialContributions extends SpecialPage {
                if ( $request->getVal( 'contribs' ) == 'newbie' ) {
                        $target = 'newbies';
                        $this->opts['contribs'] = 'newbie';
+               } elseif ( $par === 'newbies' ) { // b/c for WMF
+                       $target = 'newbies';
+                       $this->opts['contribs'] = 'newbie';
                } else {
                        $this->opts['contribs'] = 'user';
                }
@@ -654,7 +657,7 @@ class ContribsPager extends ReverseChronologicalPager {
                        } else {
                                $condition['rev_user_text'] = $this->target;
                                $index = 'usertext_timestamp';
-                       } 
+                       }
                }
                if ( $this->deletedOnly ) {
                        $condition[] = "rev_deleted != '0'";
index 8f780b5..a5ab3e6 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @ingroup SpecialPage
  */
-class DisambiguationsPage extends PageQueryPage {
+class DisambiguationsPage extends QueryPage {
 
        function __construct( $name = 'Disambiguations' ) {
                parent::__construct( $name );
index a6df66f..51cb08a 100644 (file)
@@ -27,7 +27,7 @@
  *
  * @ingroup SpecialPage
  */
-class DoubleRedirectsPage extends PageQueryPage {
+class DoubleRedirectsPage extends QueryPage {
 
        function __construct( $name = 'DoubleRedirects' ) {
                parent::__construct( $name );
index fa48317..b46ef0e 100644 (file)
@@ -3,10 +3,34 @@
  * @defgroup Watchlist Users watchlist handling
  */
 
+/**
+ * Implements Special:EditWatchlist
+ *
+ * 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
+ * @ingroup SpecialPage
+ * @ingroup Watchlist
+ */
+
 /**
  * Provides the UI through which users can perform editing
  * operations on their watchlist
  *
+ * @ingroup SpecialPage
  * @ingroup Watchlist
  * @author Rob Church <robchur@gmail.com>
  */
index 314da72..55b500d 100644 (file)
@@ -61,7 +61,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        ),
                        'Subject' => array(
                                'type' => 'text',
-                               'default' => wfMsgExt( 'defemailsubject', array( 'content', 'parsemag' ), $this->getUser()->getName() ),
+                               'default' => $this->msg( 'defemailsubject',
+                                       $this->getUser()->getName() )->inContentLanguage()->text(),
                                'label-message' => 'emailsubject',
                                'maxlength' => 200,
                                'size' => 60,
@@ -124,11 +125,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $this->mTargetObj = $ret;
 
                $form = new HTMLForm( $this->getFormFields(), $this->getContext() );
-               $form->addPreText( wfMsgExt( 'emailpagetext', 'parseinline' ) );
-               $form->setSubmitText( wfMsg( 'emailsend' ) );
+               $form->addPreText( $this->msg( 'emailpagetext' )->parse() );
+               $form->setSubmitTextMsg( 'emailsend' );
                $form->setTitle( $this->getTitle() );
-               $form->setSubmitCallback( array( __CLASS__, 'submit' ) );
-               $form->setWrapperLegend( wfMsgExt( 'email-legend', 'parsemag' ) );
+               $form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
+               $form->setWrapperLegendMsg( 'email-legend' );
                $form->loadData();
 
                if( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
@@ -224,14 +225,26 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $string = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' ) ) .
                        Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
                        Xml::openElement( 'fieldset' ) .
-                       Html::rawElement( 'legend', null, wfMessage( 'emailtarget' )->parse() ) .
-                       Xml::inputLabel( wfMessage( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
-                       Xml::submitButton( wfMessage( 'emailusernamesubmit' )->text() ) .
+                       Html::rawElement( 'legend', null, $this->msg( 'emailtarget' )->parse() ) .
+                       Xml::inputLabel( $this->msg( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
+                       Xml::submitButton( $this->msg( 'emailusernamesubmit' )->text() ) .
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' ) . "\n";
                return $string;
        }
 
+       /**
+        * Submit callback for an HTMLForm object, will simply call submit().
+        *
+        * @since 1.20
+        * @param $data array
+        * @param $form HTMLForm object
+        * @return Status|string|bool
+        */
+       public static function uiSubmit( array $data, HTMLForm $form ) {
+               return self::submit( $data, $form->getContext() );
+       }
+
        /**
         * Really send a mail. Permissions should have been checked using
         * getPermissionsError(). It is probably also a good
@@ -240,25 +253,22 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * @return Mixed: Status object, or potentially a String on error
         * or maybe even true on success if anything uses the EmailUser hook.
         */
-       public static function submit( $data ) {
+       public static function submit( array $data, IContextSource $context ) {
                global $wgUser, $wgUserEmailUseReplyTo;
 
                $target = self::getTarget( $data['Target'] );
                if( !$target instanceof User ) {
-                       return wfMsgExt( $target . 'text', 'parse' );
+                       return $context->msg( $target . 'text' )->parseAsBlock();
                }
                $to = new MailAddress( $target );
-               $from = new MailAddress( $wgUser );
+               $from = new MailAddress( $context->getUser() );
                $subject = $data['Subject'];
                $text = $data['Text'];
 
                // Add a standard footer and trim up trailing newlines
                $text = rtrim( $text ) . "\n\n-- \n";
-               $text .= wfMsgExt(
-                       'emailuserfooter',
-                       array( 'content', 'parsemag' ),
-                       array( $from->name, $to->name )
-               );
+               $text .= $context->msg( 'emailuserfooter',
+                       $from->name, $to->name )->inContentLanguage()->text();
 
                $error = '';
                if( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
@@ -302,11 +312,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        // unless they are emailing themselves, in which case one
                        // copy of the message is sufficient.
                        if ( $data['CCMe'] && $to != $from ) {
-                               $cc_subject = wfMsg(
-                                       'emailccsubject',
-                                       $target->getName(),
-                                       $subject
-                               );
+                               $cc_subject = $context->msg( 'emailccsubject' )->rawParams(
+                                       $target->getName(), $subject )->text();
                                wfRunHooks( 'EmailUserCC', array( &$from, &$from, &$cc_subject, &$text ) );
                                $ccStatus = UserMailer::send( $from, $from, $cc_subject, $text );
                                $status->merge( $ccStatus );
index df7e7af..7677095 100644 (file)
@@ -75,7 +75,8 @@ class FewestrevisionsPage extends QueryPage {
 
                $nt = Title::makeTitleSafe( $result->namespace, $result->title );
                if( !$nt ) {
-                       return '<!-- bad title -->';
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
                }
 
                $text = htmlspecialchars( $wgContLang->convert( $nt->getPrefixedText() ) );
index f7e81ee..c217ecc 100644 (file)
@@ -1,7 +1,24 @@
 <?php
 /**
- * @ingroup SpecialPage
+ * Implements Special:JavaScriptTest
+ *
+ * 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
+ * @ingroup SpecialPage
  */
 
 /**
index ca8f3db..1f95c22 100644 (file)
@@ -183,7 +183,7 @@ class SpecialListGroupRights extends SpecialPage {
                        $r[] = $this->msg( 'listgrouprights-removegroup-all' )->escaped();
                } elseif( is_array( $remove ) && count( $remove ) ) {
                        $remove = array_values( array_unique( $remove ) );
-                       $r[] = $this->msg( 'listgrouprights-removegroup', array( 'parseinline' ),
+                       $r[] = $this->msg( 'listgrouprights-removegroup',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $remove ) ),
                                count( $remove )
                        )->parse();
@@ -192,7 +192,7 @@ class SpecialListGroupRights extends SpecialPage {
                        $r[] = $this->msg( 'listgrouprights-addgroup-self-all' )->escaped();
                } elseif( is_array( $addSelf ) && count( $addSelf ) ) {
                        $addSelf = array_values( array_unique( $addSelf ) );
-                       $r[] = $this->msg( 'listgrouprights-addgroup-self', array( 'parseinline' ),
+                       $r[] = $this->msg( 'listgrouprights-addgroup-self',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $addSelf ) ),
                                count( $addSelf )
                        )->parse();
@@ -201,7 +201,7 @@ class SpecialListGroupRights extends SpecialPage {
                        $r[] = $this->msg( 'listgrouprights-removegroup-self-all' )->parse();
                } elseif( is_array( $removeSelf ) && count( $removeSelf ) ) {
                        $removeSelf = array_values( array_unique( $removeSelf ) );
-                       $r[] = $this->msg( 'listgrouprights-removegroup-self', array( 'parseinline' ),
+                       $r[] = $this->msg( 'listgrouprights-removegroup-self',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $removeSelf ) ),
                                count( $removeSelf )
                        )->parse();
index 64190df..177b34d 100644 (file)
@@ -152,9 +152,7 @@ class SpecialLog extends SpecialPage {
                if ( $logBody ) {
                        $this->getOutput()->addHTML(
                                $pager->getNavigationBar() .
-                               $loglist->beginLogEventsList() .
-                               $logBody .
-                               $loglist->endLogEventsList() .
+                               $this->getRevisionButton( $loglist->beginLogEventsList() . $logBody . $loglist->endLogEventsList() ) .
                                $pager->getNavigationBar()
                        );
                } else {
@@ -162,6 +160,29 @@ class SpecialLog extends SpecialPage {
                }
        }
 
+       private function getRevisionButton( $formcontents ) {
+               # If the user doesn't have the ability to delete revisions, don't bother showing him/her the button.
+               if ( !$this->getUser()->isAllowed( 'deleterevision' ) ) {
+                       return $formcontents;
+               }
+
+               # Show button to hide log entries
+               global $wgScript;
+               $s = Html::openElement( 'form', array( 'action' => $wgScript, 'id' => 'mw-log-deleterevision-submit' ) ) . "\n";
+               $s .= Html::hidden( 'title', SpecialPage::getTitleFor( 'Revisiondelete' ) ) . "\n";
+               $s .= Html::hidden( 'target', SpecialPage::getTitleFor( 'Log' ) ) . "\n";
+               $s .= Html::hidden( 'type', 'logging' ) . "\n";
+               $button = Html::element( 'button',
+                       array( 'type' => 'submit', 'class' => "deleterevision-log-submit mw-log-deleterevision-button" ),
+                       $this->msg( 'showhideselectedversions' )->text()
+               ) . "\n";
+               $s .= $button . $formcontents . $button;
+               $s .= Html::closeElement( 'form' );
+
+               return $s;
+       }
+
+
        /**
         * Set page title and show header for this log type
         * @param $type string
index f43b8f7..0aa8b30 100644 (file)
@@ -90,7 +90,8 @@ class SpecialMergeHistory extends SpecialPage {
                $this->outputHeader();
 
                if( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
-                       return $this->merge();
+                       $this->merge();
+                       return;
                }
 
                if ( !$this->mSubmitted ) {
index 1bcbac7..44097c8 100644 (file)
@@ -432,7 +432,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        protected function feedItem( $row ) {
-               $title = Title::MakeTitle( intval( $row->rc_namespace ), $row->rc_title );
+               $title = Title::makeTitle( intval( $row->rc_namespace ), $row->rc_title );
                if( $title ) {
                        $date = $row->rc_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
index c05aaad..a7a87f0 100644 (file)
@@ -190,8 +190,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        public function getFeedObject( $feedFormat ){
                $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
                $formatter = $changesFeed->getFeedObject(
-                       wfMsgForContent( 'recentchanges' ),
-                       wfMsgForContent( 'recentchanges-feed-description' ),
+                       $this->msg( 'recentchanges' )->inContentLanguage()->text(),
+                       $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
                        $this->getTitle()->getFullURL()
                );
                return array( $changesFeed, $formatter );
@@ -565,7 +565,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $extraOpts = $this->getExtraOptions( $opts );
                $extraOptsCount = count( $extraOpts );
                $count = 0;
-               $submit = ' ' . Xml::submitbutton( wfMsg( 'allpagessubmit' ) );
+               $submit = ' ' . Xml::submitbutton( $this->msg( 'allpagessubmit' )->text() );
 
                $out = Xml::openElement( 'table', array( 'class' => 'mw-recentchanges-table' ) );
                foreach( $extraOpts as $name => $optionRow ) {
@@ -596,7 +596,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $panelString = implode( "\n", $panel );
 
                $this->getOutput()->addHTML(
-                       Xml::fieldset( wfMsg( 'recentchanges-legend' ), $panelString, array( 'class' => 'rcoptions' ) )
+                       Xml::fieldset( $this->msg( 'recentchanges-legend' )->text(), $panelString, array( 'class' => 'rcoptions' ) )
                );
 
                $this->setBottomText( $opts );
@@ -636,7 +636,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $this->getOutput()->addWikiText(
                        Html::rawElement( 'p',
                                array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
-                               "\n" . wfMsgForContentNoTrans( 'recentchangestext' ) . "\n"
+                               "\n" . $this->msg( 'recentchangestext' )->inContentLanguage()->plain() . "\n"
                        ), 
                        /* $lineStart */ false,
                        /* $interface */ false
@@ -663,16 +663,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        array( 'selected' => $opts['namespace'], 'all' => '' ),
                        array( 'name' => 'namespace', 'id' => 'namespace' )
                );
-               $nsLabel = Xml::label( wfMsg( 'namespace' ), 'namespace' );
+               $nsLabel = Xml::label( $this->msg( 'namespace' )->text(), 'namespace' );
                $invert = Xml::checkLabel(
-                       wfMsg( 'invert' ), 'invert', 'nsinvert',
+                       $this->msg( 'invert' )->text(), 'invert', 'nsinvert',
                        $opts['invert'],
-                       array( 'title' => wfMsg( 'tooltip-invert' ) )
+                       array( 'title' => $this->msg( 'tooltip-invert' )->text() )
                );
                $associated = Xml::checkLabel(
-                       wfMsg( 'namespace_association' ), 'associated', 'nsassociated',
+                       $this->msg( 'namespace_association' )->text(), 'associated', 'nsassociated',
                        $opts['associated'],
-                       array( 'title' => wfMsg( 'tooltip-namespace_association' ) )
+                       array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
                );
                return array( $nsLabel, "$nsSelect $invert $associated" );
        }
@@ -684,10 +684,10 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * @return Array
         */
        protected function categoryFilterForm( FormOptions $opts ) {
-               list( $label, $input ) = Xml::inputLabelSep( wfMsg( 'rc_categories' ),
+               list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
                        'categories', 'mw-categories', false, $opts['categories'] );
 
-               $input .= ' ' . Xml::checkLabel( wfMsg( 'rc_categories_any' ),
+               $input .= ' ' . Xml::checkLabel( $this->msg( 'rc_categories_any' )->text(),
                        'categories_any', 'mw-categories_any', $opts['categories_any'] );
 
                return array( $label, $input );
@@ -788,16 +788,18 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $options = $nondefaults + $defaults;
 
                $note = '';
-               if( !wfEmptyMsg( 'rclegend' ) ) {
-                       $note .= '<div class="mw-rclegend">' .
-                               wfMsgExt( 'rclegend', array( 'parseinline' ) ) . "</div>\n";
+               $msg = $this->msg( 'rclegend' );
+               if( !$msg->isDisabled() ) {
+                       $note .= '<div class="mw-rclegend">' . $msg->parse() . "</div>\n";
                }
+
+               $lang = $this->getLanguage();
+               $user = $this->getUser();
                if( $options['from'] ) {
-                       $note .= wfMsgExt( 'rcnotefrom', array( 'parseinline' ),
-                               $this->getLanguage()->formatNum( $options['limit'] ),
-                               $this->getLanguage()->timeanddate( $options['from'], true ),
-                               $this->getLanguage()->date( $options['from'], true ),
-                               $this->getLanguage()->time( $options['from'], true ) ) . '<br />';
+                       $note .= $this->msg( 'rcnotefrom' )->numParams( $options['limit'] )->params(
+                               $lang->userTimeAndDate( $options['from'], $user ),
+                               $lang->userDate( $options['from'], $user ),
+                               $lang->userTime( $options['from'], $user ) )->parse() . '<br />';
                }
 
                # Sort data for display and make sure it's unique after we've added user data.
@@ -810,21 +812,21 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                // limit links
                foreach( $wgRCLinkLimits as $value ) {
-                       $cl[] = $this->makeOptionsLink( $this->getLanguage()->formatNum( $value ),
+                       $cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
                }
-               $cl = $this->getLanguage()->pipeList( $cl );
+               $cl = $lang->pipeList( $cl );
 
                // day links, reset 'from' to none
                foreach( $wgRCLinkDays as $value ) {
-                       $dl[] = $this->makeOptionsLink( $this->getLanguage()->formatNum( $value ),
+                       $dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
                }
-               $dl = $this->getLanguage()->pipeList( $dl );
+               $dl = $lang->pipeList( $dl );
 
 
                // show/hide links
-               $showhide = array( wfMsg( 'show' ), wfMsg( 'hide' ) );
+               $showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
                $filters = array(
                        'hideminor'     => 'rcshowhideminor',
                        'hidebots'      => 'rcshowhidebots',
@@ -837,7 +839,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $filters[$key] = $params['msg'];
                }
                // Disable some if needed
-               if ( !$this->getUser()->useRCPatrol() ) {
+               if ( !$user->useRCPatrol() ) {
                        unset( $filters['hidepatrolled'] );
                }
 
@@ -845,19 +847,18 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                foreach ( $filters as $key => $msg ) {
                        $link = $this->makeOptionsLink( $showhide[1 - $options[$key]],
                                array( $key => 1-$options[$key] ), $nondefaults );
-                       $links[] = wfMsgHtml( $msg, $link );
+                       $links[] = $this->msg( $msg )->rawParams( $link )->escaped();
                }
 
                // show from this onward link
                $timestamp = wfTimestampNow();
-               $now = $this->getLanguage()->timeanddate( $timestamp, true );
+               $now = $lang->userTimeAndDate( $timestamp, $user );
                $tl = $this->makeOptionsLink(
                        $now, array( 'from' => $timestamp ), $nondefaults
                );
 
-               $rclinks = wfMsgExt( 'rclinks', array( 'parseinline', 'replaceafter' ),
-                       $cl, $dl, $this->getLanguage()->pipeList( $links ) );
-               $rclistfrom = wfMsgExt( 'rclistfrom', array( 'parseinline', 'replaceafter' ), $tl );
+               $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )->parse();
+               $rclistfrom = $this->msg( 'rclistfrom' )->rawParams( $tl )->parse();
                return "{$note}$rclinks<br />$rclistfrom";
        }
 
index 238e181..9010e10 100644 (file)
@@ -54,8 +54,9 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
        public function getFeedObject( $feedFormat ){
                $feed = new ChangesFeed( $feedFormat, false );
                $feedObj = $feed->getFeedObject(
-                       wfMsgForContent( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() ),
-                       wfMsgForContent( 'recentchangeslinked-feed' ),
+                       $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
+                               ->inContentLanguage()->text(),
+                       $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
                        $this->getTitle()->getFullUrl()
                );
                return array( $feed, $feedObj );
@@ -224,10 +225,10 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                $opts->consumeValues( array( 'showlinkedto', 'target', 'tagfilter' ) );
                $extraOpts = array();
                $extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
-               $extraOpts['target'] = array( wfMsgHtml( 'recentchangeslinked-page' ),
+               $extraOpts['target'] = array( $this->msg( 'recentchangeslinked-page' )->escaped(),
                        Xml::input( 'target', 40, str_replace('_',' ',$opts['target']) ) .
                        Xml::check( 'showlinkedto', $opts['showlinkedto'], array('id' => 'showlinkedto') ) . ' ' .
-                       Xml::label( wfMsg("recentchangeslinked-to"), 'showlinkedto' ) );
+                       Xml::label( $this->msg( 'recentchangeslinked-to' )->text(), 'showlinkedto' ) );
                $tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
                if ($tagFilter) {
                        $extraOpts['tagfilter'] = $tagFilter;
index 0388f5b..d089c73 100644 (file)
@@ -221,7 +221,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $links = array();
                        $links[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Log' ),
-                               wfMsgHtml( 'viewpagelogs' ),
+                               $this->msg( 'viewpagelogs' )->escaped(),
                                array(),
                                array( 'page' => $this->targetObj->getPrefixedText() )
                        );
@@ -229,7 +229,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                # Give a link to the page history
                                $links[] = Linker::linkKnown(
                                        $this->targetObj,
-                                       wfMsgHtml( 'pagehist' ),
+                                       $this->msg( 'pagehist' )->escaped(),
                                        array(),
                                        array( 'action' => 'history' )
                                );
@@ -238,7 +238,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
                                        $links[] = Linker::linkKnown(
                                                $undelete,
-                                               wfMsgHtml( 'deletedhist' ),
+                                               $this->msg( 'deletedhist' )->escaped(),
                                                array(),
                                                array( 'target' => $this->targetObj->getPrefixedDBkey() )
                                        );
@@ -276,7 +276,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->getOutput()->addWikiMsg( 'revdelete-no-file' );
                        return;
                }
-               if( !$oimage->userCan( File::DELETED_FILE, $this->getUser() ) ) {
+               $user = $this->getUser();
+               if( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
                        if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
                                $this->getOutput()->permissionRequired( 'suppressrevision' );
                        } else {
@@ -284,21 +285,22 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        }
                        return;
                }
-               if ( !$this->getUser()->matchEditToken( $this->token, $archiveName ) ) {
+               if ( !$user->matchEditToken( $this->token, $archiveName ) ) {
+                       $lang = $this->getLanguage();
                        $this->getOutput()->addWikiMsg( 'revdelete-show-file-confirm',
                                $this->targetObj->getText(),
-                               $this->getLanguage()->date( $oimage->getTimestamp() ),
-                               $this->getLanguage()->time( $oimage->getTimestamp() ) );
+                               $lang->userDate( $oimage->getTimestamp(), $user ),
+                               $lang->userTime( $oimage->getTimestamp(), $user ) );
                        $this->getOutput()->addHTML(
                                Xml::openElement( 'form', array(
                                        'method' => 'POST',
                                        'action' => $this->getTitle()->getLocalUrl(
-                                               'target=' . urlencode( $oimage->getName() ) .
+                                               'target=' . urlencode( $this->targetObj->getPrefixedDBkey() ) .
                                                '&file=' . urlencode( $archiveName ) .
-                                               '&token=' . urlencode( $this->getUser()->getEditToken( $archiveName ) ) )
+                                               '&token=' . urlencode( $user->getEditToken( $archiveName ) ) )
                                        )
                                ) .
-                               Xml::submitButton( wfMsg( 'revdelete-show-file-submit' ) ) .
+                               Xml::submitButton( $this->msg( 'revdelete-show-file-submit' )->text() ) .
                                '</form>'
                        );
                        return;
@@ -377,22 +379,23 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $out = Xml::openElement( 'form', array( 'method' => 'post',
                                        'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) ),
                                        'id' => 'mw-revdel-form-revisions' ) ) .
-                               Xml::fieldset( wfMsg( 'revdelete-legend' ) ) .
+                               Xml::fieldset( $this->msg( 'revdelete-legend' )->text() ) .
                                $this->buildCheckBoxes() .
                                Xml::openElement( 'table' ) .
                                "<tr>\n" .
                                        '<td class="mw-label">' .
-                                               Xml::label( wfMsg( 'revdelete-log' ), 'wpRevDeleteReasonList' ) .
+                                               Xml::label( $this->msg( 'revdelete-log' )->text(), 'wpRevDeleteReasonList' ) .
                                        '</td>' .
                                        '<td class="mw-input">' .
                                                Xml::listDropDown( 'wpRevDeleteReasonList',
-                                                       wfMsgForContent( 'revdelete-reason-dropdown' ),
-                                                       wfMsgForContent( 'revdelete-reasonotherlist' ), '', 'wpReasonDropDown', 1
+                                                       $this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->text(),
+                                                       $this->msg( 'revdelete-reasonotherlist' )->inContentLanguage()->text(),
+                                                       '', 'wpReasonDropDown', 1
                                                ) .
                                        '</td>' .
                                "</tr><tr>\n" .
                                        '<td class="mw-label">' .
-                                               Xml::label( wfMsg( 'revdelete-otherreason' ), 'wpReason' ) .
+                                               Xml::label( $this->msg( 'revdelete-otherreason' )->text(), 'wpReason' ) .
                                        '</td>' .
                                        '<td class="mw-input">' .
                                                Xml::input( 'wpReason', 60, $this->otherReason, array( 'id' => 'wpReason', 'maxlength' => 100 ) ) .
@@ -400,7 +403,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                "</tr><tr>\n" .
                                        '<td></td>' .
                                        '<td class="mw-submit">' .
-                                               Xml::submitButton( wfMsgExt('revdelete-submit','parsemag',$numRevisions),
+                                               Xml::submitButton( $this->msg( 'revdelete-submit', $numRevisions )->text(),
                                                        array( 'name' => 'wpSubmit' ) ) .
                                        '</td>' .
                                "</tr>\n" .
@@ -420,7 +423,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $title = Title::makeTitle( NS_MEDIAWIKI, 'revdelete-reason-dropdown' );
                                $link = Linker::link(
                                        $title,
-                                       wfMsgHtml( 'revdelete-edit-reasonlist' ),
+                                       $this->msg( 'revdelete-edit-reasonlist' )->escaped(),
                                        array(),
                                        array( 'action' => 'edit' )
                                );
@@ -459,7 +462,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        }
                        foreach( $this->checks as $item ) {
                                list( $message, $name, $field ) = $item;
-                               $innerHTML = Xml::checkLabel( wfMsg($message), $name, $name, $bitfield & $field );
+                               $innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
                                if( $field == Revision::DELETED_RESTRICTED )
                                        $innerHTML = "<b>$innerHTML</b>";
                                $line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
@@ -468,9 +471,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // Otherwise, use tri-state radios
                } else {
                        $html .= '<tr>';
-                       $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-same').'</th>';
-                       $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-unset').'</th>';
-                       $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-set').'</th>';
+                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
                        $html .= "<th></th></tr>\n";
                        foreach( $this->checks as $item ) {
                                list( $message, $name, $field ) = $item;
@@ -483,7 +486,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $line = '<td class="mw-revdel-checkbox">' . Xml::radio( $name, -1, $selected == -1 ) . '</td>';
                                $line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 0, $selected == 0 ) . '</td>';
                                $line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 1, $selected == 1 ) . '</td>';
-                               $label = wfMsgHtml($message);
+                               $label = $this->msg( $message )->escaped();
                                if( $field == Revision::DELETED_RESTRICTED ) {
                                        $label = "<b>$label</b>";
                                }
@@ -512,7 +515,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $comment = $listReason;
                if( $comment != 'other' && $this->otherReason != '' ) {
                        // Entry from drop down menu + additional comment
-                       $comment .= wfMsgForContent( 'colon-separator' ) . $this->otherReason;
+                       $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
                } elseif( $comment == 'other' ) {
                        $comment = $this->otherReason;
                }
index 3fa8687..a6d75bb 100644 (file)
@@ -174,7 +174,8 @@ class SpecialSearch extends SpecialPage {
                $t = Title::newFromText( $term );
                # If the string cannot be used to create a title
                if( is_null( $t ) ) {
-                       return $this->showResults( $term );
+                       $this->showResults( $term );
+                       return;
                }
                # If there's an exact or very near match, jump right there.
                $t = SearchEngine::getNearMatch( $term );
@@ -201,7 +202,7 @@ class SpecialSearch extends SpecialPage {
                                return;
                        }
                }
-               return $this->showResults( $term );
+               $this->showResults( $term );
        }
 
        /**
index 4ad31a0..fb2005b 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Implements Special:Unblock
+ *
  * 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
@@ -58,14 +60,14 @@ class SpecialUnblock extends SpecialPage {
                        switch( $this->type ){
                                case Block::TYPE_USER:
                                case Block::TYPE_IP:
-                                       $out->addWikiMsg( 'unblocked',  $this->target );
+                                       $out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
                                        break;
                                case Block::TYPE_RANGE:
-                                       $out->addWikiMsg( 'unblocked-range', $this->target );
+                                       $out->addWikiMsg( 'unblocked-range', wfEscapeWikiText( $this->target ) );
                                        break;
                                case Block::TYPE_ID:
                                case Block::TYPE_AUTO:
-                                       $out->addWikiMsg( 'unblocked-id', $this->target );
+                                       $out->addWikiMsg( 'unblocked-id', wfEscapeWikiText( $this->target ) );
                                        break;
                        }
                }
index 06b578d..d1bb3f0 100644 (file)
@@ -1015,7 +1015,7 @@ class SpecialUndelete extends SpecialPage {
                }
                $out->wrapWikiMsg(
                        "<div class='mw-undelete-pagetitle'>\n$1\n</div>\n",
-                       array( 'undeletepagetitle', $this->mTargetObj->getPrefixedText() )
+                       array( 'undeletepagetitle', wfEscapeWikiText( $this->mTargetObj->getPrefixedText() ) )
                );
 
                $archive = new PageArchive( $this->mTargetObj );
index d0e7ed9..2b4dc95 100644 (file)
@@ -58,6 +58,7 @@ class SpecialVersion extends SpecialPage {
                $text =
                        $this->getMediaWikiCredits() .
                        $this->softwareInformation() .
+                       $this->getEntryPointInfo() .
                        $this->getExtensionCredits();
                if ( $wgSpecialVersionShowHooks ) {
                        $text .= $this->getWgHooks();
@@ -739,6 +740,41 @@ class SpecialVersion extends SpecialPage {
                return $repo->getHeadSHA1();
        }
 
+       /**
+        * Get the list of entry points and their URLs
+        * @return string Wikitext
+        */
+       public function getEntryPointInfo() {
+               global $wgArticlePath, $wgScriptPath;
+               $entryPoints = array(
+                       'version-entrypoints-articlepath' => $wgArticlePath,
+                       'version-entrypoints-scriptpath' => $wgScriptPath,
+                       'version-entrypoints-index-php' => wfScript( 'index' ),
+                       'version-entrypoints-api-php' => wfScript( 'api' ),
+                       'version-entrypoints-load-php' => wfScript( 'load' ),
+               );
+
+               $out = Html::element( 'h2', array( 'id' => 'mw-version-entrypoints' ), wfMsg( 'version-entrypoints' ) ) .
+                       Html::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'mw-version-entrypoints-table' ) ) .
+                       Html::openElement( 'tr' ) .
+                       Html::element( 'th', array(), wfMessage( 'version-entrypoints-header-entrypoint' )->text() ) .
+                       Html::element( 'th', array(), wfMessage( 'version-entrypoints-header-url' )->text() ) .
+                       Html::closeElement( 'tr' );
+
+               foreach ( $entryPoints as $message => $value ) {
+                       $url = wfExpandUrl( $value, PROTO_RELATIVE );
+                       $out .= Html::openElement( 'tr' ) .
+                               // ->text() looks like it should be ->parse(), but this function
+                               // returns wikitext, not HTML, boo
+                               Html::rawElement( 'td', array(), wfMessage( $message )->text() ) .
+                               Html::rawElement( 'td', array(), Html::rawElement( 'code', array(), "[$url $value]" ) ) .
+                               Html::closeElement( 'tr' );
+               }
+
+               $out .= Html::closeElement( 'table' );
+               return $out;
+       }
+
        function showEasterEgg() {
                $rx = $rp = $xe = '';
                $alpha = array("", "kbQW", "\$\n()");
index 0c5f11c..eafdde4 100644 (file)
@@ -116,6 +116,7 @@ class SpecialWatchlist extends SpecialPage {
                /* bool  */ 'hideOwn'   => (int)$user->getBoolOption( 'watchlisthideown' ),
                /* ?     */ 'namespace' => 'all',
                /* ?     */ 'invert'    => false,
+               /* bool  */ 'associated' => false,
                );
                $this->customFilters = array();
                wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
@@ -148,13 +149,20 @@ class SpecialWatchlist extends SpecialPage {
 
                # Get namespace value, if supplied, and prepare a WHERE fragment
                $nameSpace = $request->getIntOrNull( 'namespace' );
-               $invert = $request->getIntOrNull( 'invert' );
+               $invert = $request->getBool( 'invert' );
+               $associated = $request->getBool( 'associated' );
                if ( !is_null( $nameSpace ) ) {
+                       $eq_op = $invert ? '!=' : '=';\r
+                       $bool_op = $invert ? 'AND' : 'OR';
                        $nameSpace = intval( $nameSpace ); // paranioa
-                       if ( $invert ) {
-                               $nameSpaceClause = "rc_namespace != $nameSpace";
+                       if ( !$associated ) {
+                               $nameSpaceClause = "rc_namespace $eq_op $nameSpace";
                        } else {
-                               $nameSpaceClause = "rc_namespace = $nameSpace";
+                               $associatedNS = MWNamespace::getAssociated( $nameSpace );\r
+                               $nameSpaceClause =
+                                       "rc_namespace $eq_op $nameSpace " .\r
+                                       $bool_op .\r
+                                       " rc_namespace $eq_op $associatedNS";
                        }
                } else {
                        $nameSpace = '';
@@ -162,6 +170,7 @@ class SpecialWatchlist extends SpecialPage {
                }
                $values['namespace'] = $nameSpace;
                $values['invert'] = $invert;
+               $values['associated'] = $associated;
 
                if( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
                        $big = 1000; /* The magical big */
@@ -262,7 +271,14 @@ class SpecialWatchlist extends SpecialPage {
                $tables = array( 'recentchanges', 'watchlist' );
                $fields = array( $dbr->tableName( 'recentchanges' ) . '.*' );
                $join_conds = array(
-                       'watchlist' => array('INNER JOIN',"wl_user='{$user->getId()}' AND wl_namespace=rc_namespace AND wl_title=rc_title"),
+                       'watchlist' => array(
+                               'INNER JOIN',
+                               array(
+                                       'wl_user' => $user->getId(),
+                                       'wl_namespace=rc_namespace',
+                                       'wl_title=rc_title'
+                               ),
+                       ),
                );
                $options = array( 'ORDER BY' => 'rc_timestamp DESC' );
                if( $wgShowUpdatedMarker ) {
@@ -338,7 +354,20 @@ class SpecialWatchlist extends SpecialPage {
                                'class' => 'namespaceselector',
                        )
                ) . '&#160;';
-               $form .= Xml::checkLabel( $this->msg( 'invert' )->text(), 'invert', 'nsinvert', $invert ) . '&#160;';
+               $form .= Xml::checkLabel(
+                       $this->msg( 'invert' )->text(),
+                       'invert',
+                       'nsinvert',
+                       $invert,
+                       array( 'title' => $this->msg( 'tooltip-invert' )->text() )
+               ) . '&#160;';
+               $form .= Xml::checkLabel(
+                       $this->msg( 'namespace_association' )->text(),
+                       'associated',
+                       'associated',
+                       $associated,
+                       array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
+               ) . '&#160;';
                $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . '</p>';
                $form .= Html::hidden( 'days', $values['days'] );
                foreach ( $filters as $key => $msg ) {
index 59284af..bf5c487 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Template used when there is no LocalSettings.php file
+ * Template used when there is no LocalSettings.php file.
+ *
+ * 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
  * @ingroup Templates
index c93b02c..b22c144 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Html form for account creation
+ * Html form for account creation.
+ *
+ * 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
  * @ingroup Templates
index efe826f..5a2c633 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Html form for user login
+ * Html form for user login.
+ *
+ * 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
  * @ingroup Templates
index 09412f0..479083e 100644 (file)
@@ -16,3 +16,4 @@ quiet: yes
 quote-nbsp: yes
 fix-backslash: no
 fix-uri: no
+new-inline-tags: video,audio,source,track
index f6078dc..83ffed9 100644 (file)
@@ -972,24 +972,100 @@ abstract class UploadBase {
         * @return bool
         */
        public function checkSvgScriptCallback( $element, $attribs ) {
-               $stripped = $this->stripXmlNamespace( $element );
+               $strippedElement = $this->stripXmlNamespace( $element );
 
-               if( $stripped == 'script' ) {
+               /*
+                * check for elements that can contain javascript
+                */
+               if( $strippedElement == 'script' ) {
                        wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
                        return true;
                }
 
+               # e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
+               if( $strippedElement == 'handler' ) {
+                       wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+                       return true;
+               }
+
+               # SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
+               if( $strippedElement == 'stylesheet' ) {
+                       wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+                       return true;
+               }
+
                foreach( $attribs as $attrib => $value ) {
                        $stripped = $this->stripXmlNamespace( $attrib );
+                       $value = strtolower($value);
+
                        if( substr( $stripped, 0, 2 ) == 'on' ) {
-                               wfDebug( __METHOD__ . ": Found script attribute '$attrib'='value' in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
                                return true;
                        }
+
+                       # href with javascript target
                        if( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
-                               wfDebug( __METHOD__ . ": Found script href attribute '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # href with embeded svg as target
+                       if( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # href with embeded (text/xml) svg as target
+                       if( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # use set/animate to add event-handler attribute to parent
+                       if( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
+                               wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
                                return true;
                        }
+
+                       # use set to add href attribute to parent element
+                       if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+                               wfDebug( __METHOD__ . ": Found svg setting href attibute '$value' in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # use set to add a remote / data / script target to an element
+                       if( $strippedElement == 'set' && $stripped == 'to' &&  preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found svg setting attibute to '$value' in uploaded file.\n" );
+                               return true;
+                       }
+
+
+                       # use handler attribute with remote / data / script 
+                       if( $stripped == 'handler' &&  preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # use CSS styles to bring in remote code
+                       # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
+                       if( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+                               foreach ($matches[1] as $match) {
+                                       if (!preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
+                                               wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
+                                               return true;
+                                       }
+                               }
+                       }
+
+                       # image filters can pull in url, which could be svg that executes scripts
+                       if( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+                               return true;
+                       }
+
                }
+
+               return false; //No scripts detected
        }
 
        private function stripXmlNamespace( $name ) {
index 8805c50..317dd55 100644 (file)
@@ -99,7 +99,7 @@ class UploadFromStash extends UploadBase {
                // chooses one of wpDestFile, wpUploadFile, filename in that order.
                $desiredDestName = $request->getText( 'wpDestFile', $request->getText( 'wpUploadFile', $request->getText( 'filename' ) ) );
 
-               return $this->initialize( $fileKey, $desiredDestName );
+               $this->initialize( $fileKey, $desiredDestName );
        }
 
        /**
index 0ae8a22..49bfb91 100644 (file)
@@ -93,7 +93,7 @@ class UploadFromUrl extends UploadBase {
                if ( !$desiredDestName ) {
                        $desiredDestName = $request->getText( 'wpUploadFileURL' );
                }
-               return $this->initialize(
+               $this->initialize(
                        $desiredDestName,
                        trim( $request->getVal( 'wpUploadFileURL' ) ),
                        false
index e14823a..2010878 100644 (file)
--- a/index.php
+++ b/index.php
@@ -40,7 +40,7 @@
 # has structures (try/catch, foo()->bar(), etc etc) which throw parse errors in
 # PHP 4. Setup.php and ObjectCache.php have structures invalid in PHP 5.0 and
 # 5.1, respectively.
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'index.php' );
 }
index 463ea19..e6feb45 100644 (file)
@@ -139,6 +139,22 @@ class Language {
                'hijri-calendar-m10', 'hijri-calendar-m11', 'hijri-calendar-m12'
        );
 
+       /**
+        * @since 1.20
+        * @var array
+        */
+       static public $durationIntervals = array(
+               'millennia' => 31557600000,
+               'centuries' => 3155760000,
+               'decades' => 315576000,
+               'years' => 31557600, // 86400 * 365.25
+               'weeks' => 604800,
+               'days' => 86400,
+               'hours' => 3600,
+               'minutes' => 60,
+               'seconds' => 1,
+       );
+
        /**
         * Get a cached language object for a given language code
         * @param $code String
@@ -1908,6 +1924,63 @@ class Language {
                return $this->sprintfDate( $df, $ts );
        }
 
+       /**
+        * Takes a number of seconds and turns it into a text using values such as hours and minutes.
+        *
+        * @since 1.20
+        *
+        * @param integer $seconds The amount of seconds.
+        * @param array $chosenIntervals The intervals to enable.
+        *
+        * @return string
+        */
+       public function formatDuration( $seconds, array $chosenIntervals = array() ) {
+               $intervals = $this->getDurationIntervals( $seconds, $chosenIntervals );
+
+               $segments = array();
+
+               foreach ( $intervals as $intervalName => $intervalValue ) {
+                       $message = new Message( 'duration-' . $intervalName, array( $intervalValue ) );
+                       $segments[] = $message->inLanguage( $this )->escaped();
+               }
+
+               return $this->listToText( $segments );
+       }
+
+       /**
+        * Takes a number of seconds and returns an array with a set of corresponding intervals.
+        * For example 65 will be turned into array( minutes => 1, seconds => 5 ).
+        *
+        * @since 1.20
+        *
+        * @param integer $seconds The amount of seconds.
+        * @param array $chosenIntervals The intervals to enable.
+        *
+        * @return array
+        */
+       public function getDurationIntervals( $seconds, array $chosenIntervals = array() ) {
+               if ( empty( $chosenIntervals ) ) {
+                       $chosenIntervals = array( 'millennia', 'centuries', 'decades', 'years', 'days', 'hours', 'minutes', 'seconds' );
+               }
+
+               $intervals = array_intersect_key( self::$durationIntervals, array_flip( $chosenIntervals ) );
+               $sortedNames = array_keys( $intervals );
+               $smallestInterval = array_pop( $sortedNames );
+
+               $segments = array();
+
+               foreach ( $intervals as $name => $length ) {
+                       $value = floor( $seconds / $length );
+
+                       if ( $value > 0 || ( $name == $smallestInterval && empty( $segments ) ) ) {
+                               $seconds -= $value * $length;
+                               $segments[$name] = $value;
+                       }
+               }
+
+               return $segments;
+       }
+
        /**
         * Internal helper function for userDate(), userTime() and userTimeAndDate()
         *
index 1f69cbf..a3140b2 100644 (file)
        'rw' => 'Kinyarwanda',  # Kinyarwanda, should possibly be Kinyarwandi
        'sa' => 'संस्कृतम्',  # Sanskrit
        'sah' => 'Саха тыла', # Sakha
+       'sat' => 'Santali',     # Santali
        'sc' => 'Sardu',                # Sardinian
        'scn' => 'Sicilianu',   # Sicilian
        'sco' => 'Scots',       # Scots
index 9ba1447..6671a0c 100644 (file)
@@ -376,7 +376,7 @@ $1',
 أو [{{fullurl:{{FULLPAGENAME}}|action=edit}} تعديل هذه الصفحة]</span>.',
 'noarticletext-nopermission' => 'لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.',
 'previewnote' => "'''تذكر أن هذه مجرد معاينة للصفحة؛''''
-لم تحفظ تغييراتك إلى الآن[[#editform|→ Continue editing]]",
+لم تحفظ تغييراتك إلى الآن",
 'editing' => 'تحرير $1',
 'editingsection' => 'تحرير $1 (قسم)',
 'templatesused' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:',
index a7fb244..652b707 100644 (file)
@@ -876,7 +876,8 @@ Die laaste inskrywing in die blokkeerlogboek word hieronder vertoon:',
 Onthou dat u eie .css- en .js-bladsye met 'n kleinletter begin, byvoorbeeld {{ns:user}}:Naam/vector.css in plaas van {{ns:user}}:Naam/Vector.css.",
 'updated' => '(Gewysig)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Onthou dat hierdie slegs 'n voorskou is en nog nie gestoor is nie!'''",
+'previewnote' => "'''Onthou dat hierdie slegs 'n voorskou is.'''
+U teks is nog nie gestoor nie!",
 'previewconflict' => 'Hierdie voorskou vertoon die teks in die boonste teksarea soos dit sou lyk indien u die bladsy stoor.',
 'session_fail_preview' => "'''Jammer! Weens verlies aan sessie-inligting is die wysiging nie verwerk nie.
 Probeer asseblief weer. As dit steeds nie werk nie, probeer om [[Special:UserLogout|af te teken]] en dan weer aan te teken.'''",
@@ -890,6 +891,7 @@ Die bewerking is geweier om verminking van die bladsy se teks te voorkom.
 Dit gebeur soms as 'n webgebaseerde instaandiens (proxy) gebruik word wat foute bevat.",
 'edit_form_incomplete' => "'''Dele van die vorm het nie die bediener bereik nie. Kyk of alles reg lyk en probeer weer.'''",
 'editing' => 'Besig om $1 te wysig',
+'creating' => 'Besig om $1 te skep',
 'editingsection' => 'Besig om $1 (onderafdeling) te wysig',
 'editingcomment' => 'Besig om $1 te wysig (nuwe opskrif)',
 'editconflict' => 'Wysigingskonflik: $1',
@@ -953,6 +955,7 @@ Dit lyk of dit verwyder is.',
 'edit-no-change' => 'U wysiging was geignoreer omdat die teks nie verander is nie.',
 'edit-already-exists' => 'Die bladsy is nie geskep nie.
 Dit bestaan alreeds.',
+'defaultmessagetext' => 'Verstekteks',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Waarskuwing: Die bladsy gebruik te veel duur ontlederfunksies.
@@ -1537,6 +1540,7 @@ Die inligting is vir ander gebruikers sigbaar.',
 'newsectionsummary' => '/* $1 */ nuwe afdeling',
 'rc-enhanced-expand' => 'Wys details (benodig JavaScript)',
 'rc-enhanced-hide' => 'Steek details weg',
+'rc-old-title' => 'oorspronklik geskep as "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Verwante veranderings',
@@ -2033,6 +2037,12 @@ U kan die resultate vernou deur 'n boekstaaftipe, gebruikersnaam (kas-sensitief)
 'allpagesbadtitle' => "Die gespesifiseerde bladsynaam is ongeldig of het 'n intertaal- of interwiki-voorvoegsel.
 Dit is moontlik dat die naam karakters bevat wat nie in titels gebruik mag word nie.",
 'allpages-bad-ns' => '{{SITENAME}} het geen naamspasie "$1" nie.',
+'allpages-hide-redirects' => 'Versteek aansture',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "U kyk na 'n gekasde weergawe ban die bladsy, wat tot $1 oud kan wees.",
+'cachedspecial-viewing-cached-ts' => "U kyk na 'n gekasde weergawe ban die bladsy, wat moontlik nie volledig bygewerk is nie.",
+'cachedspecial-refresh-now' => 'Wys nuutste.',
 
 # Special:Categories
 'categories' => 'Kategorieë',
@@ -3738,10 +3748,12 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 # API errors
 'api-error-badaccess-groups' => 'U word nie toegelaat om lêers te laai op hierdie wiki.',
 'api-error-badtoken' => 'Interne fout: slegte teken.',
+'api-error-copyuploaddisabled' => 'Oplaai via URL is gedeaktiveer op hierdie bediener.',
 'api-error-duplicate-archive-popup-title' => 'Duplikaat {{PLURAL:$1|lêer|lêers}} wat al verwyder is.',
 'api-error-duplicate-popup-title' => 'Duplikaat {{PLURAL:$1|lêer|lêers}}',
 'api-error-empty-file' => 'Die lêer wat u probeer oplaai is leeg.',
 'api-error-emptypage' => 'Die skep van leë nuwe bladsye word nie toegelaat nie.',
+'api-error-fetchfileerror' => 'Interne fout: Iets het verkeerd gegaan met die haal van die lêer.',
 'api-error-file-too-large' => 'Die lêer wat u probeer oplaai is te groot.',
 'api-error-filename-tooshort' => 'Die lêernaam is te kort.',
 'api-error-filetype-banned' => 'Hierdie tipe lêer is verban en word nie toegelaat nie.',
@@ -3750,10 +3762,13 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'api-error-http' => "Interne fout: Kan nie 'n verbinding met die bediener maak nie.",
 'api-error-illegal-filename' => 'Die lêernaam word nie toegelaat nie.',
 'api-error-internal-error' => 'Interne fout: daar is iets verkeerd gegaan het met die verwerking van die oplaai van die lêer op die wiki.',
+'api-error-invalid-file-key' => 'Interne fout: die lêer is nie in tydelike berging gevind nie.',
 'api-error-missingparam' => 'Interne fout: ontbrekende parameters op aanvraag.',
 'api-error-missingresult' => 'Interne fout: Kon nie bepaal of die kopie daarin geslaag.',
 'api-error-mustbeloggedin' => 'U moet ingeteken wees om lêers te kan laai.',
+'api-error-mustbeposted' => "Interne fout: Die versoek vereis 'n HTTP POST-metode.",
 'api-error-noimageinfo' => 'Die oplaai daarin geslaag, maar die bediener het ons nie enige inligting oor die lêer.',
+'api-error-nomodule' => "Interne fout: daar is nie 'n uploadmodule ingestel nie.",
 'api-error-ok-but-empty' => 'Interne fout: geen reaksie van die bediener.',
 'api-error-overwrite' => "'N bestaande lêer vervang word nie toegelaat nie.",
 'api-error-stashfailed' => 'Interne fout: Server nie tydelike lêer te stoor.',
index 5e1147b..19c6f87 100644 (file)
@@ -75,7 +75,7 @@ $messages = array(
 'tog-enotifminoredits' => 'ለአነስተኛ የገጽ እርማቶችም ኤመልዕክት ይላክልኝ',
 'tog-enotifrevealaddr' => 'ኤመልዕክት አድራሻዬን በማሳወቂያ መልዕክቶች ውስጥ አሳይ',
 'tog-shownumberswatching' => 'የሚከታተሉ ተጠቃሚዎችን ቁጥር አሳይ',
-'tog-oldsig' => ' የቀድሞው ፊርማ ቅደመ እይታ',
+'tog-oldsig' => 'የቀድሞው ፊርማ ቅደመ እይታ',
 'tog-fancysig' => 'ጥሬ ፊርማ (ያለራስገዝ ማያያዣ)',
 'tog-externaleditor' => 'በቀዳሚነት ውጪያዊ አራሚን ተጠቀም',
 'tog-externaldiff' => 'በቀዳሚነት የውጭ ልዩነት-ማሳያን ተጠቀም',
index 00a85da..c6155b6 100644 (file)
@@ -18,6 +18,7 @@
  * @author Bassem JARKAS
  * @author Chaos
  * @author Ciphers
+ * @author DRIHEM
  * @author DrFO.Tn
  * @author Elmondo21st
  * @author Elmoro
@@ -980,7 +981,7 @@ $2',
 'resetpass-temp-password' => 'كلمة سر مؤقتة:',
 
 # Special:PasswordReset
-'passwordreset' => 'تÙ\85ت Ø¥Ø¹Ø§Ø¯Ø© Ø¶Ø¨Ø· Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر',
+'passwordreset' => 'إعادة ضبط كلمة السر',
 'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتفاصيل حسابك.',
 'passwordreset-legend' => 'إعادة تعيين كلمة السر',
 'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
@@ -1141,7 +1142,7 @@ $2
 تذكر أن ملفات ال.css و ال.js تستخدم حروف صغيرة في العنوان ، كمثال {{ns:user}}:Foo/vector.css و ليس {{ns:user}}:Foo/Vector.css.",
 'updated' => '(محدثة)',
 'note' => "'''ملاحظة:'''",
-'previewnote' => "'''تذكر أن هذه مجرد معاينة للصفحة؛''''
+'previewnote' => "'''تذكر أن هذه مجرد معاينة أولية.'''
 لم تحفظ تغييراتك إلى الآن!",
 'previewconflict' => 'هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.',
 'session_fail_preview' => "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.
@@ -1158,6 +1159,7 @@ $2
 هذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الوب.'''",
 'edit_form_incomplete' => "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
 'editing' => 'تحرير $1',
+'creating' => 'إنشاء $1',
 'editingsection' => 'تحرير $1 (قسم)',
 'editingcomment' => 'تعديل $1 (قسم جديد)',
 'editconflict' => 'تضارب في التحرير: $1',
@@ -1181,8 +1183,8 @@ $2
 إذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />
 أنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).
 '''لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!'''",
-'longpageerror' => "'''خطأ: النص الذي أدخلته حجمه $1 كيلوبايت، وهذا أكبر من الحد الأقصى وهو $2 كيلوبايت.
\84ا Ù\8aÙ\85Ù\83Ù\86 Ø­Ù\81ظÙ\87.'''",
+'longpageerror' => "'''خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.'''
\88 Ù\8aتعذر Ø­Ù\81ظÙ\87.",
 'readonlywarning' => "'''تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.
 إذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.'''
 
@@ -1590,6 +1592,7 @@ $1",
 'yourrealname' => 'الاسم الحقيقي:',
 'yourlanguage' => 'اللغة:',
 'yourvariant' => 'لهجة المحتوى:',
+'prefs-help-variant' => 'عرض لهجتك المفضلة أو إملاؤها في صفحات المحتوى لهذا الويكي.',
 'yournick' => 'التوقيع:',
 'prefs-help-signature' => 'يجب أن توقع تعليقات صفحات النقاش باستخدام "<nowiki>~~~~</nowiki>" الذي سيحول إلى توقيعك مع طابع زمني.',
 'badsig' => 'توقيع خام غير صحيح؛ تحقق من وسوم HTML.',
@@ -1764,6 +1767,7 @@ $1",
 'action-suppressionlog' => 'رؤية هذا السجل الخاص',
 'action-block' => 'منع هذا المستخدم من التعديل',
 'action-protect' => 'تغيير مستويات الحماية لهذه الصفحة',
+'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
 'action-import' => 'استيراد هذه الصفحة من ويكي آخر',
 'action-importupload' => 'استيراد هذه الصفحة من ملف مرفوع',
 'action-patrol' => 'التعليم على تعديلات الآخرين كمراجعة',
@@ -1972,11 +1976,32 @@ $1',
 'upload-http-error' => 'صودف خطأ HTTP: $1',
 
 # File backend
+'backend-fail-stream' => 'لا يمكن عرض الملف $1.',
+'backend-fail-backup' => 'لا يمكن صنع نسخة أحتياطية للملف $1.',
 'backend-fail-notexists' => 'الملف $1 غير موجود.',
+'backend-fail-notsame' => 'يوجد بالفعل ملف غير متطابق في $1.',
+'backend-fail-invalidpath' => '$1 ليس مسارا صالحا للتخزين.',
+'backend-fail-delete' => 'لم يمكن حذف الملف $1.',
+'backend-fail-alreadyexists' => 'الملف $1 موجود بالفعل.',
+'backend-fail-store' => 'لا يمكن تخزين الملف $1 في $2 .',
 'backend-fail-copy' => 'لا يمكن نسخ الملف  $1  إلى  $2 .',
+'backend-fail-move' => 'تعذر نقل ملف $1 إلى $2 .',
 'backend-fail-opentemp' => 'تعذّر فتح ملف مؤقت.',
 'backend-fail-writetemp' => 'تعذّرت كتابة ملف مؤقت.',
 'backend-fail-closetemp' => 'تعذّر إغلاق ملف مؤقت.',
+'backend-fail-read' => 'لا يمكن قراءة الملف $1.',
+'backend-fail-create' => 'تعذر إنشاء الملف $1.',
+
+# Lock manager
+'lockmanager-notlocked' => 'تعذر فتح "$1"، الملف غير مغلق.',
+'lockmanager-fail-closelock' => 'تعذر إغلاق ملف التأمين "$1".',
+'lockmanager-fail-deletelock' => 'تعذر حذف ملف التأمين "$1".',
+'lockmanager-fail-acquirelock' => 'لا يمكن الحصول على تأمين لـ "$1".',
+'lockmanager-fail-openlock' => 'تعذر إغلاق ملف التأمين "$1".',
+'lockmanager-fail-releaselock' => 'تعذر تحرير التأمين لـ "$1"..',
+'lockmanager-fail-db-bucket' => 'تعذر الإتصال بعدد كافي من قواعد تأمين البيانات في الحزمة $1.',
+'lockmanager-fail-db-release' => 'تعذر تحرير الأقفال في  قاعدة البيانات $1.',
+'lockmanager-fail-svr-release' => 'تعذر تحرير الأقفال على الخادم $1.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'صودف خطأ أثناء فتح الملف لفحوصات ZIP.',
@@ -1994,13 +2019,14 @@ $1',
 'uploadstash-badtoken' => 'لم ينجح أداء ذلك العمل، ربما لأن وثائق تفويض التحرير الخاصة بك منتهية الصلاحية. حاول مرة أخرى.',
 'uploadstash-errclear' => 'لم تنجح عملية مسح الملفات.',
 'uploadstash-refresh' => 'تحديث قائمة الملفات',
+'invalid-chunk-offset' => 'قطعة أوفست غير صالحة',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'رفض الوصول',
 'img-auth-nopathinfo' => 'PATH_INFO مفقود.
-خادÙ\88Ù\85Ù\83 Ù\84Ù\8aس Ù\85ضبÙ\88طا Ù\84تÙ\85رÙ\8aر Ù\87Ø°Ù\87 Ø§Ù\84Ù\85عÙ\84Ù\88Ù\85ات.
-ربما يكون مبني على CGI ولا يمكنه دعم img_auth.
-[https://www.mediawiki.org/wiki/Manual:Image_Authorization راجع تصريح الصور].',
+خادÙ\85Ù\83 Ù\84Ù\8aس Ù\85ضبÙ\88طا  Ù\84تÙ\85رÙ\8aر Ù\87Ø°Ù\87 Ø§Ù\84Ù\85عÙ\84Ù\88Ù\85Ø©.
+قد يكون مبنيا على نظام CGI ولا يمكنه دعم img_auth.
+راجع https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'المسار المطلوب غير موجود في مجلد الرفع المضبوط.',
 'img-auth-badtitle' => 'تعذر تشكيل عنوان صالح من "$1".',
 'img-auth-nologinnWL' => 'لست والجا و"$1" ليست في القائمة البيضاء.',
@@ -2086,6 +2112,10 @@ $1',
 من فضلك انظر [$2 صفحة وصف الملف] لمزيد من المعلومات.',
 'sharedupload-desc-here' => 'هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.
 الوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.',
+'sharedupload-desc-edit' => 'هذا ملف من $1 وقد يكون مستخدما في مشاريع أخرى.
+يمكن لك تريد أن تعدل وصف الملف في [$2  صفحته] هناك.',
+'sharedupload-desc-create' => 'هذا ملف من $1 وقد يكون مستخدما في مشاريع أخرى.
+يمكن لك تريد أن تعدل وصف الملف في [$2  صفحته] هناك.',
 'filepage-nofile' => 'لا ملف موجود بهذا الاسم.',
 'filepage-nofile-link' => 'لا يوجد ملف بهذا الاسم، لكن يمكنك [$1 رفعه].',
 'uploadnewversion-linktext' => 'ارفع نسخة جديدة من هذا الملف',
@@ -2221,6 +2251,8 @@ $1',
 'wantedpages' => 'صفحات مطلوبة',
 'wantedpages-badtitle' => 'عنوان غير صحيح في مجموعة النتائج: $1',
 'wantedfiles' => 'ملفات مطلوبة',
+'wantedfiletext-cat' => 'الملفات التالية مستعملة ولكن لا وجود لها. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة. بالإضافة، أي صفحات تتضمن الملفات الغير موجودة تم سردها في [[:$1]].',
+'wantedfiletext-nocat' => 'الملفات التالية مستعملة ولكن  غير متوفرة. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة.',
 'wantedtemplates' => 'قوالب مطلوبة',
 'mostlinked' => 'أكثر الصفحات وصلا',
 'mostlinkedcategories' => 'أكثر التصنيفات ارتباطا',
@@ -2229,6 +2261,7 @@ $1',
 'mostimages' => 'أكثر الملفات ارتباطا',
 'mostrevisions' => 'أكثر الصفحات تعديلا',
 'prefixindex' => 'كل الصفحات بالبادئة',
+'prefixindex-namespace' => 'كل الصفحات مع بادئة ($1 مساحة الأسم)',
 'shortpages' => 'صفحات قصيرة',
 'longpages' => 'صفحات طويلة',
 'deadendpages' => 'صفحات نهاية مسدودة',
@@ -2318,8 +2351,9 @@ $1',
 'linksearch-pat' => 'نمط البحث:',
 'linksearch-ns' => 'النطاق:',
 'linksearch-ok' => 'ابحث',
-'linksearch-text' => 'الكروت الخاصة مثل "*.wikipedia.org" يمكن استخدامها.<br />
-البروتوكولات المدعومة: <tt>$1</tt>',
+'linksearch-text' => 'Wildcards مثل "*.wikipedia.org" يمكن استخدامها.
+تحتاج على الأقل إلى نطاق ذو مستوى أعلى، كمثال "*.org".<br />
+البروتوكولات المدعومة: <tt>$1</tt> (لا تقم بإضافة أي من هذه إلى بحثك).',
 'linksearch-line' => '$1 موصولة من $2',
 'linksearch-error' => 'الكروت الخاصة يمكن أن تظهر فقط في بداية اسم المضيف.',
 
@@ -2537,6 +2571,8 @@ $UNWATCHURL
 'protect-title' => 'ضبط مستوى الحماية ل"$1"',
 'protect-title-notallowed' => 'عرض مستوى الحماية ل "$1"',
 'prot_1movedto2' => 'نُقلت [[$1]] إلى [[$2]]',
+'protect-badnamespace-title' => 'مساحة إسم غير محمية',
+'protect-badnamespace-text' => 'لا يمكن حماية الصفحات الموجودة في مساحة الإسم',
 'protect-legend' => 'تأكيد الحماية',
 'protectcomment' => 'السبب:',
 'protectexpiry' => 'تنتهي في:',
@@ -2638,6 +2674,7 @@ $UNWATCHURL
 'undelete-cleanup-error' => 'خطأ حذف ملف أرشيف غير مستخدم "$1".',
 'undelete-missing-filearchive' => 'غير قادر على استرجاع ملف الأرشيف رقم $1 لأنه ليس في قاعدة البيانات.
 ربما يكون قد تم استرجاعه.',
+'undelete-error' => 'وقع خطأ عند إلغاء حذف الصفحة',
 'undelete-error-short' => 'خطأ استرجاع ملف: $1',
 'undelete-error-long' => 'حدثت أخطاء أثناء استرجاع الملف:
 
@@ -2736,8 +2773,8 @@ $1',
 'ipb-confirm' => 'أكّد المنع',
 'badipaddress' => 'عنوان أيبي غير صحيح',
 'blockipsuccesssub' => 'تم المنع بنجاح',
-'blockipsuccesstext' => 'تم منع [[Special:Contributions/$1|$1]].<br />
§Ù\86ظر [[Special:BlockList|Ù\82ائÙ\85Ø© Ù\85Ù\86ع Ø§Ù\84Ø£يبي]] لمراجعة حالات المنع.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] تم منعها.<br />
£Ù\86ظر [[Special:BlockList|Ù\82ائÙ\85Ø© Ù\85Ù\86ع Ø§Ù\84Ø¢يبي]] لمراجعة حالات المنع.',
 'ipb-blockingself' => 'أنت على وشك منع نفسك! أمتأكد من رغبتك في القيام بذلك؟',
 'ipb-confirmhideuser' => 'أنت على وشك منع مستخدم مع تفعيل خيار "أخف المستخدم". سوف يخفي هذا الخيار اسم المستخدم من جميل القوائم ومدخلات السجلات. أمتأكد من رغبتك في القيام بذلك؟',
 'ipb-edit-dropdown' => 'عدل أسباب المنع',
@@ -2792,7 +2829,7 @@ $1',
 'reblock-logentry' => 'غير إعدادات المنع ل[[$1]] بتاريخ انتهاء $2 $3',
 'blocklogtext' => 'هذا سجل بعمليات المنع ورفع المنع.
 عناوين الأيبي الممنوعة تلقائيا ليست معروضة.
§Ù\86ظر [[Special:BlockList|عÙ\86اÙ\88Ù\8aÙ\86 Ø§Ù\84Ø£Ù\8aبÙ\8a Ø§Ù\84Ù\85Ù\85Ù\86Ù\88عة]] لرؤية عمليات المنع المفعلة حاليا.',
£Ù\86ظر [[Special:BlockList|Ù\82ائÙ\85Ø© Ù\85Ù\86ع Ø§Ù\84Ø¢Ù\8aبÙ\8a]] لرؤية عمليات المنع المفعلة حاليا.',
 'unblocklogentry' => 'رفع منع $1',
 'block-log-flags-anononly' => 'المستخدمون المجهولون فقط',
 'block-log-flags-nocreate' => 'إنشاء الحسابات ممنوع',
@@ -2958,6 +2995,7 @@ $1',
 'exportcuronly' => 'ضمن المراجعة الحالية فقط، وليس التاريخ الكامل',
 'exportnohistory' => "----
 ملاحظة:''' تصدير التاريخ الكامل للصفحات من خلال هذه الاستمارة تم تعطيله لأسباب تتعلق بالأداء'''",
+'exportlistauthors' => 'أضف قائمة كاملة بالمساهمين لكل صفحة',
 'export-submit' => 'صدر',
 'export-addcattext' => 'أضف صفحات من تصنيف:',
 'export-addcat' => 'أضف',
@@ -2990,6 +3028,8 @@ $1',
 'thumbnail_error' => 'خطأ في إنشاء صورة مصغرة: $1',
 'djvu_page_error' => 'صفحة DjVu خارج النطاق',
 'djvu_no_xml' => 'لا يمكن جلب XML لملف DjVu',
+'thumbnail-temp-create' => 'تعذر إنشاء ملف الصورة المصغرة المؤقت',
+'thumbnail-dest-create' => 'تعذر حفظ الصورة المصغرة للوجهة',
 'thumbnail_invalid_params' => 'محددات التصغير غير صحيحة',
 'thumbnail_dest_directory' => 'غير قادر على إنشاء المجلد الهدف',
 'thumbnail_image-type' => 'نوع الصورة غير مدعوم',
@@ -3270,9 +3310,9 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1، $2×$3',
-'seconds-abbrev' => '$1ث',
-'minutes-abbrev' => '$1د',
-'hours-abbrev' => '$1س',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
 'seconds' => '{{PLURAL:$1||ثانية واحدة|ثانيتين|$1 ثوانٍ|$1 ثانية}}',
 'minutes' => '{{PLURAL:$1||دقيقة واحدة|دقيقتين|$1 دقائق|$1 دقيقة}}',
 'hours' => '{{PLURAL:$1||ساعة واحدة|ساعتين|$1 ساعات|$1 ساعة}}',
@@ -3955,7 +3995,7 @@ $5
 'hebrew-calendar-m6-gen' => 'أدار',
 'hebrew-calendar-m6a-gen' => 'أدار الأول',
 'hebrew-calendar-m6b-gen' => 'أدار الثاني',
-'hebrew-calendar-m7-gen' => 'Ù\86Ù\8aزاÙ\86',
+'hebrew-calendar-m7-gen' => 'Ù\86Ù\8aساÙ\86/أبرÙ\8aÙ\84',
 'hebrew-calendar-m8-gen' => 'أيار',
 'hebrew-calendar-m9-gen' => 'سيفان',
 'hebrew-calendar-m10-gen' => 'تموز',
@@ -3964,7 +4004,7 @@ $5
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|نقاش]])',
-'timezone-utc' => 'ت Ø¹ Ù\85',
+'timezone-utc' => 'باÙ\84تÙ\88Ù\82Ù\8aت Ø§Ù\84عاÙ\84Ù\85Ù\8a',
 
 # Core parser functions
 'unknown_extension_tag' => 'وسم امتداد غير معروف "$1"',
@@ -3987,7 +4027,7 @@ $5
 'version-hook-name' => 'اسم الخطاف',
 'version-hook-subscribedby' => 'يستخدم بواسطة',
 'version-version' => '(نسخة $1)',
-'version-svn-revision' => '(&رلم;r$2)',
+'version-svn-revision' => '(r$2)',
 'version-license' => 'الرخصة',
 'version-poweredby-credits' => "تدار هذه الويكي ب'''[//www.mediawiki.org/ ميدياويكي]''', حقوق النشر © 2001-$1 $2.",
 'version-poweredby-others' => 'آخرون',
@@ -4154,6 +4194,7 @@ $5
 'api-error-duplicate-archive-popup-title' => 'تكرار {{PLURAL:$1|ملف|ملفات}} قد تم حذفه مسبقاً',
 'api-error-duplicate-popup-title' => 'ارفع {{PLURAL:$1|الملف|الملف|الملفين|الملفات|الملفات|الملفات}}',
 'api-error-empty-file' => 'كان ملف الذي قمت بإرسال فارغة.',
+'api-error-emptypage' => 'إنشاء صفحات فارغة جديدة، غير مسموح به.',
 'api-error-fetchfileerror' => 'خطأ داخلي: قد حدث خطأ أثناء إحضار الملف.',
 'api-error-file-too-large' => 'الملف الذي أرسلته كان كبيرا جدا.',
 'api-error-filename-tooshort' => 'اسم الملف قصير جدا.',
index 14859c6..3d4112c 100644 (file)
@@ -97,7 +97,7 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'ܪܫÜ\98Ü¡ Ü£ÜªÜ\9bÜ\90 Ü¬Ü\9aÜ\9dܬ Ü\90Ü£Ü\98ܪÜ\90:',
+'tog-underline' => 'ܪܫܘܡ ܣܪܛܐ ܬܚܝܬ ܐܣܪܐ:',
 'tog-justify' => 'ܫܘܐ ܦܬܓܡ̈ܐ',
 'tog-hideminor' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'tog-editondblclick' => 'ܫܚܠܦ ܦܐܬ̈ܐ ܬܪ ܢܩܪܐ ܙܘܓܢܝܐ (ܣܢܝܩ ܠ JavaScript)',
@@ -351,10 +351,13 @@ $1',
 'internalerror' => 'ܦܘܕܐ ܓܘܝܐ',
 'internalerror_info' => 'ܦܘܕܐ ܓܘܝܐ: $1',
 'badtitle' => 'ܟܘܢܝܐ ܠܐ ܛܒܐ',
+'perfcached' => 'ܓܠܝܬ̈ܐ ܗܠܝܢ ܐܣܢܝܢ ܐܢܘܢ ܘܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܕܠܐ ܢܗܘܢ ܚܘ̈ܕܬܐ. ܡܬܚܐ ܥܠܝܐ ܕ {{PLURAL:$1|ܚܕ ܦܠܛܐ|$1 ܦܠܛ̈ܐ}} ܐܝܬ ܒܐܣܢܐ.',
+'perfcachedts' => 'ܓܠܝܬ̈ܐ ܗܠܝܢ ܐܣܢܝܢ ܐܢܘܢ ܘܚܘܕܬܐ ܐܚܪܝܐ ܗܘܐ ܒ $1. ܡܬܚܐ ܥܠܝܐ ܕ {{PLURAL:$4|ܚܕ ܦܠܛܐ|$4 ܦܠܛ̈ܐ}} ܐܝܬ ܒܐܣܢܐ.',
 'viewsource' => 'ܚܙܝ ܡܒܘܥܐ',
-'actionthrottled' => 'ܠܐ ܘܪܕ ܠܡܥܒܕ ܝܬܝܪ ܡܢ ܐܗܐ ܥܒܕܐ',
-'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܠܚܙܝܐ ܘܢܣܚܐ ܠܡܒܘܥ̈ܐ ܕܐܗܐ ܦܐܬܐ:',
-'protectedinterface' => 'ܐܗܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ, ܘܐܝܠܗ ܢܛܪܬܐ ܠܡܘܢܥܐ ܚܪܒܐ.',
+'viewsource-title' => 'ܚܙܝ ܡܒܘܥܐ ܕ $1',
+'actionthrottled' => 'ܠܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܠܡܥܒܕ ܝܬܝܪ ܡܢ ܗܢܐ ܥܒܕܐ',
+'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܕܢܚܙܐ ܘܢܣܚܐ ܠܡܒܘ̈ܥܐ ܕܗܕܐ ܦܐܬܐ:',
+'protectedinterface' => 'ܗܕܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ, ܘܐܝܬܝܗܝ ܢܛܪܬܐ ܠܡܘܢܥ ܚܘܒܠܐ.',
 'editinginterface' => "''ܙܘܗܪܐ:''' ܐܢܬ ܥܒܕܬ ܫܚܠܦܬܐ ܒܦܐܬܐ ܡܬܦܠܚܬ ܠܡܘܬܘܪ̈ܐ ܦܐܬܘܬ̈ܐ ܟܬܝܒ̈ܐ ܠܚܘܪܙܐ.
 ܟܠ ܫܘܚܠܦܐ ܒܐܗܐ ܦܐܬܐ ܒܕ ܥܒܕ ܟܪ ܥܠ ܡܚܙܝܬܐ ܦܐܬܐ ܕܡܦܠܚܢܐ ܠܡܦܠܚܢ̈ܐ ܐܚܪ̈ܝܢܐ.
 ܠܬܘܪ̈ܓܡܐ، ܡܦܠܚ ܬܪܡܝܬܐ ܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
@@ -456,10 +459,15 @@ $1',
 'loginreqlink' => 'ܥܘܠ',
 'accmailtitle' => 'ܡܠܬܐ ܕܥܠܠܐ ܫܕܪܬ',
 'newarticle' => '(ܚܕܬܐ)',
+'newarticletext' => "ܐܬܬ ܒܬܪ ܐܣܪܐ ܕܕܦܐ ܕܠܐ ܐܬܬܣܝܡ ܥܕܡܫ.
+ܠܣܘܝܡܐ ܕܕܦܐ ܗܢܐ, ܫܪܝ ܠܟܬܒܬܐ ܒܣܢܕܘܩܐ ܠܬܚܬ (ܚܙܝ [[{{MediaWiki:Helppage}}|ܕܦܐ ܕܥܘܕܪܢܐ]] ܠܐܚܪܢܐ ܝܕ̈ܥܬܐ).
+ܐܢ ܐܬܬ ܠܗܪܟܐ ܦܘܕܐܝܬ, ܕܘܫ ܠܦܪܡܝܬܐ ܕ '''ܠܒܣܬܪ back''' ܒܡܦܐܬܢܐ ܕܝܠܟ.",
 'updated' => '(ܐܬܚܕܬ)',
 'note' => "'''ܡܥܝܪܢܘܬܐ:'''",
-'previewnote' => "'''ܕܟܪ ܕܗܢܘ ܚܝܪܐ ܩܕܡܝܐ ܒܠܚܘܕ'''. ܫܘܚܠܦ̈ܐ ܕܝܠܟ ܠܐ ܐܬܠܒܟܘ ܥܕܡܐ ܠܗܫܐ!",
+'previewnote' => "'''ܕܟܪ ܕܗܢܘ ܚܝܪܐ ܩܕܡܝܐ ܒܠܚܘܕ'''.
+ܫܘܚܠܦ̈ܐ ܕܝܠܟ ܠܐ ܐܬܠܒܟܘ ܥܕܡܐ ܠܗܫܐ!",
 'editing' => 'ܫܚܠܦܬܐ ܕ $1',
+'creating' => 'ܣܘܝܡܐ ܕ $1',
 'editingsection' => 'ܫܚܠܦܬܐ ܕ $1 (ܡܢܬܐ)',
 'editingcomment' => 'ܫܚܠܦܬܐ ܕ $1 (ܡܢܬܐ ܚܕܬܐ)',
 'yourtext' => 'ܟܬܒܬܐ ܕܝܠܟ',
@@ -772,8 +780,8 @@ $1',
 'recentchanges' => 'ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'recentchanges-legend' => 'ܓܒܝܬ̈ܐ ܕܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'recentchangestext' => 'ܥܩܒ ܫܘܚܠܦ̈ܐ ܚܕܬ ܡܢ ܟܠ ܕܘܝܩܝ ܒܦܐܬܐ ܗܕܐ.',
-'recentchanges-label-newpage' => 'Ü«Ü\98Ü\9aܠܦÜ\90 Ü\97Ü¢Ü\90 Ü\92ܪÜ\90 Ü¦Ü\90ܬܐ ܚܕܬܐ',
-'recentchanges-label-minor' => 'Ü\97Ü¢Ü\90 Ü\97Ü\98 Ü«Ü\98Ü\9aܠܦÜ\90 Ü\99Ü¥Ü\98ܪÜ\90',
+'recentchanges-label-newpage' => 'Ü«Ü\98Ü\9aܠܦÜ\90 Ü\97Ü¢Ü\90 Ü\90ܬܬܣÜ\9dÜ¡ Ü\95ܦܐ ܚܕܬܐ',
+'recentchanges-label-minor' => 'ܗܢܘ ܫܘܚܠܦܐ ܙܥܘܪܐ',
 'recentchanges-label-bot' => 'ܒܘܬ (bot) ܥܒܕ ܗܢܐ ܫܘܚܠܦܐ',
 'rclistfrom' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $1',
 'rcshowhideminor' => '$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ',
@@ -925,10 +933,12 @@ $1',
 ܗܫܐ ܐܝܬܝܗܝ  ܨܘܝܒܐ ܠ [[$2]].',
 
 'brokenredirects' => 'ܨܘܝܒ̈ܐ ܬܒܝܪ̈ܐ',
+'brokenredirectstext' => 'ܨܘ̈ܝܒܐ ܗܠܝܢ ܡܛܝܢ ܠܕ̈ܦܐ ܕܠܝܬܠܗܘܢ ܐܝܬܘܬܐ:',
 'brokenredirects-edit' => 'ܫܚܠܦ',
 'brokenredirects-delete' => 'ܫܘܦ',
 
 'withoutinterwiki' => 'ܦܐܬܬ̈ܐ ܕܠܐ ܐܣܘܪ̈ܐ ܕܠܫܢ̈ܐ ܐܚܪ̈ܢܐ',
+'withoutinterwiki-summary' => 'ܕ̈ܦܐ ܗܠܝܢ ܠܐ ܡܛܝܢ ܠܨ̈ܚܚܐ ܕܠܫܢ̈ܐ ܐܚܪ̈ܢܐ.',
 'withoutinterwiki-legend' => 'ܫܪܘܝܐ',
 'withoutinterwiki-submit' => 'ܚܘܝ',
 
@@ -941,6 +951,7 @@ $1',
 'nmembers' => '$1 {{PLURAL:$1|ܗܕܡܐ|ܗܕ̈ܡܐ}}',
 'nrevisions' => '$1 {{PLURAL:$1|ܬܢܝܬܐ|ܬܢܝܬ̈ܐ }}',
 'nviews' => '$1 {{PLURAL:$1|ܚܘܘܝܐ|ܚܘܘܝ̈ܐ}}',
+'specialpage-empty' => 'ܠܝܬ ܦܠܛ̈ܐ ܒܬܫܪܪܐ ܗܢܐ.',
 'lonelypages' => 'ܦܐܬܬ̈ܐ ܝܬܡܬ̈ܐ',
 'uncategorizedpages' => 'ܦܐܬܬ̈ܐ ܠܐ ܣܕܝܪ̈ܬܐ',
 'uncategorizedcategories' => 'ܣܕܪ̈ܐ ܠܐ ܣܕܝܪ̈ܐ',
@@ -1292,6 +1303,7 @@ Do you want to change the settings?',
 
 # Export
 'export' => 'ܐܦܩ ܦܐܬܬ̈ܐ',
+'exportall' => 'ܐܦܩ ܟܠ ܕ̈ܦܐ',
 'export-submit' => 'ܐܦܩ',
 'export-addcattext' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܡܢ ܣܕܪܐ:',
 'export-addcat' => 'ܐܘܣܦ',
@@ -1529,9 +1541,9 @@ $1',
 
 # New logging system
 'logentry-move-move' => '$1 ܫܢܐ ܕܦܐ ܕ $3 ܠ $4',
-'logentry-move-move-noredirect' => '$1 ܫܢܐ ܕܦܐ ܕ $3 ܠ $4 ܕܠܐ ܫܒܩܐ ܕܦܐ ܕܨܘܝܒܐ',
+'logentry-move-move-noredirect' => '$1 Ü«Ü¢Ü\90 Ü\95ܦÜ\90 Ü\95 $3 Ü  $4 Ü\95Ü Ü\90 Ü«Ü\92Ü©Ü\90 Ü\95Ü\95ܦÜ\90 Ü\95ܨÜ\98Ü\9dÜ\92Ü\90',
 'logentry-move-move_redir' => '$1 ܫܢܐ ܕܦܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܗܘܐ ܕܦܐ ܕܨܘܝܒܐ',
-'logentry-move-move_redir-noredirect' => '$1 ܫܢܐ ܕܦܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܗܘܐ ܕܦܐ ܕܨܘܝܒܐ ܘܕܠܐ ܫܒܩܐ ܕܦܐ ܕܨܘܝܒܐ',
+'logentry-move-move_redir-noredirect' => '$1 Ü«Ü¢Ü\90 Ü\95ܦÜ\90 Ü\95 $3 Ü  $4 Ü\95Ü\90Ü\9dܬÜ\98Ü\97Ü\9d Ü\97Ü\98Ü\90 Ü\95ܦÜ\90 Ü\95ܨÜ\98Ü\9dÜ\92Ü\90 Ü\98Ü\95Ü Ü\90 Ü«Ü\92Ü©Ü\90 Ü\95Ü\95ܦÜ\90 Ü\95ܨÜ\98Ü\9dÜ\92Ü\90',
 'logentry-newusers-newusers' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ',
 'logentry-newusers-create' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ',
 'logentry-newusers-create2' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3',
index 7d48725..7d9ea1c 100644 (file)
@@ -785,7 +785,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'userinvalidcssjstitle' => "'''সতৰ্কবাণী:'''  \"\$1\" নামৰ কোনো আৱৰণ নাই। Custom .css আৰু .js পৃষ্ঠাই সৰুফলাৰ শিৰোনামা ব্যৱহাৰ কৰে, যেনে-  {{ns:user}}:Foo/Vector.css ৰ সলনি {{ns:user}}:Foo/vector.css।",
 'updated' => "(আপডেট কৰা হ'ল)",
 'note' => "'''টোকা:'''",
-'previewnote' => "'''এয়া প্ৰাকদৰ্শনহে মাথোন। পৰিৱৰ্তনসমূহ এতিয়ও সংৰক্ষণ কৰা হোৱা নাই!'''",
+'previewnote' => "'''মনত ৰাখিব এয়া মাথোন প্ৰাক্‌দৰ্শনহে।'''
+আপোনাৰ সালসলনিসমূহ এতিয়াও সংৰক্ষণ কৰা হোৱা নাই!",
 'previewconflict' => 'এই প্ৰাকদৰ্শনে ওপৰৰ সম্পাদনা ক্ষেত্ৰৰ লেখা সাঁচি ৰাখিলে যেনেকুৱা দেখা যাব তেনেকুৱা দেখাইছে ।',
 'session_fail_preview' => "'''দুঃখিত! চেচন ডাটা হেৰাই যোৱাৰ কাৰণে আপোনাৰ সম্পাদনা কৃতকাৰ্য্য নহ'ল ।'''
 অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক ।
@@ -801,7 +802,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 কোনো আসোঁৱাহপূৰ্ণ ৱেব-ভিত্তিক বেনামী প্ৰক্সী সেৱা ব্যৱহাৰ কৰিলে এনে হ’ব পাৰে ।",
 'edit_form_incomplete' => "'''এই সম্পাদনাৰ কিছু অংশ চাৰ্ভাৰলৈ নগ’ল; আপোনাৰ সম্পাদনা ঠিকে আছেনে পৰীক্ষা কৰি পুনৰ চেষ্টা কৰক ।'''",
 'editing' => '$1 সম্পাদনা',
-'creating' => 'সৃষ্টি কৰি থকা হৈছে $1',
+'creating' => '$1 পৃষ্ঠাখন আপুনি সৃষ্টি কৰি আছে',
 'editingsection' => '$1 (বিভাগ) সম্পাদনা কৰি থকা হৈছে',
 'editingcomment' => '$1 (নতুন বিভাগ) সম্পাদনা কৰি থকা হৈছে',
 'editconflict' => 'সম্পাদনা দ্বন্দ: $1',
@@ -870,6 +871,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'edit-no-change' => 'আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই',
 'edit-already-exists' => "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল ।
 পৃষ্ঠাখন ইতিমধ্যে আছেই ।",
+'defaultmessagetext' => 'সাধাৰণ বাৰ্তা পাঠ্য',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''সতৰ্কবাণী:''' এই পৃষ্ঠাখনত অধিক এক্সপেনচিভ পাৰ্চাৰ ফাংচন কল আছে ।
@@ -986,7 +988,7 @@ $3 এ আগবঢ়োৱা ইয়াৰ কাৰণ হ’ল ''$2''",
 'revdelete-legend' => 'দৃষ্টিপাত সীমাবদ্ধ কৰক',
 'revdelete-hide-text' => 'সংশোধিত পাঠ গোপন কৰক',
 'revdelete-hide-image' => 'ফাইলৰ বিষয়বস্তু গোপন কৰক',
-'revdelete-hide-name' => 'কাৰ্য্য আৰু লক্ষ্য গোপন কৰক',
+'revdelete-hide-name' => 'কাৰ্য আৰু লক্ষ্য গোপন কৰক',
 'revdelete-hide-comment' => 'সম্পাদনা মন্তব্য আতৰাই থওক',
 'revdelete-hide-user' => 'সম্পাদকৰ সদস্যনাম/আই-পি ঠিকনা গোপন কৰক',
 'revdelete-hide-restricted' => 'প্ৰশাসকবৃন্দৰ লগতে আনৰ পৰাও তথ্য ৰোধ কৰক',
@@ -1007,7 +1009,7 @@ $1",
 'revdel-restore-deleted' => 'বাতিল কৰা সংশোধনসমূহ',
 'revdel-restore-visible' => 'দৃশ্যমান সংশোধনসমূহ',
 'pagehist' => 'পৃষ্ঠা ইতিহাস',
-'deletedhist' => 'মà¦\9aি à¦ªà§\87লà§\8bৱা ইতিহাস',
+'deletedhist' => 'বিলà§\8bপ à¦\95ৰাৰ ইতিহাস',
 'revdelete-hide-current' => ' $2, $1 তাৰিখৰ এই আইটেমটো গোপন কৰাত সমস্যা হৈছে: এইটো বৰ্তমানৰ সংশোধনী ।
 এইটোক গোপন কৰিব পৰা নাযাব ।',
 'revdelete-show-no-access' => '$2, $1 তাৰিখৰ এই আইটেমটো দেখুওৱাত সমস্যা হৈছে: এই আইটেমটো "সীমাবদ্ধ" হিছাপে চিহ্নিত ।
@@ -1030,8 +1032,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'নিবাৰণ ল’গ',
-'suppressionlogtext' => 'প্ৰশাসকৰ পৰা গোপনে ৰখা অৱলুপ্তি আৰু প্ৰতিবন্ধকৰ তালিকা তলত দিয়া হৈছে ।
-বৰ্তমান কাৰ্য্যৰত নিষেধ আৰু প্ৰতিবন্ধকসমূহৰ বাবে [[Special:BlockList|IP প্ৰতিবন্ধক তালিকা]] ।',
+'suppressionlogtext' => 'পà§\8dৰশাসà¦\95ৰ à¦ªà§°à¦¾ à¦\97à§\8bপনà§\87 à§°à¦\96া à¦¸à¦®à¦² à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য় à¦\85ৱলà§\81পà§\8dতি à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95ৰ à¦¤à¦¾à¦²à¦¿à¦\95া à¦¤à¦²à¦¤ à¦¦à¦¿à¦¯à¦¼à¦¾ à¦¹à§\88à¦\9bà§\87 à¥¤
+বৰà§\8dতমান à¦\95াৰà§\8dযà§\8dযৰত à¦¨à¦¿à¦·à§\87ধ à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95সমà§\82হৰ à¦¬à¦¾à¦¬à§\87 [[Special:BlockList|IP à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦\9aাà¦\93à¦\95।',
 
 # History merging
 'mergehistory' => 'পৃষ্ঠাৰ ইতিহাসবোৰ মিলাই দিয়ক',
@@ -1073,7 +1075,7 @@ $1",
 'showhideselectedversions' => 'নিৰ্বাচিত সংশোধনসমূহ দেখুৱাওক/আঁৰ কৰক',
 'editundo' => 'পূৰ্ববত কৰক',
 'diff-multi' => '({{PLURAL:$2|এজন সদস্যৰ|$2জন সদস্যৰ}} দ্বাৰা {{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1-টা মধ্যৱৰ্তী সংশোধন}} দেখোৱা হোৱা নাই)',
-'diff-multi-manyusers' => '({{PLURAL:$2|à¦\8fà¦\9cনতà¦\95à§\88|$2-à¦\9cনতà¦\95à§\88}} à¦\85ধিà¦\95 à¦¸à¦¦à¦¸à§\8dযৰ à¦¦à§\8dবাৰা {{PLURAL:$1|à¦\8fà¦\9fা à¦®à¦§à§\8dযৱৰà§\8dতà§\80 à¦¸à¦\82শà§\8bধন|$1-à¦\9fা à¦®à¦§à§\8dযৱৰà§\8dতà§\80 à¦¸à¦\82শà§\8bধন}} à¦¦à§\87à¦\96à§\8bৱা হোৱা নাই)',
+'diff-multi-manyusers' => '({{PLURAL:$2|à¦\8fà¦\9cনতà¦\95à§\88|$2-à¦\9cনতà¦\95à§\88}} à¦\85ধিà¦\95 à¦¸à¦¦à¦¸à§\8dযৰ à¦¦à§\8dবাৰা {{PLURAL:$1|à¦\8fà¦\9fা à¦®à¦§à§\8dযৱৰà§\8dতà§\80 à¦¸à¦\82শà§\8bধন|$1-à¦\9fা à¦®à¦§à§\8dযৱৰà§\8dতà§\80 à¦¸à¦\82শà§\8bধন}} à¦¦à§\87à¦\96à§\81à¦\93ৱা হোৱা নাই)',
 
 # Search results
 'searchresults' => 'অনুসন্ধানৰ ফলাফল',
@@ -1591,7 +1593,7 @@ $1",
 'filename-bad-prefix' => "আপুনি আপলোড কৰা ফাইলৰ নামটো '''\"\$1\"''' দি আৰম্ভ হৈছে, যিটো ডিজিটেল কেমেৰাই স্বয়ংক্ৰিয়ভাৱে দিয়ে আৰু সি ব্যাখ্যামূলক নহয় ।
 অনুগ্ৰহ কৰি আপোনাৰ ফাইলটোৰ বাবে এটা ব্যাখ্যামূলক নাম বাছি লওক ।",
 'upload-success-subj' => "আপলোড সফল হ'ল",
-'upload-success-msg' => '[$2] à§° à¦ªà§°à¦¾ à¦\86পà§\8bনাৰ à¦\86পলà§\8bড à¦¸à¦«à¦² à¦¹à§\88à¦\9bà§\87 à¥¤ à¦\8fà¦\87à¦\9fà§\8b à¦\87য়াত à¦\89পলবà§\8dদà§\8dধ: [[:{{ns:file}}:$1]]',
+'upload-success-msg' => '[$2] ৰ পৰা আপোনাৰ আপলোড সফল হৈছে । এইটো ইয়াত উপলদ্ধ: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'আপল’ডত সমস্যা হৈছে',
 'upload-failure-msg' => '[$2] ৰ পৰা আপুনি কৰা আপল’ডত এটা সমস্যাই দেখা দিছে:
 
@@ -1980,6 +1982,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'allpages-bad-ns' => '{{SITENAME}} ত কোনো "$1" নামস্থান নাই ।',
 'allpages-hide-redirects' => 'পুনঃনিৰ্দেশ লুকুৱাওক',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'শেহতীয়া পাঠ্য',
+
 # Special:Categories
 'categories' => 'শ্ৰেণী',
 'categoriespagetext' => 'এই {{PLURAL:$1|বিষয়শ্ৰেণীত|বিষয়শ্ৰেণীসমূহত}}  পৃষ্ঠা বা মিডিয়া ফাইল আছে ।
@@ -2425,8 +2430,8 @@ $1',
 'ipb-confirm' => 'প্ৰতিবন্ধক নিশ্চিত কৰক',
 'badipaddress' => 'অগ্ৰহণযোগ্য আই-পি ঠিকনা',
 'blockipsuccesssub' => "বাৰণ কৰা সফল হ'ল",
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ক বাধা দিয়া হৈছে ।<br />
-প্ৰতিবন্ধকৰ পুনৰ্বিবেচনাৰ বাবে [[Special:BlockList|IP প্ৰতিবন্ধক তালিকা]]',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ক বাধা দিয়া হৈছে।<br />
+প্ৰতিবন্ধকৰ পুনৰ্বিবেচনাৰ বাবে [[Special:BlockList|প্ৰতিবন্ধক তালিকা]] চাওক।',
 'ipb-blockingself' => 'আপুনি নিজকে বাধাপ্ৰদান কৰিব বিচাৰিছে ! আপুনি নিশ্চিতনে আপুনি এনে কৰিব ?',
 'ipb-confirmhideuser' => 'আপুনি "সদস্য গোপন কৰক" বৈশিষ্ট সক্ৰিয় থকা এজন সদস্যক বাৰণ কৰিবলৈ ওলাইছে । এই কাৰ্যই সকলো তালিকা আৰু ল\'গ ভৰ্তিৰ পৰা তেওঁৰ নাম আঁতৰাই পেলাব । এই কাম কৰিব বুলি আপুনি নিশ্চিতনে ?',
 'ipb-edit-dropdown' => 'প্ৰতিবন্ধকৰ কাৰণসমূহ সম্পাদনা কৰক',
@@ -2479,9 +2484,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 তথ্যসূত্ৰ হিছাপে নিবাৰণ ল’গ তলত দিয়া হ’ল ।',
 'blocklogentry' => '"[[$1]]" ক $2 $3 লৈ সাল-সলনি কৰাৰ পৰা বাৰণ কৰা হৈছে।',
 'reblock-logentry' => '[[$1]]ৰ প্ৰতিবন্ধক ছেটিং ম্যাদ উকলা সময় $2 $3ৰ সৈতে সলনি কৰা হ’ল ।',
-'blocklogtext' => 'এই ল’গখন অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয় 
-স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই 
-সামà§\8dপà§\8dৰতিà¦\95 à¦\95াৰà§\8dযৰত à¦¨à¦¿à¦·à§\87ধ à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95ৰ à¦¬à¦¾à¦¬à§\87 [[Special:BlockList|à¦\86à¦\87.পি. à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦\9aাà¦\93à¦\95 ।',
+'blocklogtext' => 'এই ল’গখন অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয়।
+স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই।
+সামà§\8dপà§\8dৰতিà¦\95 à¦\95াৰà§\8dযৰত à¦¨à¦¿à¦·à§\87ধ à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95ৰ à¦¬à¦¾à¦¬à§\87 [[Special:BlockList|পà§\8dৰতিবনà§\8dধà¦\95 à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦\9aাà¦\93à¦\95।',
 'unblocklogentry' => '$1 বাৰণ উঠাই লোৱা হ’ল',
 'block-log-flags-anononly' => 'কেৱল বেনামী সদস্য',
 'block-log-flags-nocreate' => 'একাউন্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে',
@@ -3742,4 +3747,15 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'api-error-uploaddisabled' => "এই ৱিকিত আপল'ড নিষ্ক্ৰিয় কৰা হৈছে।",
 'api-error-verification-error' => 'সম্ভৱতঃ এই ফাইলটো ত্ৰুটিপূৰ্ণ বা তাৰ এক্সটেন্‌ছনটো ভুল।',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}}',
+'duration-minutes' => '$1 {{PLURAL:$1|মিনিট|মিনিট}}',
+'duration-hours' => '$1 {{PLURAL:$1|ঘন্টা|ঘন্টা}}',
+'duration-days' => '$1 {{PLURAL:$1|দিন|দিন}}',
+'duration-weeks' => '{{PLURAL: $1|সপ্তাহ|সপ্তাহ}}',
+'duration-years' => '$1 {{PLURAL:$1|বছৰ|বছৰ}}',
+'duration-decades' => '$1 {{PLURAL:$1|দশক|দশক}}',
+'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
+'duration-millennia' => '$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}',
+
 );
index d8dd929..ffb34ca 100644 (file)
@@ -60,61 +60,61 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Sorrayar enllaces:',
 'tog-justify' => 'Xustificar parágrafos',
-'tog-hideminor' => 'Anubrir les ediciones menores nos cambios recientes',
-'tog-hidepatrolled' => 'Anubrir les ediciones vixilaes nos cambios recientes',
-'tog-newpageshidepatrolled' => 'Atapecer les páxines vixilaes na llista de páxines nueves',
-'tog-extendwatchlist' => "Espander la llista de vixilancia p'amosar tolos cambios, non sólo los recientes.",
-'tog-usenewrc' => 'Cambios recientes ameyoraos (necesita JavaScript)',
+'tog-hideminor' => 'Anubrir les ediciones menores nos cambeos recientes',
+'tog-hidepatrolled' => 'Anubrir les ediciones vixilaes nos cambeos recientes',
+'tog-newpageshidepatrolled' => 'Anubrir les páxines vixilaes na llista de páxines nueves',
+'tog-extendwatchlist' => "Espander la llista de vixilancia p'amosar tolos cambeos, non solo los más recientes.",
+'tog-usenewrc' => 'Cambeos recientes ameyoraos (necesita JavaScript)',
 'tog-numberheadings' => 'Autonumberar los encabezaos',
 'tog-showtoolbar' => "Amosar la barra de ferramientes d'edición (JavaScript)",
-'tog-editondblclick' => 'Editar páxines con doble clic (JavaScript)',
+'tog-editondblclick' => 'Editar páxines con doble clic (necesita JavaScript)',
 'tog-editsection' => "Activar la edición de seiciones per aciu d'enllaces [editar]",
-'tog-editsectiononrightclick' => 'Activar la edición de seiciones calcando col botón<br /> drechu enriba los títulos de seición (JavaScript)',
+'tog-editsectiononrightclick' => 'Activar la edición de seiciones calcando col botón drechu nos títulos de seición (necesita JavaScript)',
 'tog-showtoc' => 'Amosar índiz (pa páxines con más de 3 encabezaos)',
-'tog-rememberpassword' => 'Recordar la mio identificación nesti ordenador (por un máximu de $1 {{PLURAL:$1|día|díes}})',
-'tog-watchcreations' => 'Añader les páxines que creo a la mio llista de vixilancia',
-'tog-watchdefault' => "Añader les páxines qu'edito a la mio llista de vixilancia",
-'tog-watchmoves' => 'Añader les páxines que muevo a la mio llista de vixilancia',
-'tog-watchdeletion' => "Añader les páxines qu'esborro a la mio llista de vixilancia",
-'tog-minordefault' => 'Marcar toles ediciones como menores de mou predetermináu',
+'tog-rememberpassword' => 'Recordar la mio identificación nesti ordenador (hasta un máximu de $1 {{PLURAL:$1|día|díes}})',
+'tog-watchcreations' => 'Amestar les páxines que creo a la mio llista de vixilancia',
+'tog-watchdefault' => "Amestar les páxines qu'edito a la mio llista de vixilancia",
+'tog-watchmoves' => 'Amestar les páxines que muevo a la mio llista de vixilancia',
+'tog-watchdeletion' => 'Amestar les páxines que desanicio a la mio llista de vixilancia',
+'tog-minordefault' => 'Marcar toles ediciones como menores por defeutu',
 'tog-previewontop' => "Amosar previsualización enantes de la caxa d'edición",
 'tog-previewonfirst' => 'Amosar previsualización na primer edición',
 'tog-nocache' => 'Desactivar la caché de páxines del restolador',
-'tog-enotifwatchlistpages' => 'Mandame un corréu cuando cambie una páxina de la mio llista de vixilancia',
+'tog-enotifwatchlistpages' => 'Mandame un corréu cuando camude una páxina de la mio llista de vixilancia',
 'tog-enotifusertalkpages' => "Mandame un corréu cuando camude la mio páxina d'alderique",
-'tog-enotifminoredits' => 'Mandame tamién un corréu pa les ediciones menores',
-'tog-enotifrevealaddr' => 'Amosar el mio corréu electrónicu nos correos de notificación',
-'tog-shownumberswatching' => "Amosar el númberu d'usuarios que la tán vixilando",
+'tog-enotifminoredits' => 'Mandame tamién un corréu cuando heba ediciones menores de les páxines',
+'tog-enotifrevealaddr' => 'Amosar la mio direición de corréu nos correos de notificación',
+'tog-shownumberswatching' => "Amosar el númberu d'usuarios que tán vixilando la páxina",
 'tog-oldsig' => 'Firma esistente:',
-'tog-fancysig' => 'Usar la firma como "testu wiki" (ensin enllaz automáticu)',
-'tog-externaleditor' => 'Usar un editor esternu de mou predeterminao (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Usar un diff esternu de mou predetermináu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-fancysig' => 'Tratar la firma como testu wiki (ensin enllaz automáticu)',
+'tog-externaleditor' => 'Usar un editor esternu por defeutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-externaldiff' => 'Usar un diff esternu por defutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
 'tog-showjumplinks' => 'Activar los enllaces d\'accesibilidá "saltar a"',
-'tog-uselivepreview' => 'Usar vista previa en direutu (JavaScript) (en pruebes)',
+'tog-uselivepreview' => 'Usar vista previa en tiempu real (necesita JavaScript) (en pruebes)',
 'tog-forceeditsummary' => "Avisame cuando grabe col resume d'edición en blanco",
-'tog-watchlisthideown' => 'Esconder les mios ediciones na llista de vixilancia',
-'tog-watchlisthidebots' => 'Esconder les ediciones de bots na llista de vixilancia',
-'tog-watchlisthideminor' => 'Esconder les ediciones menores na llista de vixilancia',
-'tog-watchlisthideliu' => "Ocultar ediciones d'usuarios rexistraos na llista de vixilancia",
-'tog-watchlisthideanons' => "Ocultar ediciones d'usuarios anónimos na llista de vixilancia",
-'tog-watchlisthidepatrolled' => 'Anubrir les ediciones patrullaes de la llista de vixilancia',
+'tog-watchlisthideown' => 'Anubrir les mios ediciones na llista de vixilancia',
+'tog-watchlisthidebots' => 'Anubrir les ediciones de bots na llista de vixilancia',
+'tog-watchlisthideminor' => 'Anubrir les ediciones menores na llista de vixilancia',
+'tog-watchlisthideliu' => "Anubrir les ediciones d'usuarios identificaos na llista de vixilancia",
+'tog-watchlisthideanons' => "Anubrir les ediciones d'usuarios anónimos na llista de vixilancia",
+'tog-watchlisthidepatrolled' => 'Anubrir les ediciones vixilaes de la llista de vixilancia',
 'tog-nolangconversion' => 'Desactivar la conversión de variantes',
-'tog-ccmeonemails' => 'Mandame copies de los correos que mando a otros usuarios',
+'tog-ccmeonemails' => "Mandame copies de los correos qu'unvio a otros usuarios",
 'tog-diffonly' => 'Nun amosar el conteníu de la páxina embaxo de les diferencies',
 'tog-showhiddencats' => 'Amosar categoríes anubríes',
 'tog-noconvertlink' => 'Desactivar la conversión del títulu del enllaz',
-'tog-norollbackdiff' => 'Desanicier les diferencies depués de restaurar',
+'tog-norollbackdiff' => 'Desaniciar les diferencies depués de facer una restauración',
 
-'underline-always' => 'Siempres',
+'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
-'underline-default' => 'Valor predetermináu del navegador',
+'underline-default' => 'Restolador por defeutu',
 
 # Font style option in Special:Preferences
-'editfont-style' => "Estilu de fonte deárea d'edición:",
-'editfont-default' => 'Valor predetermináu del navegador',
-'editfont-monospace' => 'Fonte monoespaciada',
-'editfont-sansserif' => 'Fonte Sans-serif',
-'editfont-serif' => 'Fonte Serif',
+'editfont-style' => "Estilu de fonte de l'área d'edición:",
+'editfont-default' => 'Restolador por defeutu',
+'editfont-monospace' => 'Tipu de lletra monoespaciada',
+'editfont-sansserif' => 'Tipu de lletra Sans-serif',
+'editfont-serif' => 'TIpu de lletra Serif',
 
 # Dates
 'sunday' => 'domingu',
@@ -170,63 +170,63 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categoríes}}',
-'category_header' => 'Páxines na categoría "$1"',
+'category_header' => 'Páxines na categoría «$1»',
 'subcategories' => 'Subcategoríes',
-'category-media-header' => 'Archivos multimedia na categoría "$1"',
-'category-empty' => "''Esta categoría nun tien anguaño nengún artículu o ficheru multimedia.''",
-'hidden-categories' => '{{PLURAL:$1|Categoría anubría|Categoríes anubríes}}',
-'hidden-category-category' => 'Categoríes ocultes',
-'category-subcat-count' => "{{PLURAL:$2|Esta categoría namái tien la subcategoría siguiente.|Esta categoría tien {{PLURAL:$1|la siguiente subcategoría|les siguientes $1 subcategoríes}}, d'un total de $2.}}",
-'category-subcat-count-limited' => 'Esta categoría tien {{PLURAL:$1|la siguiente subcategoría|les siguientes $1 subcategoríes}}.',
-'category-article-count' => "{{PLURAL:$2|Esta categoría contién namái la páxina siguiente.|{{PLURAL:$1|La siguiente páxina ta|Les $1 páxines siguientes tán}} nesta categoría, d'un total de $2.}}",
-'category-article-count-limited' => '{{PLURAL:$1|La siguiente páxina ta|Les siguientes $1 páxines tán}} na categoría actual.',
-'category-file-count' => "{{PLURAL:$2|Esta categoría contién namái el siguiente ficheru.|{{PLURAL:$1|El siguiente ficheru ta|Los $1 ficheros siguientes tán}} nesta categoría, d'un total de $2.}}",
-'category-file-count-limited' => '{{PLURAL:$1|El siguiente archivu ta|Los siguientes $1 archivos tán}} na categoría actual.',
+'category-media-header' => 'Ficheros multimedia na categoría «$1»',
+'category-empty' => "''Anguaño esta categoría nun tien nengún artículu nin ficheru multimedia.''",
+'hidden-categories' => '{{PLURAL:$1|Categoría anubrida|Categoríes anubríes}}',
+'hidden-category-category' => 'Categoríes anubríes',
+'category-subcat-count' => "{{PLURAL:$2|Esta categoría tien namái la subcategoría siguiente.|Esta categoría tien {{PLURAL:$1|la siguiente subcategoría|les siguientes $1 subcategoríes}}, d'un total de $2.}}",
+'category-subcat-count-limited' => 'Esta categoría tien {{PLURAL:$1|la subcategoría siguiente|les $1 subcategoríes siguientes}}.',
+'category-article-count' => "{{PLURAL:$2|Esta categoría contién namái la páxina siguiente.|{{PLURAL:$1|La páxina siguiente ta|Les $1 páxines siguientes tán}} nesta categoría, d'un total de $2.}}",
+'category-article-count-limited' => '{{PLURAL:$1|La páxina siguiente ta|Les $1 páxines siguientes tán}} na categoría actual.',
+'category-file-count' => "{{PLURAL:$2|Esta categoría contién namái'l ficheru siguiente.|{{PLURAL:$1|El ficheru siguiente ta|Los $1 ficheros siguientes tán}} nesta categoría, d'un total de $2.}}",
+'category-file-count-limited' => '{{PLURAL:$1El ficheru siguiente ta|Los $1 ficheeros siguientes tán}} na categoría actual.',
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páxines indexaes',
-'noindex-category' => 'Páxines ensin indexar',
-'broken-file-category' => 'Páxines con enllaces frañaos a ficheros',
+'noindex-category' => 'Páxines non indexaes',
+'broken-file-category' => 'Páxines con enllaces frañíos a ficheros',
 
 'about' => 'Tocante a',
-'article' => 'Conteníu de la páxina',
-'newwindow' => '(abriráse nuna ventana nueva)',
+'article' => 'Páxina de conteníu',
+'newwindow' => '(ábrese nuna ventana nueva)',
 'cancel' => 'Encaboxar',
 'moredotdotdot' => 'Más...',
 'mypage' => 'La mio páxina',
-'mytalk' => "La mio páxina d'alderique",
+'mytalk' => 'El mio alderique',
 'anontalk' => 'Alderique pa esta IP',
 'navigation' => 'Navegación',
 'and' => '&#32;y',
 
 # Cologne Blue skin
-'qbfind' => 'Alcontrar',
-'qbbrowse' => 'Escartafoyar',
+'qbfind' => 'Guetar',
+'qbbrowse' => 'Restolar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta páxina',
 'qbpageinfo' => 'Contestu',
 'qbmyoptions' => 'Les mios páxines',
 'qbspecialpages' => 'Páxines especiales',
-'faq' => 'FAQ',
-'faqpage' => 'Project:Entrugues más frecuentes',
+'faq' => 'EMF (entrugues más frecuentes)',
+'faqpage' => 'Project:EMF',
 
 # Vector skin
-'vector-action-addsection' => 'Amestar asuntu',
+'vector-action-addsection' => 'Amestar seición',
 'vector-action-delete' => 'Desaniciar',
 'vector-action-move' => 'Treslladar',
 'vector-action-protect' => 'Protexer',
-'vector-action-undelete' => 'Des-desaniciar',
+'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Camudar la proteición',
-'vector-simplesearch-preference' => 'Activar suxerencies de gueta enantaes (piel Vector namái)',
+'vector-simplesearch-preference' => 'Activar suxerencies meyoraes de gueta (namái apariencia Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver historial',
 'vector-view-view' => 'Lleer',
-'vector-view-viewsource' => 'Ver códigu fonte',
+'vector-view-viewsource' => 'Ver fonte',
 'actions' => 'Aiciones',
 'namespaces' => 'Espacios de nome',
 'variants' => 'Variantes',
 
-'errorpagetitle' => 'Error',
+'errorpagetitle' => 'Fallu',
 'returnto' => 'Tornar a $1.',
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ayuda',
@@ -236,7 +236,7 @@ $messages = array(
 'searcharticle' => 'Dir',
 'history' => 'Historial de la páxina',
 'history_short' => 'Historial',
-'updatedmarker' => 'actualizáu dende la mio última visita',
+'updatedmarker' => 'anovada dende la mio visita cabera',
 'printableversion' => 'Versión pa imprentar',
 'permalink' => 'Enllaz permanente',
 'print' => 'Imprentar',
@@ -253,54 +253,54 @@ $messages = array(
 'protect_change' => 'camudar',
 'protectthispage' => 'Protexer esta páxina',
 'unprotect' => 'Camudar la proteición',
-'unprotectthispage' => 'Camudar la proteición desta páxina',
+'unprotectthispage' => "Camudar la proteición d'esta páxina",
 'newpage' => 'Páxina nueva',
 'talkpage' => 'Aldericar sobre esta páxina',
 'talkpagelinktext' => 'Alderique',
 'specialpage' => 'Páxina especial',
 'personaltools' => 'Ferramientes personales',
 'postcomment' => 'Seición nueva',
-'articlepage' => 'Ver conteníu de la páxina',
+'articlepage' => 'Ver la páxina de conteníu',
 'talk' => 'Alderique',
 'views' => 'Vistes',
 'toolbox' => 'Ferramientes',
-'userpage' => "Ver páxina d'usuariu",
-'projectpage' => 'Ver la páxina de proyeutu',
-'imagepage' => 'Ver la páxina de ficheros',
-'mediawikipage' => 'Ver la páxina de mensaxe',
+'userpage' => "Ver la páxina d'usuariu",
+'projectpage' => 'Ver la páxina del proyeutu',
+'imagepage' => 'Ver la páxina del ficheru',
+'mediawikipage' => 'Ver la páxina de mensaxes',
 'templatepage' => 'Ver la páxina de plantía',
 'viewhelppage' => "Ver la páxina d'ayuda",
-'categorypage' => 'Ver páxina de categoríes',
-'viewtalkpage' => 'Ver alderique',
+'categorypage' => 'Ver la páxina de la categoría',
+'viewtalkpage' => "Ver la páxina d'alderique",
 'otherlanguages' => "N'otres llingües",
 'redirectedfrom' => '(Redirixío dende $1)',
 'redirectpagesub' => 'Páxina de redireición',
-'lastmodifiedat' => "Esta páxina se camudó por cabera vegada'l $1 a les $2.",
-'viewcount' => 'Esta páxina foi vista {{PLURAL:$1|una vegada|$1 vegaes}}.',
+'lastmodifiedat' => "Esta páxina camudóse per postrer vegada'l $1 a les $2.",
+'viewcount' => 'Esta páxina visitóse {{PLURAL:$1|una vegada|$1 vegaes}}.',
 'protectedpage' => 'Páxina protexida',
 'jumpto' => 'Saltar a:',
 'jumptonavigation' => 'navegación',
-'jumptosearch' => 'gueta',
-'view-pool-error' => "Lo siento, los sirvidores tan sobrecargaos nesti intre.
-Hai demasiaos usuarios intentando ver esta páxina.
-Espera un momentu enantes d'intentar acceder a esta páxina.
+'jumptosearch' => 'guetar',
+'view-pool-error' => 'Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.
+Hai demasiaos usuarios faciendo por ver esta páxina.
+Por favor espera un cachín enantes de volver intentar acceder a esta páxina.
 
-$1",
-'pool-timeout' => 'Tiempu escosáu esperando pol bloquéu',
-'pool-queuefull' => "La cola d'agrupación ta llena",
-'pool-errorunknown' => 'Error desconocíu',
+$1',
+'pool-timeout' => 'Tiempu escosáu esperando pal bloquéu',
+'pool-queuefull' => 'La cola de trabayu ta enllena',
+'pool-errorunknown' => 'Fallu desconocíu',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Tocante a {{SITENAME}}',
 'aboutpage' => 'Project:Tocante a',
-'copyright' => 'Esti conteníu ta disponible baxo los términos de la  $1.',
-'copyrightpage' => "{{ns:project}}:Derechos d'autor",
+'copyright' => 'El conteníu ta disponible baxo los términos de llicencia  $1.',
+'copyrightpage' => "{{ns:project}}:Drechos d'autor",
 'currentevents' => 'Actualidá',
 'currentevents-url' => 'Project:Actualidá',
 'disclaimers' => 'Avisu llegal',
-'disclaimerpage' => 'Project:Alvertencia xeneral',
+'disclaimerpage' => 'Project:Avisu xeneral',
 'edithelp' => "Ayuda d'edición",
-'edithelppage' => 'Help:Edición de páxines',
+'edithelppage' => 'Help:Cómo editar una páxina',
 'helppage' => 'Help:Conteníu',
 'mainpage' => 'Portada',
 'mainpage-description' => 'Portada',
@@ -310,29 +310,29 @@ $1",
 'privacy' => 'Politica de privacidá',
 'privacypage' => 'Project:Política de privacidá',
 
-'badaccess' => 'Error de permisos',
+'badaccess' => 'Fallu de permisos',
 'badaccess-group0' => "Nun tienes permisu pa executar l'aición solicitada.",
-'badaccess-groups' => "L'aición solicitada ta llimitada a usuarios {{PLURAL:$2|del grupu|d'ún de los grupos}}: $1.",
+'badaccess-groups' => "L'aición solicitada ta acutada pa usuarios {{PLURAL:$2|del grupu|d'ún d'estos grupos}}: $1.",
 
 'versionrequired' => 'Necesítase la versión $1 de MediaWiki',
 'versionrequiredtext' => 'Necesítase la versión $1 de MediaWiki pa usar esta páxina. Ver la [[Special:Version|páxina de versión]].',
 
 'ok' => 'Aceutar',
-'retrievedfrom' => 'Sacáu de "$1"',
+'retrievedfrom' => 'Sacáu de «$1»',
 'youhavenewmessages' => 'Tienes $1 ($2).',
 'newmessageslink' => 'mensaxes nuevos',
-'newmessagesdifflink' => 'últimu cambiu',
+'newmessagesdifflink' => 'cambéu postreru',
 'youhavenewmessagesmulti' => 'Tienes mensaxes nuevos en $1',
 'editsection' => 'editar',
 'editold' => 'editar',
 'viewsourceold' => 'ver fonte',
 'editlink' => 'editar',
-'viewsourcelink' => 'amosar la fonte',
+'viewsourcelink' => 'ver fonte',
 'editsectionhint' => 'Editar seición: $1',
-'toc' => 'Conteníu',
+'toc' => 'Índiz',
 'showtoc' => 'amosar',
 'hidetoc' => 'anubrir',
-'collapsible-collapse' => 'Esconder',
+'collapsible-collapse' => 'Plegar',
 'collapsible-expand' => 'Espander',
 'thisisdeleted' => '¿Ver o restaurar $1?',
 'viewdeleted' => '¿Ver $1?',
@@ -342,18 +342,18 @@ $1",
 'feed-unavailable' => 'Les canales de sindicación nun tán disponibles',
 'site-rss-feed' => 'Canal RSS $1',
 'site-atom-feed' => 'Canal Atom $1',
-'page-rss-feed' => 'Canal RSS "$1"',
-'page-atom-feed' => 'Canal Atom "$1"',
+'page-rss-feed' => 'Canal RSS «$1»',
+'page-atom-feed' => 'Canal Atom «$1»',
 'red-link-title' => '$1 (la páxina nun esiste)',
-'sort-descending' => 'Orde descendiente',
-'sort-ascending' => 'Orde ascendiente',
+'sort-descending' => 'Orde descendente',
+'sort-ascending' => 'Orde ascendente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Páxina',
 'nstab-user' => "Páxina d'usuariu",
-'nstab-media' => "Páxina d'archivu multimedia",
+'nstab-media' => 'Páxina de ficheru multimedia',
 'nstab-special' => 'Páxina especial',
-'nstab-project' => 'Páxina de proyeutu',
+'nstab-project' => 'Páxina del proyeutu',
 'nstab-image' => 'Ficheru',
 'nstab-mediawiki' => 'Mensaxe',
 'nstab-template' => 'Plantía',
@@ -368,266 +368,270 @@ Tamién podría ser un bug nel software usáu por {{SITENAME}}.",
 'nosuchspecialpage' => 'Nun esiste esa páxina especial',
 'nospecialpagetext' => '<strong>Pidisti una páxina especial non válida.</strong>
 
-Pues consultar la llista de les páxines especiales válides en [[Special:SpecialPages|{{int:specialpages}}]].',
+Pues atopar una llista de les páxines especiales válides en [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Error',
-'databaseerror' => 'Error na base de datos',
-'dberrortext' => 'Hebo un fallu de sintaxis nuna consulta de la base de datos.
+'error' => 'Fallu',
+'databaseerror' => 'Fallu na base de datos',
+'dberrortext' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
 Esti fallu puede ser por un problema del software.
-La postrer consulta que s\'intentó foi:
+La postrer consulta a la base de datos que s'intentó foi:
 <blockquote><tt>$1</tt></blockquote>
-dende la función "<tt>$2</tt>".
-La base datos dió el fallu "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Hebo un fallu de sintaxis nuna consulta a la base de datos.
-La postrer consulta que s\'intentó foi:
-"$1"
-dende la función "$2".
-La base de datos dió\'l fallu "$3: $4"',
-'laggedslavemode' => 'Avisu: Esta páxina pue que nun tenga actualizaciones recientes.',
+dende la función «<tt>$2</tt>».
+La base datos dio'l fallu «<tt>$3: $4</tt>».",
+'dberrortextcl' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
+La postrer consulta de la base de datos que s'intentó foi:
+«$1»
+dende la función «$2».
+La base de datos dio'l fallu «$3: $4».",
+'laggedslavemode' => "'''Avisu:''' Esta páxina pue que nun tenga actualizaciones recientes.",
 'readonly' => 'Base de datos candada',
-'enterlockreason' => 'Introduz un motivu pal candáu, amiestando una estimación de cuándo va ser llevantáu esti',
-'readonlytext' => "Nestos momentos la base de datos ta candada pa nueves entraes y otres modificaciones, seique por un mantenimientu de rutina, depués d'él tará accesible de nuevo.
+'enterlockreason' => 'Introduz un motivu pal candáu, amestando una estimación de cuándo va tener llugar el descandáu',
+'readonlytext' => "Nestos momentos la base de datos ta candada pa nueves entraes y otres modificaciones, seique por un mantenimientu de rutina, volviendo tar accesible cuando esti dea fin.
 
 L'alministrador que la candó conseñó esti motivu: $1",
-'missing-article' => "La base de datos nun alcontró'l testu d'una páxina que tendría d'haber alcontrao, nomada \"\$1\" \$2.
+'missing-article' => "La base de datos nun atopó'l testu d'una páxina qu'hubiera tener alcontrao, nomada «\$1» \$2.
 
-Esto débese davezu a siguir un diff caducáu o un enllaz d'historial a una páxina que se desanició.
+Esto débese davezu a siguir una \"dif\" caducada o un enllaz d'historial a una páxina que se desanició.
 
 Si esti nun ye'l casu, seique tengas atopao un bug nel software.
 Por favor informa d'esto a un [[Special:ListUsers/sysop|alministrador]], anotando la URL.",
-'missingarticle-rev' => '(revisión: $1)',
+'missingarticle-rev' => '(núm. revisión: $1)',
 'missingarticle-diff' => '(dif: $1, $2)',
-'readonly_lag' => 'La base de datos foi candada automáticamente mentes los sirvidores de la base de datos esclava se sincronicen cola maestra',
-'internalerror' => 'Error internu',
-'internalerror_info' => 'Error internu: $1',
-'fileappenderrorread' => 'Nun se pudo lleer "$1" mientres s\'amestaba.',
-'fileappenderror' => 'Nun se pudo amestar "$1" a "$2".',
-'filecopyerror' => 'Nun se pudo copiar el ficheru "$1" como "$2".',
-'filerenameerror' => 'Nun se pudo renomar l\'archivu "$1" como "$2".',
-'filedeleteerror' => 'Nun se pudo desaniciar el ficheru "$1".',
-'directorycreateerror' => 'Nun se pudo crear el direutoriu "$1".',
-'filenotfound' => 'Nun se pudo atopar el ficheru "$1".',
-'fileexistserror' => 'Nun se pue escribir nel archivu "$1": yá esiste',
-'unexpected' => 'Valor inesperáu: "$1"="$2".',
-'formerror' => 'Error: nun se pudo unviar el formulariu',
-'badarticleerror' => 'Esta aición nun pue facese nesta páxina',
-'cannotdelete' => 'Nun pudo desaniciase la páxina o el ficheru "$1".
-Seique daquién yá la desaniciara.',
-'cannotdelete-title' => 'Nun se pue desaniciar la páxina "$1"',
+'readonly_lag' => 'La base de datos candóse automáticamente mentes los sirvidores de la base de datos esclava se sincronicen cola maestra',
+'internalerror' => 'Fallu internu',
+'internalerror_info' => 'Fallu internu: $1',
+'fileappenderrorread' => "Nun se pudo lleer «$1» mentanto l'amestadura.",
+'fileappenderror' => 'Nun se pudo amestar «$1» a «$2».',
+'filecopyerror' => 'Nun se pudo copiar el ficheru «$1» como «$2».',
+'filerenameerror' => 'Nun se pudo renomar el ficheru «$1» como «$2».',
+'filedeleteerror' => 'Nun se pudo desaniciar el ficheru «$1».',
+'directorycreateerror' => 'Nun se pudo crear el direutoriu «$1».',
+'filenotfound' => 'Nun se pudo atopar el ficheru «$1».',
+'fileexistserror' => 'Nun se pue escribir nel archivu «$1»: yá esiste',
+'unexpected' => 'Valor inesperáu: «$1»=«$2».',
+'formerror' => 'Fallu: Nun se pudo unviar el formulariu.',
+'badarticleerror' => 'Esta aición nun pue facese nesta páxina.',
+'cannotdelete' => "Nun pudo desaniciase la páxina o'l ficheru «$1».
+Seique daquién yá lo desaniciara.",
+'cannotdelete-title' => 'Nun se pue desaniciar la páxina «$1»',
 'badtitle' => 'Títulu incorreutu',
-'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces inter-llingua o inter-wiki incorreutos.
-Pue contener ún o más caráuteres que nun se puen usar nos títulos.',
-'perfcached' => 'Los siguientes datos tán na caché, seique nun tean actualizaos dafechu. Hai un máximu de {{PLURAL:$1|$1 resultáu disponible|$1 resultaos disponibles}} na caché.',
-'perfcachedts' => "Los siguientes datos tán na caché, y s'anovaron la cabera vegada'l $1. Hai un máximu de {{PLURAL:$4|$4 resultáu disponible|$4 resultaos disponibles}} na caché.",
-'querypage-no-updates' => "Los anovamientos d'esta páxina anguaño tán desactivaos.
-Estos datos nun se refrescarán nestos momentos.",
+'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces interllingua o interwiki incorreutos.
+Pue contener ún o más carauteres que nun se puen usar nos títulos.',
+'perfcached' => "Los datos siguientes tán na caché y seique nun tean anovaos. Hai un máximu {{PLURAL:$1|d'un resultáu disponible|de $1 resultaos disponibles}} na caché.",
+'perfcachedts' => "Los datos siguientes tán na caché y anováronse per postrer vegada'l $1. Hai un máximu {{PLURAL:$4|d'un resultáu disponible|de $4 resultaos disponibles}} na caché.",
+'querypage-no-updates' => "Anguaño los anovamientos d'esta páxina tán desactivaos.
+Estos datos nun van refrescase nestos momentos.",
 'wrong_wfQuery_params' => 'Parámetros incorreutos pa wfQuery()<br />
 Función: $1<br />
 Consulta: $2',
-'viewsource' => 'Ver códigu fonte',
-'viewsource-title' => 'Ver la fonte de "$1"',
+'viewsource' => 'Ver fonte',
+'viewsource-title' => 'Ver la fonte de «$1»',
 'actionthrottled' => 'Aición llendada',
-'actionthrottledtext' => "Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.
-Por favor vuelve a tentalo dientro d'unos minutos.",
+'actionthrottledtext' => 'Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.
+Por favor vuelvi intentalo nunos minutos.',
 'protectedpagetext' => 'Esta páxina ta candada pa torgar la so edición.',
-'viewsourcetext' => "Pues ver y copiar el códigu fonte d'esta páxina:",
-'viewyourtext' => "Pues ver y copiar el códigu fonte de '''les tos ediciones''' d'esta páxina:",
-'protectedinterface' => "Esta páxina proporciona testu d'interfaz a l'aplicación y ta candada pa evitar el so abusu.",
-'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu de la interfaz a l'aplicación.
-Los cambeos nesta páxina afeutarán a l'apariencia de la interfaz pa otros usuarios.
+'viewsourcetext' => "Pues ver y copiar la fonte d'esta páxina:",
+'viewyourtext' => "Pues ver y copiar la fonte de '''les tos ediciones''' d'esta páxina:",
+'protectedinterface' => "Esta páxina proporciona testu d'interfaz de l'aplicación, y ta candada pa torgar abusos.",
+'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu d'interfaz de l'aplicación.
+Los cambeos nesta páxina van afeutar l'apariencia de la interfaz pa otros usuarios.
 Si quies facer traducciones, por favor usa [//translatewiki.net/wiki/Main_Page?setlang=ast translatewiki.net], el proyeutu de traducción de MediaWiki.",
-'sqlhidden' => '(consulta SQL escondida)',
-'cascadeprotected' => 'Esta páxina ta protexida d\'ediciones porque ta enxerta {{PLURAL:$1|na siguiente páxina|nes siguientes páxines}}, que {{PLURAL:$1|ta protexida|tán protexíes}} cola opción "en cascada":
-$2',
+'sqlhidden' => '(consulta SQL anubrida)',
+'cascadeprotected' => "Esta páxina ta protexida d'ediciones porque ta enxerta {{PLURAL:$1|na siguiente páxina|nes siguientes páxines}}, que {{PLURAL:$1|ta protexida|tán protexíes}} cola opción «en cascada» activada:
+$2",
 'namespaceprotected' => "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
 'customcssprotected' => "Nun tienes permisu pa editar esta páxina CSS porque contién preferencies personales d'otru usuariu.",
 'customjsprotected' => "Nun tienes permisu pa editar esta páxina de JavaScript porque contién preferencies personales d'otru usuariu.",
 'ns-specialprotected' => 'Les páxines especiales nun se puen editar.',
 'titleprotected' => "Esti títulu foi protexíu de la so creación por [[User:$1|$1]].
-El motivu conseñáu ye ''$2''.",
-'filereadonlyerror' => "Nun se pudo camudar el ficheru «$1» porque l'almacén de ficheros «$2» ta en mou de sólo llectura.
+El motivu conseñáu ye «''$2''».",
+'filereadonlyerror' => "Nun se pudo camudar el ficheru «$1» porque'l repositoriu de ficheros «$2» ta en mou de namái llectura.
 
-L'alministrador que lu bloquió dió esti motivu: «$3».",
+L'alministrador que lu bloquió dio esti motivu: «$3».",
 
 # Virus scanner
-'virus-badscanner' => "Error de configuración: escáner de virus desconocíu: ''$1''",
+'virus-badscanner' => "Fallu de configuración: Escáner de virus desconocíu: ''$1''",
 'virus-scanfailed' => "fallu d'escanéu (códigu $1)",
 'virus-unknownscanner' => 'antivirus desconocíu:',
 
 # Login and logout pages
-'logouttext' => "'''Yá tas desconectáu.'''
+'logouttext' => "'''Agora tas desconeutáu.'''
 
-Pues siguir usando {{SITENAME}} de forma anónima, o pues [[Special:UserLogin|volver entrar]] como'l mesmu o como otru usuariu.
-Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvieres coneutáu, hasta que llimpies la caché del navegador.",
-'welcomecreation' => "== Bienveníu, $1! ==
-Se creó la to cuenta.
+Pues siguir usando {{SITENAME}} de forma anónima, o pues [[Special:UserLogin|volver entrar]] como'l mesmu o como otru usuariu.
+Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvieres coneutáu, hasta que llimpies la caché del restolador.",
+'welcomecreation' => "== ¡Bienllegáu, $1! ==
+Creóse la to cuenta.
 Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
 'yourname' => "Nome d'usuariu:",
 'yourpassword' => 'Conseña:',
 'yourpasswordagain' => 'Escribi otra vuelta la to conseña:',
-'remembermypassword' => 'Recordar la mio identificación nesti ordenador (por un máximu de $1 {{PLURAL:$1|día|díes}})',
-'securelogin-stick-https' => "Siguir coneutáu al HTTPS dempués d'identificate",
+'remembermypassword' => "Recordar la mio identificación nesti restolador (un máximu {{PLURAL:$1|d'un día|de $1 díes}})",
+'securelogin-stick-https' => "Siguir coneutáu al HTTPS dempués d'identificase",
 'yourdomainname' => 'El to dominiu:',
-'externaldberror' => "O hebo un error de l'autenticación esterna de la base de datos o nun tienes permisu p'actualizar la to cuenta esterna.",
-'login' => 'Entrar',
-'nav-login-createaccount' => 'Entrar / Crear cuenta',
-'loginprompt' => "Has tener les ''cookies'' activaes pa entrar en {{SITENAME}}.",
-'userlogin' => 'Entrar / Crear cuenta',
-'userloginnocreate' => 'Entrar',
-'logout' => 'Colar',
-'userlogout' => 'Colar',
+'externaldberror' => "O hebo un fallu d'autenticación de la base de datos o nun tienes permisu p'anovar la to cuenta esterna.",
+'login' => 'Identificase',
+'nav-login-createaccount' => 'Identificase / crear una cuenta',
+'loginprompt' => 'Has tener les «cookies» activaes pa identificate en {{SITENAME}}.',
+'userlogin' => 'Identificase / crear una cuenta',
+'userloginnocreate' => 'Identificase',
+'logout' => 'Dexar de tar identificáu',
+'userlogout' => 'Dexar de tar identificáu',
 'notloggedin' => 'Non identificáu',
-'nologin' => "¿Nun tienes una cuenta? '''$1'''.",
-'nologinlink' => '¡Fai una!',
+'nologin' => '¿Nun tienes una cuenta? $1.',
+'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
-'gotaccount' => "¿Ya tienes una cuenta? '''$1'''.",
-'gotaccountlink' => 'Aniciar sesión',
-'userlogin-resetlink' => '¿Escaecisti la información de conexón?',
-'createaccountmail' => 'per e-mail',
+'gotaccount' => '¿Ya tienes una cuenta? $1.',
+'gotaccountlink' => 'Identificase',
+'userlogin-resetlink' => "¿Escaecisti los datos d'identificación?",
+'createaccountmail' => 'Per corréu electrónicu',
 'createaccountreason' => 'Motivu:',
 'badretype' => "Les claves qu'escribisti nun concuayen.",
 'userexists' => "El nome d'usuariu conseñáu yá ta usándose.
 Por favor escueyi un nome diferente.",
-'loginerror' => "Error d'identificación",
+'loginerror' => "Fallu d'identificación",
 'createaccounterror' => 'Nun se pudo crear la cuenta: $1',
 'nocookiesnew' => "La cuenta d'usuariu ta creada, pero nun tas identificáu.
-{{SITENAME}} usa cookies pa identificar a los usuarios.
-Tienes les cookies desactivaes.
-Por favor activales y depués entra col to nuevu nome d'usuariu y conseña.",
-'nocookieslogin' => '{{SITENAME}} usa cookies pa identificar a los usuarios. Tienes les cookies deshabilitaes. Por favor actívales y inténtalo otra vuelta.',
-'nocookiesfornew' => "La cuenta nun se creó, porque nun pudimos confirmar l'orixe.
-Asegúrate de tener activaes les cookies, recarga esta páxina y vuelve a tentalo.",
-'noname' => "Nun punxisti un nome d'usuariu válidu.",
+{{SITENAME}} usa «cookies» pa identificar a los usuarios.
+Tienes les «cookies» desactivaes.
+Por favor activales y depués entra col to nome d'usuariu y conseña nuevos.",
+'nocookieslogin' => '{{SITENAME}} usa «cookies» pa identificar a los usuarios.
+Tienes les «cookies» desactivaes.
+Por favor actívales y vuelvi intentalo.',
+'nocookiesfornew' => "La cuenta nun se creó porque nun pudimos confirmar l'orixe.
+Asegúrate de tener activaes les «cookies», recarga esta páxina y vuelvi intentalo.",
+'noname' => "Nun conseñasti un nome d'usuariu válidu.",
 'loginsuccesstitle' => 'Identificación correuta',
-'loginsuccess' => "'''Quedasti identificáu en {{SITENAME}} como \"\$1\".'''",
-'nosuchuser' => 'Nun hai usuariu dalu col nome "$1".
-Los nomes d\'usuariu distinguen mayúscules y minúscules.
-Comprueba la ortografía o [[Special:UserLogin/signup|crea una cuenta d\'usuariu nueva]].',
-'nosuchusershort' => 'Nun hai nengún usuariu col nome "$1".
+'loginsuccess' => "'''Quedasti identificáu en {{SITENAME}} como «$1».'''",
+'nosuchuser' => "Nun hai nengún usuariu col nome «$1».
+Los nomes d'usuariu distinguen mayúscules y minúscules.
+Mira que tea bien escritu o [[Special:UserLogin/signup|crea una cuenta nueva]].",
+'nosuchusershort' => 'Nun hai nengún usuariu col nome «$1».
 Mira que tea bien escritu.',
 'nouserspecified' => "Has especificar un nome d'usuariu.",
-'login-userblocked' => 'Esti usuariu ta bloquiáu. Nun se permite la conexón.',
+'login-userblocked' => 'Esti usuariu ta bloquiáu. Nun se permite la so identificación.',
 'wrongpassword' => 'La conseña escrita ye incorreuta.
-Vuelvi intentalo.',
+Vuelvi intentalo.',
 'wrongpasswordempty' => 'La conseña taba en blanco.
-Vuelvi intentalo.',
-'passwordtooshort' => 'Les contraseñes han de tener a lo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.',
-'password-name-match' => "La conseña tien de ser distinta del nome d'usuariu.",
+Vuelvi intentalo.',
+'passwordtooshort' => 'Les contraseñes han tener a lo menos {{PLURAL:$1|1 caráuter|$1 carauteres}}.',
+'password-name-match' => "La conseña ha ser distinta del nome d'usuariu.",
 'password-login-forbidden' => "Ta torgao usar esti nome d'usuariu y conseña.",
 'mailmypassword' => 'Unviar la conseña nueva per corréu',
 'passwordremindertitle' => 'Nueva conseña provisional pa {{SITENAME}}',
-'passwordremindertext' => 'Daquién (seique tu, dende la direición IP $1) solicitó una conseña
-nueva pa {{SITENAME}} ($4). Se creó una conseña temporal pal usuariu
-"$2" que ye "$3". Si fuisti tu, necesites identificate y escoyer
-una conseña nueva agora. La conseña temporal caducará {{PLURAL:$5|nun día|en $5 díes}}.
+'passwordremindertext' => "Daquién (seique tu, dende la direición IP $1) solicitó una conseña
+nueva pa {{SITENAME}} ($4). Creóse una conseña provisional pal usuariu
+«$2» que ye «$3». Si fuisti tu, necesites identificate y escoyer
+una conseña nueva agora. La conseña provisional caduca {{PLURAL:$5|nun día|en $5 díes}}.
 
 Si esta solicitú la fizo otra persona, o si recuerdes la conseña y
-nun quies volver a camudala, pues escaecete d\'esti mensaxe y siguir
-usando la conseña antigua.',
-'noemail' => 'L\'usuariu "$1" nun tien puesta direición de corréu.',
-'noemailcreate' => 'Tienes de conseñar una direición de corréu válida',
-'passwordsent' => 'S\'unvió una conseña nueva a la direición de corréu rexistrada pa "$1".
-Por favor vuelve a coneutate depués de recibila.',
-'blocked-mailpassword' => 'La edición dende la to direición IP ta bloquiada, y poro nun se pue usar la función de recuperación de conseña pa evitar abusos.',
-'eauthentsent' => "S'unvió un corréu electrónicu de confirmación a la direición indicada.
-Enantes de que s'unvie nengún otru corréu a la cuenta, has siguir les instrucciones del corréu electrónicu, pa confirmar que la cuenta ye de to.",
-'throttled-mailpassword' => "Yá s'unvió un recordatoriu de la conseña {{PLURAL:$1|na cabera hora|nes caberes $1 hores}}.
+nun quies volver camudala, pues escaecete d'esti mensaxe y siguir
+usando la conseña antigua.",
+'noemail' => "L'usuariu «$1» nun tien rexistrada nenguna direición de corréu.",
+'noemailcreate' => 'Has conseñar una direición de corréu válida',
+'passwordsent' => 'Univóse una conseña nueva a la direición de corréu rexistrada pa «$1».
+Por favor vuelvi identificate depués de recibila.',
+'blocked-mailpassword' => 'Ta bloquiada la edición dende la to direición IP, polo que pa evitar abusos nun se pue usar la función de recuperación de conseña.',
+'eauthentsent' => "Unvióse un corréu electrónicu de confirmación a la direición indicada.
+Enantes de que s'unvie nengún otru corréu a la cuenta, has siguir les instrucciones del corréu electrónicu pa confirmar que la cuenta ye de to.",
+'throttled-mailpassword' => "Yá s'unvió un recordatoriu de la conseña {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
 Pa evitar abusos, namái s'unviará un recordatoriu cada {{PLURAL:$1|hora|$1 hores}}.",
-'mailerror' => 'Error al unviar el corréu: $1',
+'mailerror' => 'Fallu al unviar el corréu: $1',
 'acct_creation_throttle_hit' => "Los visitantes d'esta wiki qu'usen la to direición IP yá crearon güei {{PLURAL:$1|1 cuenta|$1 cuentes}}, que ye'l máximu almitíu nesti periodu de tiempu.
 Poro, los visitantes qu'usen esta direición IP nun puen crear más cuentes de momentu.",
-'emailauthenticated' => "La to direición de corréu se confirmó'l $2 a les $3.",
-'emailnotauthenticated' => "La to direición de corréu nun se comprobó entá.
-Nun s'unviará corréu de denguna de les funciones siguientes.",
-'noemailprefs' => 'Conseña una direición de corréu nes tos preferencies pa que funcionen eses carauterístiques.',
-'emailconfirmlink' => 'Confirmar la direición de corréu',
-'invalidemailaddress' => "La direición de corréu nun se pue aceutar yá que paez tener un formatu non válidu.
-Por favor escribi una direición con formatu afayadizu o dexa vaciu'l campu.",
-'cannotchangeemail' => 'Les direiciones de corréu de la cuenta nun puen camudase nesta wiki.',
+'emailauthenticated' => "La to direición de corréu electrónicu confirmóse'l $2 a les $3.",
+'emailnotauthenticated' => 'La to direición de corréu electrónicu nun se comprobó entá.
+Nun va unviase nengún corréu pa nenguna de les funciones siguientes.',
+'noemailprefs' => 'Conseña una direición de corréu electrónicu nes tos preferencies pa que funcionen eses carauterístiques.',
+'emailconfirmlink' => 'Confirmar la direición de corréu electrónicu',
+'invalidemailaddress' => "La direición de corréu electrónicu nun se pue aceutar yá que paez tener un formatu non válidu.
+Por favor conseña una direición con formatu afayadizu o dexa baleru'l campu.",
+'cannotchangeemail' => 'Les direiciones de corréu electrónicu de la cuenta nun puen camudase nesta wiki.',
 'emaildisabled' => 'Esti sitiu nun pue unviar correos electrónicos.',
 'accountcreated' => 'Cuenta creada',
-'accountcreatedtext' => "La cuenta d'usuariu de $1 ta creada.",
+'accountcreatedtext' => "Creóse la cuenta d'usuariu de $1.",
 'createaccount-title' => 'Creación de cuenta pa {{SITENAME}}',
-'createaccount-text' => 'Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) nomada "$2", asociada a la conseña "$3".
-Tendríes d\'entrar y camudar la conseña agora.
+'createaccount-text' => 'Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) col nome «$2», asociada a la conseña «$3».
+Habríes identificte y camudar la conseña agora.
 
 Pues escaecer esti mensaxe si esta cuenta se creó por error.',
-'usernamehasherror' => "El nome d'usuariu nun pue contener caráuteres hash",
-'login-throttled' => "Ficisti demasiaos intentos recientes de conexón.
+'usernamehasherror' => "El nome d'usuariu nun pue contener carauteres «hash»",
+'login-throttled' => "Ficisti demasiaos intentos recientes d'identificación.
 Por favor espera enantes d'intentalo otra vuelta.",
 'login-abort-generic' => 'Falló la to identificación - Encaboxao',
 'loginlanguagelabel' => 'Llingua: $1',
-'suspicious-userlogout' => "Se negó la petición de desconexón porque paez que vien d'un restolador frañáu o d'un proxy de caché.",
+'suspicious-userlogout' => "Negósete'l pidimientu de desconexón porque paez que vien d'un restolador frañíu o d'un proxy de caché.",
 
 # E-mail sending
-'php-mail-error-unknown' => 'Error desconocíu na función mail() de PHP',
-'user-mail-no-addy' => 'Tentasti unviar un corréu ensin direición de corréu electrónicu.',
+'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
+'user-mail-no-addy' => 'Intentasti unviar un corréu electrónicu ensin direición.',
 
 # Change password dialog
 'resetpass' => 'Camudar la conseña',
-'resetpass_announce' => "Entrasti con una conseña provisional unviada per corréu.
-P'acabar d'identificate, tienes d'escribir equí una conseña nueva:",
+'resetpass_announce' => "Identificástite con una conseña provisional unviada per corréu electrónicu.
+P'acabar d'identificate, has conseñar equí una conseña nueva:",
 'resetpass_text' => '<!-- Amestar testu equí -->',
 'resetpass_header' => 'Camudar la conseña de la cuenta',
 'oldpassword' => 'Conseña antigua:',
 'newpassword' => 'Conseña nueva:',
-'retypenew' => 'Escribi otra vuelta la nueva conseña:',
-'resetpass_submit' => 'Definir una conseña y entrar',
-'resetpass_success' => '¡La to conseña se camudó correutamente!
-Coneutando dafechu...',
+'retypenew' => 'Escribi otra vuelta la conseña nueva:',
+'resetpass_submit' => 'Conseñar una conseña y identificase',
+'resetpass_success' => '¡Camudóse correutamente la to conseña!
+Pasando a identificate...',
 'resetpass_forbidden' => 'Les claves nun se puen camudar',
 'resetpass-no-info' => "Has tar identificáu p'acceder direutamente a esta páxina.",
 'resetpass-submit-loggedin' => 'Camudar la conseña',
 'resetpass-submit-cancel' => 'Encaboxar',
-'resetpass-wrong-oldpass' => 'La conseña temporal o actual nun ye válida.
-Seique yá camudasti correutamente la conseña o que pidieras una nueva conseña temporal.',
-'resetpass-temp-password' => 'Conseña temporal:',
+'resetpass-wrong-oldpass' => 'Conseña provisional o actual non válida.
+Seique yá camudaras correutamente la conseña o que pidieras una nueva conseña provisional.',
+'resetpass-temp-password' => 'Conseña provisional:',
 
 # Special:PasswordReset
 'passwordreset' => 'Reaniciar conseña',
-'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu que te recuerde los detalles de la to cuenta.',
+'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu electrónicu que te recuerde los detalles de la to cuenta.',
 'passwordreset-legend' => 'Reaniciar conseña',
-'passwordreset-disabled' => 'Los reanicios de conseña tan desactivaos nesta wiki.',
-'passwordreset-pretext' => "{{PLURAL:$1||Escribi una de les partes de los datos d'abaxo}}",
+'passwordreset-disabled' => 'Los reanicios de conseña tán desactivaos nesta wiki.',
+'passwordreset-pretext' => "{{PLURAL:$1||Escribi ún de los elementos de los datos d'abaxo}}",
 'passwordreset-username' => "Nome d'usuariu:",
 'passwordreset-domain' => 'Dominiu:',
-'passwordreset-capture' => '¿Ver el mensaxe de corréu resultante?',
-'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola conseña temporal) de la que s'unvia al usuariu.",
+'passwordreset-capture' => '¿Ver el corréu electrónicu resultante?',
+'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola conseña provisional) amás d'unvialu al usuariu.",
 'passwordreset-email' => 'Direición de corréu electrónicu:',
 'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Dalguién (seique tu, dende la direición IP $1) pidió un recordatoriu cola
-información de la to cuenta de {{SITENAME}} ($4).
-{{PLURAL:$3|La siguiente cuenta d'usuariu ta asociada|Les siguientes cuentes d'usuariu tan asociaes}} con esta direición de corréu:
+'passwordreset-emailtext-ip' => "Daquién (seique tu, dende la direición IP $1)solicitó un recordatoriu de los
+detalles de la to cuenta de {{SITENAME}} ($4).
+{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
+a esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta conseña temporal caducará|Estes conseñes temporales caducarán}} {{PLURAL:$5|nún día|en $5 díes}}.
-Tendríes d'entrar al sistema y escoyer una conseña nueva agora. Si esta
-solicitú ye d'otru o recordasti la conseña orixinal y nun quies camudala,
-escaez esti mensaxe y sigui emplegando la conseña antigua.",
-'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} pidió un recordatoriu cola información de la to cuenta de {{SITENAME}} ($4).
-{{PLURAL:$3|La siguiente cuenta d'usuariu ta asociada|Les siguientes cuentes d'usuariu tan asociaes}} con esta direición de corréu:
+{{PLURAL:$3|Esta conseña provisional caduca|Estes conseñes provisionales caduquen}} {{PLURAL:$5|nún día|en $5 díes}}.
+Habríes identificate y escoyer una conseña nueva agora. Si esta solicitú la fizo otra persona,
+o si recordasti la conseña orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir
+usando la to conseña antigua.",
+'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un recordatoriu de los detalles de la to cuenta de {{SITENAME}} ($4).
+{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
+a esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta conseña temporal caducará|Estes conseñes temporales caducarán}} {{PLURAL:$5|nun día|en $5 díes}}.
-Tendríes d'entrar al sistema y escoyer una conseña nueva agora. Si esta
-solicitú ye d'otru o recordasti la conseña orixinal y nun quies camudala,
-escaez esti mensaxe y sigui emplegando la conseña antigua.",
+{{PLURAL:$3|Esta conseña provisional caduca|Estes conseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Habríes identificate y escoyer una conseña nueva agora. Si esta solicitú la fizo otra persona, o si
+recordasti la conseña orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir usando
+la to conseña antigua.",
 'passwordreset-emailelement' => "Nome d'usuariu: $1
-Conseña temporal: $2",
-'passwordreset-emailsent' => "S'unvió un corréu de recordatoriu.",
-'passwordreset-emailsent-capture' => "S'unvió un corréu de recordatoriu, que s'amuesa abaxo.",
-'passwordreset-emailerror-capture' => "Se xeneró un corréu de recordatoriu, que s'amuesa abaxo; pero falló unvialu al usuariu: $1",
+Conseña provisional: $2",
+'passwordreset-emailsent' => 'Unvióse un corréu electrónicu de recordatoriu.',
+'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu de recordatoriu, que s'amuesa abaxo.",
+'passwordreset-emailerror-capture' => "Xeneróse un corréu electrónicu de recordatoriu, que s'amuesa abaxo, pero falló'l so unviu al usuariu: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Camudar la direición de corréu electrónicu',
 'changeemail-header' => 'Camudar la direición de corréu electrónicu de la cuenta',
-'changeemail-text' => "Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Tendrás d'escribir la to conseña pa confirmar esti cambiu.",
+'changeemail-text' => 'Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Habrás escribir la to conseña pa confirmar esti cambéu.',
 'changeemail-no-info' => "Has tar identificáu p'acceder direutamente a esta páxina.",
 'changeemail-oldemail' => 'Direición de corréu electrónicu actual:',
-'changeemail-newemail' => 'Nueva direición de corréu electrónicu:',
+'changeemail-newemail' => 'Direición de corréu electrónicu nueva:',
 'changeemail-none' => '(nengún)',
 'changeemail-submit' => 'Camudar el corréu electrónicu',
 'changeemail-cancel' => 'Encaboxar',
@@ -640,117 +644,128 @@ Conseña temporal: $2",
 'link_sample' => 'Títulu del enllaz',
 'link_tip' => 'Enllaz internu',
 'extlink_sample' => 'http://www.example.com títulu del enllaz',
-'extlink_tip' => "Enllaz esternu (recuerda'l prefixu http://)",
+'extlink_tip' => 'Enllaz esternu (alcuérdate del prefixu http://)',
 'headline_sample' => 'Testu de cabecera',
 'headline_tip' => 'Cabecera de nivel 2',
 'nowiki_sample' => 'Pon equí testu ensin formatu',
-'nowiki_tip' => 'Saltar el formatu wiki',
+'nowiki_tip' => 'Inorar el formatu wiki',
 'image_sample' => 'Exemplu.jpg',
 'image_tip' => 'Ficheru incrustáu',
 'media_sample' => 'Exemplu.ogg',
-'media_tip' => 'Enllaz al ficheru',
+'media_tip' => 'Enllaz del ficheru',
 'sig_tip' => 'La to robla con data y hora',
 'hr_tip' => 'Llinia horizontal (úsala con moderación)',
 
 # Edit pages
 'summary' => 'Resume:',
-'subject' => 'Asuntu/títulu:',
+'subject' => 'Asuntu/cabecera:',
 'minoredit' => 'Esta ye una edición menor',
 'watchthis' => 'Vixilar esta páxina',
-'savearticle' => 'Grabar páxina',
-'preview' => 'Vista previa',
+'savearticle' => 'Guardar la páxina',
+'preview' => 'Previsualización',
 'showpreview' => 'Amosar previsualización',
 'showlivepreview' => 'Vista rápida',
-'showdiff' => 'Amosar cambios',
+'showdiff' => 'Amosar cambeos',
 'anoneditwarning' => "'''Avisu:''' Nun tas identificáu.
-La to direición IP se grabará nel historial d'edición d'esta páxina.",
-'anonpreviewwarning' => "''Nun tas identificáu. Al guardar se rexistrará la to direición IP nel historial d'edición d'esta páxina.''",
-'missingsummary' => "'''Recordatoriu:''' Nun escribisti un resume d'edición.
-Si vuelves a calcar en \"{{int:savearticle}}\", la to edición se guardará ensin nengún resume.",
+La to direición IP va quedar grabada nel historial d'edición d'esta páxina.",
+'anonpreviewwarning' => "''Nun tas identificáu. Al guardar va queda rexistrada la to direición IP nel historial d'edición d'esta páxina.''",
+'missingsummary' => "'''Recordatoriu:''' Nun conseñasti un resume d'edición.
+Si vuelves calcar en \"{{int:savearticle}}\", la to edición va guardase ensin nengún resume.",
 'missingcommenttext' => 'Por favor, escribi un comentariu embaxo.',
-'missingcommentheader' => "'''Recordatoriu:''' Nun-y punxisti tema/títulu a esti comentariu.
-Si vuelves a calcar en \"{{int:savearticle}}\", la to edición va grabase ensin él.",
+'missingcommentheader' => "'''Recordatoriu:''' Nun-y conseñasti asuntu/cabecera a esti comentariu.
+Si vuelves calcar en \"{{int:savearticle}}\", la to edición va guardase ensin nengún comentariu.",
 'summary-preview' => 'Previsualización del resume:',
-'subject-preview' => 'Previsualización del tema/títulu:',
+'subject-preview' => 'Previsualización del asuntu/cabecera:',
 'blockedtitle' => "L'usuariu ta bloquiáu",
-'blockedtext' => "'''El to nome d'usuariu o la to direición IP foi bloquiáu.'''
+'blockedtext' => "'''Bloquióse'l to nome d'usuariu o la to direición IP.'''
 
 El bloquéu féxolu $1.
 El motivu conseñáu ye ''$2''.
 
 * Entamu del bloquéu: $8
 * Caducidá del bloquéu: $6
-* Usuariu que se quier bloquiar: $7
+* Usuariu a bloquiar: $7
 
-Pues ponete en contautu con $1 o con cualesquier otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] pa discutir el bloquéu.
-Nun pues usar la funcionalidá 'manda-y un email a esti usuariu' a nun ser que tea especificada una direición de corréu válida
-na to [[Special:Preferences|páxina de preferencies]] y que nun te tengan bloquiao el so usu.
+Pues ponete en contautu con $1 o con cualesquier otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.
+Nun pues usar la funcionalidá 'manda-y un corréu electrónicu a esti usuariu' a nun ser que tea especificada una direición de
+corréu electrónicu válida na to [[Special:Preferences|páxina de preferencies]] y que nun te tengan bloquiao'l so usu.
 La to direición IP actual ye $3, y el númberu d'identificación del bloquéu ye $5.
-Por favor, amiesta dalgún o dambos d'estos datos nes tos consultes.",
-'autoblockedtext' => 'La to direición IP foi bloquiada automáticamente porque foi usada por otru usuariu que foi bloquiáu por $1.
-El motivu conseñáu foi esti:
+Por favor, amiesta tolos detalles nes consultes que faigas.",
+'autoblockedtext' => 'Bloquióse automáticamente la to direición IP porque la usó otru usuariu que foi bloquiáu por $1.
+El motivu conseñáu ye:
 
 :\'\'$2\'\'
 
 * Entamu del bloquéu: $8
 * Caducidá del bloquéu: $6
-* Usuariu que se quier bloquiar: $7
+* Usuariu a bloquiar: $7
 
 Pues ponete en contautu con $1 o con cualesquier otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p\'aldericar sobre\'l bloquéu.
 
-Fíxate en que nun pues usar la funcionalidá d\'"unvia-y un corréu a esti usuariu" a nun se que tengas una direición de corréu válida rexistrada na to [[Special:Preferences|páxina de preferencies]] y que nun teas bloquiáu pa usala.
+Fíxate en que nun pues usar la funcionalidá "manda-y un corréu electrónicu a esti usuariu" a nun se que tea rexistrada una direición de corréu electrónicu válida na to [[Special:Preferences|páxina de preferencies]] y que nun te tengan bloquiao\'l so usu.
+
+La to direición IP actual ye $3, y el númberu d\'identificación del bloquéu ye $5.
+Por favor, amiesta tolos detalles nes consultes que faigas.
 
 La to direición IP actual ye $3, y el númberu d\'identificación del bloquéu ye $5.
-Por favor, amiesta toos estos detalles nes consultes que faigas.',
+Por favor, amiesta tolos detalles nes consultes que faigas.',
 'blockednoreason' => 'nun se dio nengún motivu',
-'whitelistedittext' => 'Tienes que $1 pa editar páxines.',
-'confirmedittext' => "Has confirmar la to direición de corréu electrónicu enantes d'editar páxines. Por favor, configúrala y valídala nes tos [[Special:Preferences|preferencies d'usuariu]].",
-'nosuchsectiontitle' => 'Nun se pue alcontrar la seición',
+'whitelistedittext' => 'Has $1 pa editar páxines.',
+'confirmedittext' => "Has confirmar la to direición de corréu electrónicu enantes d'editar páxines.
+Por favor, defínila y valídala nes tos [[Special:Preferences|preferencies d'usuariu]].",
+'nosuchsectiontitle' => 'Nun se pue atopar la seición',
 'nosuchsectiontext' => 'Intentasti editar una seición que nun esiste.
-Seique se treslladara o desaniciara mientres visitabes la páxina.',
-'loginreqtitle' => 'Identificación Requerida',
-'loginreqlink' => 'identificase',
+Seique se treslladara o desaniciara mientres víes la páxina.',
+'loginreqtitle' => 'Necesítase identificación',
+'loginreqlink' => 'identificate',
 'loginreqpagetext' => 'Has $1 pa ver otres páxines.',
 'accmailtitle' => 'Conseña unviada.',
-'accmailtext' => "Unvióse a $2 una conseña xenerada al debalu pa [[User talk:$1|$1]].
+'accmailtext' => "Unvióse a $2 una conseña xenerada al debalu pal usuariu [[User talk:$1|$1]].
 
 La conseña d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|camudar conseña]]'' depués d'identificate.",
 'newarticle' => '(Nuevu)',
 'newarticletext' => "Siguisti un enllaz a un artículu qu'inda nun esiste.
-Pa crear la páxina, empecipia a escribir nel cuadru que vien darréu (mira la [[{{MediaWiki:Helppage}}|páxina d'ayuda]] pa más información).
-Si llegasti equí por enquivocu, calca nel botón '''atrás''' del to navegador.",
-'anontalkpagetext' => "----''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa. Pola mor d'ello ha usase la direición numérica IP pa identificalu/la. Tala IP pue ser compartida por varios usuarios. Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|rexístrate]] pa evitar futures confusiones con otros usuarios anónimos.''",
-'noarticletext' => 'Anguaño nun hai testu nesta páxina.
-Pues [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n\'otres páxines,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],
-o [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar ésta equí]</span>.',
-'noarticletext-nopermission' => 'Anguaño nun hai testu nesta páxina.
-Pues [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n\'otres páxines,
-o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>.',
-'userpage-userdoesnotexist' => 'La cuenta d\'usuariu "<nowiki>$1</nowiki>" nun ta rexistrada. Por favor asegúrate de que quies crear/editar esta páxina.',
-'userpage-userdoesnotexist-view' => 'La cuenta d\'usuariu "$1" nun ta rexistrada.',
-'blocked-notice-logextract' => "Esti usuariu anguaño ta bloquiáu.
-La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
-'clearyourcache' => "'''Nota:''' Llueu de salvar, seique tengas que llimpiar la caché del navegador pa ver los cambios.
-*'''Firefox / Safari:''' Caltién ''Mayús'' mentanto calques en ''Recargar'', o calca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' nún Mac)
-* '''Google Chrome:''' Calca ''Ctrl-Mayús-R'' (''⌘-Mayús-R'' nún Mac)
-* '''Internet Explorer:''' Caltién ''Ctrl'' mentanto calques ''Refrescar'', o calca ''Ctrl-F5''
-* '''Konqueror:''' Calca nel botón ''Recargar'', o calca ''F5''
-* '''Opera:''' Desanicia la caché en ''Ferramientes→Preferencies''",
-'usercssyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to nuevu CSS enantes de guardalu.",
-'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to nuevu JavaScript enantes de guardalu.",
+Pa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [[{{MediaWiki:Helppage}}|páxina d'ayuda]] pa más información).
+Si llegasti equí por enquivocu, calca nel botón '''atrás''' del to restolador.",
+'anontalkpagetext' => "----''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.
+Pola mor d'ello ha usase la direición numbérica IP pa identificalu/la.
+Tala IP pue ser compartida por varios usuarios.
+Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.''",
+'noarticletext' => 'Nestos momentos nun hai testu nesta páxina.
+Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos],
+o [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta páxina equí]</span>.',
+'noarticletext-nopermission' => 'Nestos momentos nun hai testu nesta páxina.
+Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
+o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos]</span>.',
+'userpage-userdoesnotexist' => "La cuenta d'usuariu «$1» nun ta rexistrada.
+Por favor comprueba si quies crear/editar esta páxina.",
+'userpage-userdoesnotexist-view' => "La cuenta d'usuariu «$1» nun ta rexistrada.",
+'blocked-notice-logextract' => 'Nestos momentos esti usuariu ta bloquiáu.
+La postrer entrada del rexistru de bloqueos úfrese darréu pa referencia:',
+'clearyourcache' => "'''Nota:''' Llueu de guardar, seique tengas que llimpiar la caché del restolador pa ver los cambeos.
+*'''Firefox / Safari:''' Caltén ''Mayús'' mentes calques en ''Recargar'', o calca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' nun Mac)
+* '''Google Chrome:''' Calca ''Ctrl-Mayús-R'' (''⌘-Mayús-R'' nun Mac)
+* '''Internet Explorer:''' Caltén ''Ctrl'' mentes calques ''Refrescar'', o calca ''Ctrl-F5''
+* '''Konqueror:''' Calca en ''Recargar'', o calca ''F5''
+* '''Opera:''' llimpia la caché en ''Ferramientes → Preferencies''",
+'usercssyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to CSS nuevu enantes de guardalu.",
+'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to JavaScript nuevu enantes de guardalu.",
 'usercsspreview' => "'''Recuerda que namái tas previsualizando'l to CSS d'usuariu.'''
 '''¡Tovía nun ta guardáu!'''",
-'userjspreview' => "'''¡Recuerda que namái tas probando/previsualizando'l to JavaScript d'usuariu, entá nun se grabó!'''",
+'userjspreview' => "'''¡Recuerda que namái tas probando/previsualizando'l to JavaScript d'usuariu.'''
+'''¡Tovía nun ta guardáu!'''",
 'sitecsspreview' => "'''Recuerda que namái tas previsualizando esti CSS.'''
 '''¡Tovía nun ta guardáu!'''",
-'sitejspreview' => "'''¡Recuerda que namái tas probando esti códigu JavaScript'''
+'sitejspreview' => "'''¡Recuerda que namái tas probando esti códigu JavaScript.'''
 '''¡Tovía nun tá guardáu!'''",
-'userinvalidcssjstitle' => "'''Avisu:''' Nun hai piel \"\$1\". Recuerda que les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
+'userinvalidcssjstitle' => "'''Avisu:''' Nun hai apariencia «$1».
+Les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Actualizao)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Alcuerdate de qu'esto ye sólo una vista previa.'''
-¡Los cambios entá nun se guardaron! [[#editform|→ Siguir editando]]",
+¡Los cambios entá nun se guardaron!",
+'continue-editing' => 'Siguir editando',
 'previewconflict' => "Esta vista previa amuesa'l testu del área d'edición d'arriba tal como apaecerá si escueyes guardar.",
 'session_fail_preview' => "'''¡Sentímoslo muncho! Nun se pudo procesar la to edición porque hebo una perda de datos de la sesión.
 Inténtalo otra vuelta. Si nun se t'arregla, intenta salir y volver a rexistrate.'''",
@@ -844,6 +859,10 @@ Estos parámetros s'omitieron.",
 'parser-template-loop-warning' => 'Hai una rueda de plantíes: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Se pasó la llende de fondura recursiva de les plantíes ($1)',
 'language-converter-depth-warning' => 'Se pasó la llende de fondura del convertidor de llingües ($1)',
+'node-count-exceeded-category' => 'Páxines onde se pasó la cuenta de nodios',
+'node-count-exceeded-warning' => 'La páxina pasó la cuenta de nodios',
+'expansion-depth-exceeded-category' => "Páxines onde se pasó la fondura d'espansión",
+'expansion-depth-exceeded-warning' => "La páxina pasó la fondura d'espansión",
 
 # "Undo" feature
 'undo-success' => "La edición se pue esfacer.
@@ -988,8 +1007,8 @@ Comprueba los rexistros, por favor.",
 
 # Suppression log
 'suppressionlog' => 'Rexistru de supresiones',
-'suppressionlogtext' => "Embaxo hai una llista de desanicios y bloqueos rellacionaos con conteníu anubríu a los alministradores.
-Mira la [[Special:BlockList|llista de bloqueos d'IP]] pa ver la llista de los bloqueos y torgues activos anguaño.",
+'suppressionlogtext' => 'Más abaxo hai una llista de desanicios y bloqueos rellacionaos con conteníu anubríu a los alministradores.
+Mira la [[Special:BlockList|llista de bloqueos]] pa ver la llista de los bloqueos y torgues activos anguaño.',
 
 # History merging
 'mergehistory' => 'Fusionar historiales de páxina',
@@ -1938,6 +1957,11 @@ Pues filtrar la visualización seleicionando una mena de rexistru, el nome d'usu
 'allpages-bad-ns' => '{{SITENAME}} nun tien l\'espaciu de nomes "$1".',
 'allpages-hide-redirects' => 'Anubrir redireiciones',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Tas viendo una versión en caché d'esta páxina, que pue llegar a tener $1 d'antigüedá.",
+'cachedspecial-viewing-cached-ts' => "Tas viendo una versión en caché d'esta páxina, que pue nun tar anovada dafechu.",
+'cachedspecial-refresh-now' => 'Ver la más nueva.',
+
 # Special:Categories
 'categories' => 'Categoríes',
 'categoriespagetext' => "{{PLURAL:$1|La categoría darréu contién|Les categoríes darréu contienen}} páxines o ficheros multimedia.
@@ -2380,8 +2404,8 @@ Esto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWik
 'ipb-confirm' => 'Confirmar bloquéu',
 'badipaddress' => 'IP non válida',
 'blockipsuccesssub' => 'Bloquéu fechu correctamente',
-'blockipsuccesstext' => "Bloquióse al usuariu [[Special:Contributions/$1|$1]].
-<br />Mira na [[Special:BlockList|llista d'IPs bloquiaes]] pa revisar los bloqueos.",
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ta {{GENDER:$1|bloquiáu|bloquiada}}.<br />
+Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'ipb-blockingself' => '¡Tas a piques de bloquiate tú mesmu! ¿Tas seguru de que quies facer eso?',
 'ipb-confirmhideuser' => 'Tas a piques de bloquiar un usuariu con "anubrir usuariu" activao. Esto desaniciará el nome del usuariu de tolos llistaos y entraes de los rexistros. ¿De xuro quies facer eso?',
 'ipb-edit-dropdown' => 'Editar motivos de bloquéu',
@@ -2435,7 +2459,7 @@ El rexistru de desanicios s'ufre darréu pa referencia:",
 'reblock-logentry' => 'camudó los parámetros de bloquéu de [[$1]] con una caducidá de $2 $3',
 'blocklogtext' => "Esti ye un rexistru de los bloqueos y desbloqueos d'usuarios.
 Les direcciones IP bloquiaes automáticamente nun salen equí.
-Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista d'IP bloquiaes]].",
+Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bloqueos]].",
 'unblocklogentry' => 'desbloquió $1',
 'block-log-flags-anononly' => 'namái usuarios anónimos',
 'block-log-flags-nocreate' => 'creación de cuentes desactivada',
@@ -3368,7 +3392,7 @@ Por favor comprueba que nun punxeras carauteres non válidos na to direición de
 
 El sirvidor de corréu devolvió: $1',
 'confirmemail_invalid' => 'Códigu de confirmación non válidu. El códigu seique tenga caducao.',
-'confirmemail_needlogin' => 'Tienes que $1 pa confirmar el to corréu.',
+'confirmemail_needlogin' => 'Has $1 pa confirmar la to direición de corréu electrónicu.',
 'confirmemail_success' => 'El to corréu quedó confimáu.
 Agora yá pues [[Special:UserLogin|coneutate]] y esfrutar de la wiki.',
 'confirmemail_loggedin' => 'Quedó confirmada la to direición de corréu.',
@@ -3541,6 +3565,9 @@ Tendríes d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Lli
 'version-software' => 'Software instaláu',
 'version-software-product' => 'Productu',
 'version-software-version' => 'Versión',
+'version-entrypoints' => "URLs del puntu d'entrada",
+'version-entrypoints-header-entrypoint' => "Puntu d'entrada",
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => "Ruta d'archivu",
@@ -3729,4 +3756,15 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 'api-error-uploaddisabled' => 'Les xubíes tan desactivaes nesta wiki.',
 'api-error-verification-error' => 'Esti ficheru pudiera tar corrompíu, o tien una estensión incorreuta.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL: $1|segundu|segundos}}',
+'duration-minutes' => '$1 {{PLURAL: $1|minutu|minutos}}',
+'duration-hours' => '$1 {{PLURAL: $1|hora|hores}}',
+'duration-days' => '$1 {{PLURAL: $1|día|díes}}',
+'duration-weeks' => '$1 {{PLURAL: $1|selmana|selmanes}}',
+'duration-years' => '$1 {{PLURAL: $1|añu|años}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décades}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sieglu|sieglos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenios}}',
+
 );
index 95235bb..6e7fd89 100644 (file)
@@ -629,7 +629,7 @@ oke <span class="plainlinks">[{{fullurl:{{#Special:Log}}|bu={{FULLPAGENAMEE}}}}
 'updated' => '(Nuskeyen)',
 'note' => "'''Straga :'''",
 'previewnote' => "'''Obral, bat krent anton tir abdinedik.'''
-Rinafa betara men tid giwayan ! [[#editform|→ Continue editing]]",
+Rinafa betara men tid giwayan !",
 'previewconflict' => 'Abdinedira nedir va krent ke batu bu inde in giwayanon titir.',
 'editing' => 'betara va $1',
 'editingsection' => 'betara va $1 (gabot)',
@@ -1785,12 +1785,14 @@ N'oubliez pas de la déverrouiller lorsque vous aurez terminé votre opération
 # Move page
 'move-page' => 'Arrundara va $1',
 'move-page-legend' => 'Va teliz tolyoltá',
-'movepagetext' => "Utilisez le formulaire ci-dessous pour renommer un article, en déplaçant toutes ses versions antérieures vers le nouveau nom.
+'movepagetext' => "Utilisez le formulaire ci-dessous pour renommer un article (et sa page de discussion, le cas échéant), en déplaçant toutes ses versions antérieures vers le nouveau nom.
 
-Le titre précédent deviendra une page de redirection vers le nouveau titre. Les liens vers l'ancien titre ne seront pas modifiés et la page discussion, si elle existe, ne sera pas déplacée.
+Vous pouvez mettre à jour les redirections qui pointent sur l’ancien titre automatiquement. Si vous ne le faites pas, assurez-vous qu’il n’y ait pas de redirections [[Special:DoubleRedirects|doubles]] ou [[Special:BrokenRedirects|rompues]]. Vous êtes responsable de vous assurer que les liens continuent de pointer aux bons endroits.
 
-'''ATTENTION!'''
-Il peut s'agir d'un changement radical et inattendu pour un article souvent consulté; assurez-vous que vous en comprenez bien les conséquences avant de procéder.",
+Notez que la page ne sera '''pas''' déplacée s’il y a déjà une page au nouveau titre, à moins que cette dernière ne soit vide ou une redirection, et qu’elle soit sans historique. Ceci vous permet de revenir en arrière en cas d’erreur, et vous empêche d’écraser les pages existantes.
+
+'''ATTENTION !'''
+Il peut s’agir d’un changement radical et inattendu pour un article souvent consulté ; assurez-vous que vous en comprenez bien les conséquences avant de procéder.",
 'movepagetalktext' => "La page de discussion associée, si présente, sera automatiquement renommée avec '''sauf si:'''
 *Vous renommez une page vers un autre espace,
 *Une page de discussion existe déjà avec le nouveau nom, ou
index 8d7ad25..b835a7f 100644 (file)
@@ -681,6 +681,7 @@ Bloklama qeydlərinin sonuncusu aşağıda göstərilmişdir:',
 'previewconflict' => 'Bu sınaq göstərişidir və yaddaşda saxlayacağınız təqdirdə mətnin redaktə səhifəsinin yuxarı hissəsində nəticənin necə olacağını göstərir.',
 'session_fail_preview' => "'''Üzr istəyirik! Sizin redaktəniz saxlanılmadı. Serverdə identifikasiyanızla bağlı problemlər yaranmışdır. Lütfən bir daha təkrar edin. Problem həll olunmazsa hesabınızdan çıxın və yenidən daxil olun.'''",
 'editing' => 'Redaktə $1',
+'creating' => 'Qurulur $1',
 'editingsection' => 'Redaktə $1 (bölmə)',
 'editingcomment' => 'Redaktə et $1 (yeni bölmə)',
 'editconflict' => 'Eyni vaxtda redaktə: $1',
@@ -1606,6 +1607,7 @@ Qeyd növü, istifadəçi adı və ya təsir edilmiş səhifəni seçməklə dah
 'allpagesnext' => 'Sonrakı',
 'allpagessubmit' => 'Seç',
 'allpagesprefix' => 'Bu prefiksli səhifələri göstər:',
+'allpages-hide-redirects' => 'Yönləndirmələri gizlət',
 
 # Special:Categories
 'categories' => 'Kateqoriyalar',
@@ -2888,6 +2890,7 @@ Variants for Chinese language
 'version-poweredby-others' => 'digərləri',
 'version-software-product' => 'Məhsul',
 'version-software-version' => 'Versiya',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Fayl yolu',
@@ -2995,4 +2998,15 @@ Bu saytda texniki problemlər var.',
 'api-error-unknownerror' => 'Naməlum xəta: "$1".',
 'api-error-uploaddisabled' => 'Bu vikidə fayl yükləmə mümkün deyil.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|saniyə|saniyə}}',
+'duration-minutes' => '$1 {{PLURAL:$1|dəqiqə|dəqiqə}}',
+'duration-hours' => '$1 {{PLURAL:$1|saat|saat}}',
+'duration-days' => '$1 {{PLURAL:$1|gün|gün}}',
+'duration-weeks' => '$1 {{PLURAL:$1|həftə|həftə}}',
+'duration-years' => '$1 {{PLURAL:$1|il|il}}',
+'duration-decades' => '$1 {{PLURAL:$1|onillik|onillik}}',
+'duration-centuries' => '$1 {{PLURAL:$1|əsr|əsr}}',
+'duration-millennia' => '$1 {{PLURAL:$1|minillik|minillik}}',
+
 );
index 3ecdad4..034a58b 100644 (file)
  * @author Kaganer
  * @author Reedy
  * @author Roustammr
+ * @author Sagan
  * @author Timming
  * @author Рустам Нурыев
+ * @author ҒатаУлла
  */
 
 $fallback = 'ru';
@@ -303,6 +305,7 @@ $1',
 'versionrequiredtext' => 'Был бит менән эшләү өсөн MediaWiki-ның $1 версияһы кәрәк. [[Special:Version|Ҡулланылған версия тураһында мәғлүмәт битен]] ҡара.',
 
 'ok' => 'Тамам',
+'pagetitle' => '{{SITENAME}} проектынан',
 'retrievedfrom' => 'Сығанағы — «$1»',
 'youhavenewmessages' => 'Яңы $1 бар ($2).',
 'newmessageslink' => 'яңы хәбәр',
@@ -403,8 +406,8 @@ $1',
 'cannotdelete-title' => '"$1" битен юйып булмай',
 'badtitle' => 'Ярамаған исем',
 'badtitletext' => 'Биттең һоратылған исеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики исеме яңылыш күрһәтелгән. Исемдә тыйылған символдар булыуы ла мөмкин.',
-'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Был мәғлүмәттәр кэштан алынды, ул һуңғы тапҡыр $1 яңыртылды. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.',
+'perfcachedts' => 'Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе  {{PLURAL:$4|язма}} һаҡлана',
 'querypage-no-updates' => 'Был битте яңыртыу хәҙер тыйылған.
 Бында күрһәтелгән мәғлүмәттәр яңыртылмаясаҡ.',
 'wrong_wfQuery_params' => 'wfQuery() функцияһы өсөн рөхсәт ителмәгән параметрҙар<br />
@@ -430,6 +433,9 @@ $2',
 'ns-specialprotected' => '«{{ns:special}}» исем арауығындағы биттәрҙе үҙгәртеп булмай.',
 'titleprotected' => "Был исем менән бит яһау [[User:$1|$1]] тарафынан тыйылған.
 Белдерелгән сәбәп: ''$2''.",
+'filereadonlyerror' => "«$1» файлын үҙгәртеп булмай, сөнки «$2» һаҡлағысы «уҡыу өсөн генә» тәртибенде.
+
+Установивший этот режим администратор оставил следующее разъяснение: «''$3''».",
 
 # Virus scanner
 'virus-badscanner' => "Көйләү хатаһы: Билдәһеҙ вирустар сканеры: ''$1''",
@@ -513,6 +519,7 @@ $2',
 'invalidemailaddress' => 'Электрон почта адресы ҡабул ителә алмай, сөнки ул форматка тап килмәй.
 Зинһар, дөрөҫ адрес керетегеҙ йәки юлды буш ҡалдырығыҙ.',
 'cannotchangeemail' => 'Иҫәп яҙыуы электрон почта адрестарын был викила үҙгәртеп булмай.',
+'emaildisabled' => 'Был сайт электрон почта хәберҙәрен ебәрә алмай',
 'accountcreated' => 'Иҫәп яҙыуы яһалды',
 'accountcreatedtext' => '$1 исемле ҡулланыусы өсөн исәп яҙыуы яһалды.',
 'createaccount-title' => '{{SITENAME}}: теркәлеү',
@@ -704,7 +711,9 @@ $2
 'userinvalidcssjstitle' => "'''Иғтибар:''' \"\$1\" биҙәү темаһы табылманы. Иҫтә тотоғоҙ, .css һәм .js ҡулланыусы биттәренең исемдәре тик бәләкәй хәрефтәрҙән генә торорға тейеш. Мәҫәлән: {{ns:user}}:Foo/vector.css, ә {{ns:user}}:Foo/Vector.css түгел!",
 'updated' => '(Яңыртылды)',
 'note' => "'''Иҫкәрмә:'''",
-'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''",
+'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''
+Һеҙҙең үҙгәртеүҙәр әле яҙылмаған!",
+'continue-editing' => 'Мөхәррирләүҙе дауам итергә',
 'previewconflict' => 'Әлеге алдан ҡарау, мөхәррирләү тәҙрәһенең өҫтөндә, һаҡланғандан һуң текстың нисек күренәсәген күрһәтә.',
 'session_fail_preview' => "'''Ҡыҙғанысҡа ҡаршы, һеҙҙең ултырыш идентификаторығыҙ юғалды. Һөҙөмтәлә үҙгәртеүҙәрегеҙ ҡабул ителмәйәсәк.
 Зинһар, тағы бер тапҡыр ҡабатлағыҙ.
@@ -719,6 +728,7 @@ $2
 Бындай хәлдәр хаталы аноним web-проксилар ҡулланғанда килеп сығырға мөмкин.",
 'edit_form_incomplete' => "'''Мөхәррирләү формаһының ҡайһы өлөштәре серверға барып етмәне. Төҙәтеүҙәрегеҙҙе яҡшы итеп тикшерегеҙ һәм яңынан ҡабатлағыҙ.'''",
 'editing' => 'Мөхәрирләү  $1',
+'creating' => 'Төҙөү $1',
 'editingsection' => 'Мөхәрирләү  $1 (секция)',
 'editingcomment' => '$1 мөхәррирләнә (яңы бүлек)',
 'editconflict' => 'Мөхәррирләү конфликты: $1',
@@ -782,6 +792,7 @@ $2
 'edit-no-change' => 'Текста үҙгәртеүҙер булмау сәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.',
 'edit-already-exists' => 'Яңы бит яһап булмай.
 Ул былай ҙа бар.',
+'defaultmessagetext' => 'Алдан билдәләнгән яҙма',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Иғтибар:''' был биттә хәтерҙе күп ҡулланыусы функциялар ныҡ күп.
@@ -940,7 +951,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'Йәшереү яҙмалары',
 'suppressionlogtext' => 'Түбәндә, администраторҙарҙан йәшерелгән материалдар булған һуңғы юйыуҙыр һәм блоклауҙар исемлеге килтерелгән.
-Ағымдағы блоклауҙарҙы күрер өсөн [[Special:BlockList|IP-блоклауҙар исемлеген]] ҡарағыҙ.',
+Ағымдағы блоклауҙарҙы күрер өсөн [[Special:BlockList|блоклауҙар исемлеген]] ҡарағыҙ.',
 
 # History merging
 'mergehistory' => 'Үҙгәртеүҙәр тарихын берләштерергә',
@@ -1538,6 +1549,10 @@ $1',
 'backend-fail-internal' => '$1 һаҡлағысында билдәһеҙ хата килеп сыҡты',
 'backend-fail-contenttype' => 'Файлды $1 адресына һаҡлар өсөн уның эстәлеге төрөн билдәләп булманы.',
 
+# File journal errors
+'filejournal-fail-dbconnect' => '"$1" мәғлүмәт базаһы журналына тоташып булманы.',
+'filejournal-fail-dbquery' => '«$1» мәғлүмәт базаһын һаҡлағын журналды яңыртып булманы.',
+
 # Lock manager
 'lockmanager-notlocked' => '" $1 " асҡысының биген сисеп булмай; ул бикле түгел.',
 'lockmanager-fail-closelock' => '"$1" асҡысының бикләү файлын ябып булманы.',
@@ -1868,6 +1883,10 @@ $1',
 'allpagesbadtitle' => 'Күрһәтелгән бит исеме дөрөҫ түгел йәки телдәр араһы йәки интервики ҡушымтаһы менән башлана.
 Исемдә тыйылған символдар булыуы ла мөмкин.',
 'allpages-bad-ns' => '{{SITENAME}} проектында "$1" исемдәр арауығы юҡ.',
+'allpages-hide-redirects' => 'Йүнәлтеүҙәрҙе йәшерергә',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Һуңғы версияны ҡарарға',
 
 # Special:Categories
 'categories' => 'Категориялар',
@@ -2311,7 +2330,7 @@ $1',
 'badipaddress' => 'IP адрес дөрөҫ түгел',
 'blockipsuccesssub' => 'Бикләү уңышлы башҡарылды',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] бикләнде.<br />
-[[Special:BlockList|Бикләнгән IP адрестарҙы]] ҡарарға.',
+Биктәрҙе күреү өсөн [[Special:BlockList|бикләнгән IP адрестарҙы]] ҡарағыҙ.',
 'ipb-blockingself' => 'Һеҙ үҙегеҙҙе бикләргә теләйһегеҙ! Быны эшләүҙе раҫлайһығыҙмы?',
 'ipb-confirmhideuser' => '"Ҡулланыусыны йәшер" ғәмәлдә саҡта ҡулланыусыны блокларға теләйһегеҙ. Уның исеме исемлектәрҙә һәм журналдарҙа күренмәйәсәк. Быны эшләргә теләүегеҙҙе раҫлайһығыҙмы?',
 'ipb-edit-dropdown' => 'Бикләү сәбәптәрен мөхәррирләргә',
@@ -2364,8 +2383,8 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 Түбәндә белешмә өсөн йәшереү яҙмалары журналы килтерелгән:',
 'blocklogentry' => '[[$1]] бикләгән, тамамланыу ваҡыты: $2 $3',
 'reblock-logentry' => '[[$1]] ҡатнашыусыһының бикләү көйләүҙәрен үҙгәрткән, тамамланыу ваҡыты — $2 $3',
-'blocklogtext' => 'Ҡатнашыусыларҙы бикләү һәм бикте алыу яҙмалары журналы.
-Авто бикләнеүсе IP адрестар бында күрһәтелмәй.
+'blocklogtext' => 'Ҡатнашыусыларҙы бикләү һәм бикте алыу журналы.
+Автоматик бикләнгән IP адрестар бында күрһәтелмәй.
 [[Special:BlockList|Ғәмәлдәге тыйыуҙырҙы һәм бикләүҙәрҙе]] ҡарай алаһығыҙ.',
 'unblocklogentry' => '$1 ҡулланыусыһының блокланыу ваҡыты тамамланды',
 'block-log-flags-anononly' => 'танылмаған ҡатнашыусылар ғына',
@@ -2612,6 +2631,8 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 'import-invalid-interwiki' => 'Күрһәтелгән вики проекттан тейәү мөмкин түгел.',
 'import-error-edit' => '«$1» битен импортлап булманы, сөнки һеҙгә ул битте мөхәррирләү тыйылған.',
 'import-error-create' => '«$1» битен импортлап булманы, сөнки һеҙгә ул битте яһау тыйылған.',
+'import-error-interwiki' => '«$1» бите импортҡа сығарылманы, сөнки уның исеме тышҡы һылианма  (интервики)өсөн резервланған.',
+'import-error-special' => ' «$1» бите импортҡа сығарылманы, сөнки ул биттәр яһау мөмкин булмаған исемдәр арауығына ҡарай.',
 'import-error-invalid' => '"$1" бите яраҡһыҙ исеме өсөн импортланманы.',
 
 # Import log
@@ -2625,12 +2646,14 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 # JavaScriptTest
 'javascripttest' => '
 JavaScript тикшереү',
-'javascripttest-disabled' => 'Был мөмкинлек һүндерелгән.',
+'javascripttest-disabled' => 'Был мөмкинлек был Википроектта ғәмәлгә индерелмәгән.',
 'javascripttest-title' => '$1 тикшеренеү үткәрелә',
 'javascripttest-pagetext-noframework' => 'Был бит JavaScript тикшеренеүҙәре үткәреү өсөн  резервланған.',
 'javascripttest-pagetext-unknownframework' => 'Билдәһеҙ тикшеренеүҙәр мөхитнамәһе "$1".',
 'javascripttest-pagetext-frameworks' => 'Зинһар өсөн киләһе тикшеренеүҙәр мөхитнамәһенең береһен һайлап алығыҙ: $1',
+'javascripttest-pagetext-skins' => 'Һынауҙы башлау өсөн тышса һыйлағыҙ.',
 'javascripttest-qunit-intro' => 'mediawiki.org адресы буйынса ҡарағыҙ [$1 тест үткәреү документацияһы].',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit өсөн һынауҙар йыйлмаһы.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ҡулланыусы битегеҙ',
@@ -2693,6 +2716,7 @@ JavaScript тикшереү',
 'tooltip-diff' => 'Сығанаҡ текстҡа ҡарата эшләгән үҙгәртеүҙәрҙе күрһәтергә.',
 'tooltip-compareselectedversions' => 'Был биттең һайланған ике өлгөһө араһындағы айырманы ҡарарға',
 'tooltip-watch' => 'Битте күҙәтеү исемлегемә өҫтәргә',
+'tooltip-watchlistedit-normal-submit' => 'Биттәрҙе юйырға',
 'tooltip-watchlistedit-raw-submit' => 'Күҙәтеү исемлеген яңыртырға',
 'tooltip-recreate' => 'Битте юйылған булыуына ҡарамаҫтан тергеҙергә',
 'tooltip-upload' => 'Күсерә башларға',
@@ -3433,6 +3457,9 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'version-software' => 'Ҡуйылған программалар',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Өлгөһө',
+'version-entrypoints' => 'Инеш өсөн URL адрестар',
+'version-entrypoints-header-entrypoint' => 'Инеш урыны',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Файлға юл',
@@ -3585,23 +3612,52 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'feedback-bugnew' => 'Тикшерҙем. Яңы хата тураһында белдерергә',
 
 # API errors
+'api-error-badaccess-groups' => 'Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй',
+'api-error-badtoken' => 'Эске хата: дөрөҫ булмаған токен',
+'api-error-copyuploaddisabled' => 'Был серверҙа URL адрес буйынса йөкләү өҙөлгән',
+'api-error-duplicate' => 'Бындай эстәлекле {{PLURAL:$1|[$2 файл]}}  бар.',
+'api-error-duplicate-archive' => 'Сайтта бындай эстәлекле {{PLURAL:$1|[$2 башҡа файл]}} бар ине инде, ләкин {{PLURAL:$1|ул юйылды|улар юйылды}}',
+'api-error-duplicate-archive-popup-title' => 'Элек юйылған {{PLURAL:$1|файлдың|файлдарҙың}} дубликаты',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|файлы|файлдары}} дубликаты.',
 'api-error-empty-file' => 'Һеҙ ебәргән файл буш.',
 'api-error-emptypage' => 'Яңы буш биттәр яһау тыйыла.',
+'api-error-fetchfileerror' => 'Эске хата: файлды күсергән ваҡытта хата китте',
 'api-error-file-too-large' => 'Һеҙ ебәргән файл үтә ҙур.',
 'api-error-filename-tooshort' => 'Файл исеме бик ҡыҫҡа.',
 'api-error-filetype-banned' => 'Был файл төрө тыйылған.',
+'api-error-filetype-missing' => 'Был файлдың ҡушымтаһы юҡ',
+'api-error-hookaborted' => 'Һеҙ эшләргә теләгән үҙгәртеүҙәр ҡушымтаны тикшереүсе тарафынан өҙөлдө',
 'api-error-http' => 'Эске хата: серверға бәйләнеп булмай.',
 'api-error-illegal-filename' => 'Рөхсәт ителмәгән файл исеме.',
+'api-error-internal-error' => 'Эске хата: һеҙ викиға йөкләгәнде тикшергән ваҡытта хата китте',
+'api-error-invalid-file-key' => 'Эске хата: ваҡытлыса һаҡлағыста файл табылманы',
+'api-error-missingparam' => 'Эске хата: мөрәжәғеттең параматрҙары юҡ.',
+'api-error-missingresult' => 'Эске хата: күсереү уңышлы булыуын билдәләп булманы.',
 'api-error-mustbeloggedin' => 'Файлдарҙы йөкмәтеү өсөн һеҙ сисемаға танышырға тейешһегеҙ.',
+'api-error-mustbeposted' => 'Эске хата: мөрәжәғәт HTTP POST адресын талап итә.',
+'api-error-noimageinfo' => 'Йөкләү уңышлы тамамланды, әммә сервер файл тураһында бер ниндәйҙә мәғлүмәт бирмәне.',
 'api-error-nomodule' => 'Эске хата: тейәү модуле көйләнмәгән.',
 'api-error-ok-but-empty' => 'Эске хата: серверҙан яуап юҡ.',
 'api-error-overwrite' => 'Булған файлды алыштырыу рөхсәт ителмәй.',
+'api-error-stashfailed' => 'Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.',
 'api-error-timeout' => 'Көтөлгән ваҡыт эсендә сервер яуып бирмәне.',
 'api-error-unclassified' => 'Билдәһеҙ хата барлыҡҡа килде.',
 'api-error-unknown-code' => 'Билдәһеҙ хата: «$1»',
+'api-error-unknown-error' => 'Эске хата: файлды йөкләгәндә ниндәйҙер хата китте.',
 'api-error-unknown-warning' => 'Билдәһеҙ белдереү: "$1".',
 'api-error-unknownerror' => 'Билдәһеҙ хата: «$1»',
 'api-error-uploaddisabled' => 'Был викила файл тейәү мөмкинлеге ябылған.',
+'api-error-verification-error' => 'Был файл боҙолған, йәки дөрөҫ булмаған ҡушымтаһы бар.',
+
+# Durations
+'duration-seconds' => 'секунд',
+'duration-minutes' => 'минут',
+'duration-hours' => 'сәғәт',
+'duration-days' => 'көн',
+'duration-weeks' => 'аҙна',
+'duration-years' => 'йыл',
+'duration-decades' => 'декада',
+'duration-centuries' => 'быуат',
+'duration-millennia' => 'меңйыллыҡ',
 
 );
index 039ec52..d13a6ec 100644 (file)
@@ -469,7 +469,7 @@ $messages = array(
 'categorypage' => 'Паказаць старонку катэгорыі',
 'viewtalkpage' => 'Паказаць абмеркаваньне',
 'otherlanguages' => 'На іншых мовах',
-'redirectedfrom' => '(Перанакіравана з $1)',
+'redirectedfrom' => '(Перанакіравана з «$1»)',
 'redirectpagesub' => 'Старонка-перанакіраваньне',
 'lastmodifiedat' => 'Гэтая старонка апошні раз рэдагавалася $1 году ў $2.',
 'viewcount' => 'Гэтую старонку праглядалі $1 {{PLURAL:$1|раз|разы|разоў}}.',
@@ -926,7 +926,8 @@ $2
 'updated' => '(Абноўлена)',
 'note' => "'''Заўвага: '''",
 'previewnote' => "'''Гэта толькі папярэдні прагляд.'''
-Вашыя зьмены яшчэ не былі захаваныя! [[#editform|→ Працягнуць рэдагаваньне]]",
+Вашыя зьмены яшчэ не былі захаваныя!",
+'continue-editing' => 'Працягнуць рэдагаваньне',
 'previewconflict' => 'Гэта папярэдні прагляд тэксту зь верхняга вакна рэдагаваньня, так ён будзе выглядаць, калі Вы вырашыце яго захаваць.',
 'session_fail_preview' => "'''Не атрымалася захаваць Вашую праўку праз тое, што былі страчаныя зьвесткі пра сэсію.
 Калі ласка, паспрабуйце яшчэ раз. Калі памылка ня зьнікне, паспрабуйце [[Special:UserLogout|выйсьці з сыстэмы]] і ўвайсьці ізноў.'''",
@@ -1022,6 +1023,10 @@ $2
 'parser-template-loop-warning' => 'Выяўлены цыкль у шаблёнах: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Перавышана мяжа глыбіні рэкурсіі шаблёнаў ($1)',
 'language-converter-depth-warning' => 'Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)',
+'node-count-exceeded-category' => 'Старонкі зь перавышанай колькасьцю вузлоў',
+'node-count-exceeded-warning' => 'Старонка перавысіла дазволеную колькасьць вузлоў',
+'expansion-depth-exceeded-category' => 'Старонкі зь перавышанай глыбінёй уключэньня',
+'expansion-depth-exceeded-warning' => 'Старонка перавысіла дазволеную глыбіню ўключэньняў',
 
 # "Undo" feature
 'undo-success' => 'Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.',
@@ -1821,6 +1826,7 @@ $1',
 'http-curl-error' => 'Памылка выбаркі URL-адрасу: $1',
 'http-host-unreachable' => 'Немагчыма дасягнуць URL-адрас',
 'http-bad-status' => 'Адбылася памылка пад час выкананьня HTTP-запыту: $1 $2',
+'http-truncated-body' => 'Цела запыту было атрымана часткова.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Немагчыма дасягнуць URL-адрас',
@@ -2101,6 +2107,11 @@ $1',
 'allpages-bad-ns' => '{{SITENAME}} ня мае прасторы назваў «$1».',
 'allpages-hide-redirects' => 'Схаваць перанакіраваньні',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Вы праглядаеце закэшаваную вэрсію старонкі, якая магла быць абноўленая $1 таму.',
+'cachedspecial-viewing-cached-ts' => 'Вы праглядаеце закэшаваную вэрсію старонкі, якая можа быць неактуальнай.',
+'cachedspecial-refresh-now' => 'Пабачыць апошнюю вэрсію.',
+
 # Special:Categories
 'categories' => 'Катэгорыі',
 'categoriespagetext' => '{{PLURAL:$1|Наступная катэгорыя зьмяшчае|Наступныя катэгорыі зьмяшчаюць}} старонкі і/альбо мэдыяфайлы.
@@ -2541,8 +2552,8 @@ $1',
 'ipb-confirm' => 'Пацьвердзіць блякаваньне',
 'badipaddress' => 'Некарэктны IP-адрас',
 'blockipsuccesssub' => 'Блякаваньне пасьпяховае',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] {{GENDER:$1|быў заблякаваны|была заблякаваная}}.
-<br />Глядзіце [[Special:BlockList|сьпіс заблякаваных IP-адрасоў]] дзеля перагляду блякаваньняў.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] {{GENDER:$1|быў заблякаваны|была заблякаваная}}.<br />
+Глядзіце [[Special:BlockList|сьпіс блякаваньняў]] дзеля іх перагляду.',
 'ipb-blockingself' => 'Вы зьбіраецеся заблякаваць самога сябе! Вы ўпэўнены, што жадаеце гэта зрабіць?',
 'ipb-confirmhideuser' => 'Вы зьбіраецеся заблякаваць удзельніка са статусам «схаваны». Гэтае дзеяньне прывядзе да таго, што яго імя зьявіцца ва ўсіх сьпісах і журналах уваходу. Вы ўпэўнены, што жадаеце гэта зрабіць?',
 'ipb-edit-dropdown' => 'Рэдагаваць прычыны блякіровак',
@@ -2592,7 +2603,9 @@ $1',
 'blocklog-showsuppresslog' => 'Гэты ўдзельнік ужо заблякаваны і схаваны. Журнал хаваньняў пададзены ніжэй:',
 'blocklogentry' => 'заблякаваны [[$1]] на тэрмін: $2 $3',
 'reblock-logentry' => 'зьмененыя парамэтры блякаваньня для [[$1]] на тэрмін: з $2 да $3',
-'blocklogtext' => 'Гэта журнал уліку блякаваньняў і разблякаваньняў удзельнікаў. Аўтаматычна заблякаваныя IP-адрасы не пазначаныя. Глядзіце [[Special:BlockList|сьпіс заблякаваных IP-адрасоў]], каб пабачыць дзейныя ў гэты момант блякаваньні.',
+'blocklogtext' => 'Гэта журнал уліку блякаваньняў і разблякаваньняў удзельнікаў.
+Аўтаматычна заблякаваныя IP-адрасы не пазначаныя.
+Глядзіце [[Special:BlockList|сьпіс блякаваньняў]], каб пабачыць дзейныя ў гэты момант блякаваньні.',
 'unblocklogentry' => 'разблякаваны $1',
 'block-log-flags-anononly' => 'толькі ананімныя ўдзельнікі',
 'block-log-flags-nocreate' => 'стварэньне рахункаў забароненае',
@@ -3671,6 +3684,9 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'version-software' => 'Усталяванае праграмнае забесьпячэньне',
 'version-software-product' => 'Прадукт',
 'version-software-version' => 'Вэрсія',
+'version-entrypoints' => 'Уваходныя адрасы',
+'version-entrypoints-header-entrypoint' => 'Пункт уваходу',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Шлях да файла',
@@ -3859,4 +3875,15 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'api-error-uploaddisabled' => 'Загрузка ў гэтую вікі адключаная.',
 'api-error-verification-error' => 'Гэты файл можа быць пашкоджаны, ці мае няслушнае пашырэньне.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|сэкунда|сэкунды|сэкундаў}}',
+'duration-minutes' => '$1 {{PLURAL:$1|хвіліна|хвіліны|хвілінаў}}',
+'duration-hours' => '$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}',
+'duration-days' => '$1 {{PLURAL:$1|дзень|дні|дзён}}',
+'duration-weeks' => '$1 {{PLURAL:$1|тыдзень|тыдні|тыдняў}}',
+'duration-years' => '$1 {{PLURAL:$1|год|гады|гадоў}}',
+'duration-decades' => '$1 {{PLURAL:$1|дзесяцігодзьдзе|дзесяцігодзьдзі|дзесяцігодзьдзяў}}',
+'duration-centuries' => '$1 {{PLURAL:$1|стагодзьдзе|стагодзьдзі|стагодзьдзяў}}',
+'duration-millennia' => '$1 {{PLURAL:$1|тысячагодзьдзе|тысячагодзьдзі|тысячагодзьдзяў}}',
+
 );
index d9fb268..7915c90 100644 (file)
@@ -908,6 +908,7 @@ $2
 'updated' => '(обновена)',
 'note' => "'''Забележка:'''",
 'previewnote' => "'''Това е само предварителен преглед. Промените все още не са съхранени!'''",
+'continue-editing' => 'Продължаване на редактирането',
 'previewconflict' => 'Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.',
 'session_fail_preview' => "'''За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия. Опитайте отново. Ако все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново.'''",
 'session_fail_preview_html' => "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''
@@ -918,6 +919,7 @@ $2
 'token_suffix_mismatch' => "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
 'edit_form_incomplete' => "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
 'editing' => 'Редактиране на „$1“',
+'creating' => 'Създаване на $1',
 'editingsection' => 'Редактиране на „$1“ (раздел)',
 'editingcomment' => 'Редактиране на „$1“ (нов раздел)',
 'editconflict' => 'Различна редакция: $1',
@@ -2014,6 +2016,7 @@ $1',
 'allpagesprefix' => 'Показване на страници, започващи със:',
 'allpagesbadtitle' => 'Зададеното име е невалидно. Възможно е да съдържа междуезикова или междупроектна представка или пък знаци, които не могат да се използват в заглавия.',
 'allpages-bad-ns' => 'В {{SITENAME}} не съществува именно пространство „$1“.',
+'allpages-hide-redirects' => 'Скриване на пренасочванията',
 
 # Special:Categories
 'categories' => 'Категории',
@@ -2337,6 +2340,7 @@ $UNWATCHURL
 'undelete-bad-store-key' => 'Не е възможно възстановяването на файловата версия с времеви отпечатък $1: файлът е липсвал преди изтриването.',
 'undelete-cleanup-error' => 'Грешка при изтриване на неизползвания архивен файл „$1“.',
 'undelete-missing-filearchive' => 'Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.',
+'undelete-error' => 'Грешка при възстановяване на страницата',
 'undelete-error-short' => 'Грешка при възстановяването на изтрития файл: $1',
 'undelete-error-long' => 'Възникнаха грешки при възстановяването на изтрития файл:
 
@@ -3085,9 +3089,11 @@ $1',
 'exif-serialnumber' => 'Сериен номер на фотоапарата',
 'exif-cameraownername' => 'Собственик на фотоапарата',
 'exif-label' => 'Етикет',
+'exif-datetimemetadata' => 'Дата на последна модификация на метаданните',
 'exif-nickname' => 'Неформално име на изображението',
 'exif-rating' => 'Рейтинг (от 5)',
 'exif-rightscertificate' => 'Сертификат за управление на правата',
+'exif-copyrighted' => 'Авторскоправен статут',
 'exif-copyrightowner' => 'Носител на авторското право',
 'exif-usageterms' => 'Условия за използване',
 'exif-originaldocumentid' => 'Уникален номер на оригиналния документ',
@@ -3591,9 +3597,15 @@ MediaWiki се разпространява с надеждата, че ще б
 'logentry-delete-restore' => '$1 възстанови страницата $3',
 'logentry-suppress-revision' => '$1 тайно промени видимостта на {{PLURAL:$5|една версия|$5 версии}} на страницата $3: $4',
 'logentry-suppress-revision-legacy' => '$1 тайно промени видимостта на версиите на страница $3',
+'revdelete-content-hid' => 'скрито съдържание',
+'revdelete-summary-hid' => 'скрито резюме на редакцията',
+'revdelete-uname-hid' => 'скрито потребителско име',
 'revdelete-restricted' => 'добавени ограничения за администраторите',
 'revdelete-unrestricted' => 'премахнати ограничения за администраторите',
+'logentry-move-move' => '$1 премести страницата $3 към заглавие $4',
+'logentry-move-move-noredirect' => '$1 премести страницата $3 към заглавие $4 без да оставя пренасочване',
 'logentry-move-move_redir' => '$1 премести страницата $3 като $4 (върху пренасочване)',
+'logentry-move-move_redir-noredirect' => '$1 премести върху пренасочване страницата $3 към заглавие $4 (без пренасочване)',
 'logentry-patrol-patrol' => '$1 отбеляза като патрулирана версия $4 на страницата „$3“',
 'logentry-patrol-patrol-auto' => '$1 автоматично отбеляза като патрулирана версия $4 на страницата $3',
 'logentry-newusers-newusers' => '$1 създаде потребителска сметка',
@@ -3652,4 +3664,15 @@ MediaWiki се разпространява с надеждата, че ще б
 'api-error-uploaddisabled' => 'Достъпът за качване на файлове в това уики е прекратен.',
 'api-error-verification-error' => 'Файлът може би е повреден или има грешно разширение.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'duration-minutes' => '$1 {{PLURAL:$1|минута|минути}}',
+'duration-hours' => '$1 {{PLURAL:$1|час|часа}}',
+'duration-days' => '$1 {{PLURAL:$1|ден|дни}}',
+'duration-weeks' => '$1 {{PLURAL:$1|седмица|седмици}}',
+'duration-years' => '$1 {{PLURAL:$1|година|години}}',
+'duration-decades' => '$1 {{PLURAL:$1|десетилетие|десетилетия}}',
+'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
+'duration-millennia' => '$1 {{PLURAL:$1|хилядолетие|хилядолетия}}',
+
 );
index 35aade9..129041f 100644 (file)
@@ -170,11 +170,11 @@ $messages = array(
 'category-empty' => '"Kada tadapat artikal maupun média dalam tumbung ini."',
 'hidden-categories' => '{{PLURAL:$1|Tumbung tasungkup|Tutumbung tasungkup}}',
 'hidden-category-category' => 'Tumbung tasungkup',
-'category-subcat-count' => '{{PLURAL:$2|Tumbung ini baisi asa sub-tumbung barikut.|Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut, matan sabarataan $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Tumbung ngini baisi asa sub-tumbung barikut.|Tumbung ngini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut, matan sabarataan $2.}}',
 'category-subcat-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut.',
-'category-article-count' => '{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}',
+'category-article-count' => '{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ngini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}',
 'category-article-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|asa tungkaran|$1 tutungkaran}} barikut.',
-'category-file-count' => '{{PLURAL:$2|Tumbung ini hanya baisi asa barakas barikut.|Tumbung ini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
+'category-file-count' => '{{PLURAL:$2|Tumbung ngini hanya baisi asa barakas barikut.|Tumbung ngini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
 'category-file-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.',
 'listingcontinuesabbrev' => 'samb.',
 'index-category' => 'Tungkaran tasusun bapadalakan kata',
@@ -269,7 +269,7 @@ $messages = array(
 'otherlanguages' => 'Dalam bahasa lain',
 'redirectedfrom' => '(Diugahakan matan $1)',
 'redirectpagesub' => 'Tungkaran paugahan',
-'lastmodifiedat' => 'Tungkaran ini tauncit diubah pada $1, $2.',
+'lastmodifiedat' => 'Tungkaran ngini tauncit diubah pada $1, $2.',
 'viewcount' => 'Tungkaran ini sudah diungkai {{PLURAL:$1|kali|$1 kali}}.',
 'protectedpage' => 'Tungkaran nang dilindungi',
 'jumpto' => 'Malacung ka',
@@ -359,7 +359,7 @@ Lihati [[Special:Version|Tungkaran mudil]]',
 'nosuchaction' => 'Kadada palakuan nangkaitu',
 'nosuchactiontext' => 'Palakuan nang diminta URL kada sah.
 Pian pinanya salah katik URL, atawa maumpati sabuah tautan nang kada bujur.
-Ini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.',
+Ngini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.',
 'nosuchspecialpage' => 'Kadada tungkaran istimiwa nangitu',
 'nospecialpagetext' => '<strong>Pian maminta tungkaran istimiwa nang kada sah.</strong>
 Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:specialpages}}]].',
@@ -368,7 +368,7 @@ Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:spec
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan Basisdata',
 'dberrortext' => 'Ada kasalahan sintaks pada parmintaan basisdata.
-Kasalahan ini pina manandai adanya sabuah bug dalam parangkat lunak.
+Kasalahan ngini pina manandai adanya sabuah bug dalam parangkat lunak.
 Parmintaan basisdata yang tadudi adalah:
 <blockquote><tt>$1</tt></blockquote>
 matan dalam pungsi "<tt>$2</tt>".
@@ -378,7 +378,7 @@ Parmintaan basisdata nang tadudi adalah:
 "$1"
 matan dalam pungsi "$2".
 Basisdata kasalahan  babulik "$3: $4".',
-'laggedslavemode' => "'''Paringatan:''' Tungkaran ini pinanya kada baisi parubahan tahanyar.",
+'laggedslavemode' => "'''Paringatan:''' Tungkaran ngini pinanya kada baisi parubahan tahanyar.",
 'readonly' => 'Basisdata tasunduk',
 'enterlockreason' => 'Buati sabuah alasan manyunduk, tamasuk jua wayah apa handak dibuka pulang sundukannya.',
 'readonlytext' => 'Basisdata lagi basunduk hagan masukan hanyar wan parubahan lain, pinanya pang lagi ada jadwal paharaguan basis data, imbah ini akan babulik nangkaya biasa.
@@ -388,8 +388,8 @@ Pambakal nang manyunduk mamadahi nangkaini: $1',
 
 Nangkaini biasanya dimargakan tautan lawas ka sabuah tungkaran nang halamnya sudah dihapus.
 
-Munnya lainan ini pasalnya, Pian mungkin batamu bug dalam perangkat lunak.
-Silakan lapurakan ini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah catatan URL nang ditulaki',
+Munnya lainan ngini pasalnya, Pian mungkin batamu bug dalam perangkat lunak.
+Silakan lapurakan ngini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah catatan URL nang ditulaki',
 'missingarticle-rev' => '(ralatan#: $1)',
 'missingarticle-diff' => '(Lain: $1, $2)',
 'readonly_lag' => 'Basisdata sudah utumatis tasunduk pas server basisdata dua lagi marungkuti basisdata tatambaian',
@@ -405,29 +405,29 @@ Silakan lapurakan ini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah cata
 'fileexistserror' => 'Kada kawa manulis ka barakas "$1": barakas sudah ada',
 'unexpected' => 'Nilai kada sasuai harapan: "$1"="$2".',
 'formerror' => 'Kasalahan: kada kawa mangirim purmulir',
-'badarticleerror' => 'Palakuan ini kada kawa dicungulakan pada tungkaran ini.',
+'badarticleerror' => 'Palakuan ngini kada kawa dicungulakan pada tungkaran ngini.',
 'cannotdelete' => "Tungkaran atawa barakas ''$1'' kada kawa dihapus. Pinanya sudah dihapus urang lain badahulu.",
 'cannotdelete-title' => 'Kada kawa mahapus tungkaran "$1"',
 'badtitle' => 'Judul buruk',
 'badtitletext' => 'Judul tungkaran nang diminta kada sah, kada baisi, atawa kada pasnya tautan judul antar-bahasa atawa antar-wiki.
 Nangini bisa baisi satu atawa labih hurup nang saharusnya kadada di judul.',
 'perfcached' => 'Data barikut adalah timbuluk wan pina kada mutakhir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Data nang dudi ini adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
-'querypage-no-updates' => 'Pamugaan matan tungkaran ini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
+'perfcachedts' => 'Data nang dudi ni adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'querypage-no-updates' => 'Pamugaan matan tungkaran ngini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
 'wrong_wfQuery_params' => 'Kada bujur ukuran ka wfQuery ()<br />
 Pungsi: $1<br />
 Parmintaan: $2',
 'viewsource' => 'Tiringi asal mulanya',
 'viewsource-title' => 'Tiringi asalmula matan $1',
 'actionthrottled' => 'Kalakuan dikiripi',
-'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ini.
+'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ngini.
 Muhun cubai pulang dalam babarapa minit.',
-'protectedpagetext' => 'Tungkaran ini sudah dilindungi hagan mancagah babakan.',
-'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ini:',
+'protectedpagetext' => 'Tungkaran ngini sudah dilindungi hagan mancagah babakan.',
+'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ngini:',
 'viewyourtext' => "Pian kawa maniringi wan salain asalmula matan '''babakan pian''' ka tungkaran ngini:",
 'protectedinterface' => 'Tungkaran ini manyadiakan naskah antarmuha gasan parangkat lunak, wan dilindungi hagan mancagah tasalah puruk.',
 'editinginterface' => "'''Paringatan:''' Pian mambabak sabuah tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
-Parubahan ka tungkaran ini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
+Parubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
 Gasan tarjamahan, muhun puruk [//translatewiki.net/wiki/Main_Page?setlang=bjn translatewiki.net], rangka gawian palokalan MediaWiki.",
 'sqlhidden' => '(Parmintaan SQL disungkupakan)',
 'cascadeprotected' => 'Tungkaran ini sudah dilindungi matan pambabakan, marga nangini tamasuk dalam {{PLURAL:$1|tungkaran|tutungkaran}} dudi nang dilindungi "barénténg": $2',
@@ -435,7 +435,7 @@ Gasan tarjamahan, muhun puruk [//translatewiki.net/wiki/Main_Page?setlang=bjn tr
 'customcssprotected' => 'Pian kada baisi ijin mambabak tungkaran CSS ngini, karana ngini baisi setelan paribadi pamakai lain.',
 'customjsprotected' => 'Pian kada baisi ijin mambabak tungkaran JavaScript ngini, karana ngini baisi setelan paribadi pamakai lain.',
 'ns-specialprotected' => 'Tungkaran istimiwa kada kawa dibabak.',
-'titleprotected' => "Judul ini dilindungi matan paulahan ulih [[User:$1|$1]].
+'titleprotected' => "Judul ngini dilindungi matan paulahan ulih [[User:$1|$1]].
 Alasan nang dibariakan adalah ''$2''.",
 
 # Virus scanner
@@ -444,7 +444,7 @@ Alasan nang dibariakan adalah ''$2''.",
 'virus-unknownscanner' => 'Antivirus kada dipinandui:',
 
 # Login and logout pages
-'logouttext' => "'''Pian parhatan ini sudah kaluar log.'''
+'logouttext' => "'''Pian parhatan ni sudah kaluar log.'''
 
 Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa [[Special:UserLogin|babuat log pulang]] sawagai pamakai nang sama atawa sawagai pamakai balain.
 Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masih babuat log, sampai Pian mahabisakan timbuluk panjalajah web Pian.",
@@ -490,7 +490,7 @@ Muhun kawa'akan nang itu wan cubai pulang.",
 Yakinakan Pian hudah mangkawa-akan cookies, muat pulang tungkaran naya wan cubai ja lagi.",
 'noname' => 'Ngaran pamakai nang Pian ajuakan kada sah.',
 'loginsuccesstitle' => 'Kulihan babuat log',
-'loginsuccess' => "'''Pian parhatan ini babuat log dalam {{SITENAME}} sawagai \"\$1\".'''",
+'loginsuccess' => "'''Pian parhatan ni babuat log dalam {{SITENAME}} sawagai \"\$1\".'''",
 'nosuchuser' => 'Kadada pamakai bangaran "$1".
 Ngaran pamakai adalah kasus marinci.
 Lihati pulang ijaan Pian, atawa [[Special:UserLogin/signup|ulah sabuting akun hanyar]]',
@@ -507,9 +507,9 @@ Muhun cubai pulang.',
 'password-login-forbidden' => 'Mamakai ngaran wan katasunduk nangini hudah ditangati.',
 'mailmypassword' => 'Kirimi kata sunduk hanyar',
 'passwordremindertitle' => 'Kata sunduk pahadangan gasan {{SITENAME}}',
-'passwordremindertext' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting katasunduk hanyar gasan {{SITENAME}} ($4). Sabuting katasunduk pahadangan gasan pamakai "$2" hudah diulah wan disetel ka "$3". Amun bujur Pian nang maminta, Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Katasunduk pahadangan Pian akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
+'passwordremindertext' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting katasunduk hanyar gasan {{SITENAME}} ($4). Sabuting katasunduk pahadangan gasan pamakai "$2" hudah diulah wan disetel ka "$3". Amun bujur Pian nang maminta, Pian parlu babuat log wan mamilih katasunduk hanyar wayah ni jua. Katasunduk pahadangan Pian akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
 
-Amun urang lain nang maminta ini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamakai katasunduk lawas Pian.',
+Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamakai katasunduk lawas Pian.',
 'noemail' => 'Kadada alamat suril tarakam gasan pamakai "$1".',
 'noemailcreate' => 'Pian parlu manyadiakan sabuah alamat suril nang sah',
 'passwordsent' => 'Sabuting kata sunduk hanyar sudah dikirim ka suril tadaptar gasan "$1".
@@ -531,10 +531,10 @@ Muhun buati sabuting alamat suril nang bujur pormatnya atawa puangkan haja isian
 'accountcreated' => 'Akun diulah',
 'accountcreatedtext' => 'Akun pamakai gasan $1 sudah diulah.',
 'createaccount-title' => 'Paulahan akun gasan {{SITENAME}}',
-'createaccount-text' => 'Ada urang nang maulah akun gasan alam suril Pian pada {{SITENAME}} ($4) bangaran "$2", awan kata sunduk "$3".
-Pian dianjurakan babuat log wan maubah kata sunduk Pian parhatan ini.
+'createaccount-text' => 'Ada urang nang maulah akun gasan alamat suril Pian pada {{SITENAME}} ($4) bangaran "$2", awan kata sunduk "$3".
+Pian dianjurakan babuat log wan maubah kata sunduk Pian parhatan ni.
 
-Pian kawa kada mahual pasan ini, amun paulahan akun ini adalah kasalahan.',
+Pian kawa kada mahual pasan ngini, amun paulahan akun ini adalah kasalahan.',
 'usernamehasherror' => 'Ngaran pamakai kada kawa mangandung tanda kurung',
 'login-throttled' => 'Pian sudah kabanyakan mancuba babuat log.
 Muhun hadangi dahulu sapandang hanyar cubai pulang.',
@@ -556,12 +556,12 @@ Hagan manuntungakan babuat log, Pian musti manyetel sabuah katasunduk hanyar di
 'retypenew' => 'Katik pulang katasunduk hanyar:',
 'resetpass_submit' => 'Setel katasunduk wan babuat log',
 'resetpass_success' => 'Katasunduk Pian bahasil diubah!
-Wayah ini Pian sudah babuat log...',
+Wayah ni Pian sudah babuat log...',
 'resetpass_forbidden' => 'Katasunduk kada kawa diubah',
 'resetpass-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
 'resetpass-submit-loggedin' => 'Ubah katasunduk',
 'resetpass-submit-cancel' => 'Walangi',
-'resetpass-wrong-oldpass' => 'Katasunduk samantara atawa wayah ini kada sah.
+'resetpass-wrong-oldpass' => 'Katasunduk samantara atawa wayah ni kada sah.
 Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasunduk samantara hanyar.',
 'resetpass-temp-password' => 'Katasunduk samantara:',
 
@@ -569,7 +569,7 @@ Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasundu
 'passwordreset' => 'Bulikakan setelan katasunduk',
 'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuah suril pangingat rarincian akun Pian.',
 'passwordreset-legend' => 'Bulikakan setelan katasunduk',
-'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ini.',
+'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.',
 'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
 'passwordreset-username' => 'Ngaran pamakai:',
 'passwordreset-domain' => 'Dumain:',
@@ -583,14 +583,14 @@ tarait awan suril:
 $2
 
 {{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
-Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamuruk katasunduk lawas Pian.',
+Pian parlu babuat log wan mamilih katasunduk hanyar wayah ni jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.',
 'passwordreset-emailtext-user' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamakai barikut {{PLURAL:$3|akun|akun}}
 tarait awan suril:
 
 $2
 
 {{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
-Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamuruk katasunduk lawas Pian.',
+Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.',
 'passwordreset-emailelement' => 'Ngaran pamakai: $1
 Katasunduk pahadangan: $2',
 'passwordreset-emailsent' => 'Sabuah suril pangingat sudah takirim.',
@@ -601,8 +601,8 @@ Katasunduk pahadangan: $2',
 'changeemail' => 'Ganti alamat suril',
 'changeemail-header' => 'Ganti akun alamat suril',
 'changeemail-text' => 'Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan parubahan ngini.',
-'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
-'changeemail-oldemail' => 'Alamat suril wayah ini:',
+'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ngini langsung.',
+'changeemail-oldemail' => 'Alamat suril wayah ni:',
 'changeemail-newemail' => 'Alamat suril puga:',
 'changeemail-none' => '(kadada)',
 'changeemail-submit' => 'Ganti suril',
@@ -629,8 +629,8 @@ Katasunduk pahadangan: $2',
 # Edit pages
 'summary' => 'Kasimpulan:',
 'subject' => 'Subyek/judul:',
-'minoredit' => 'Ini adalah babakan sapalih',
-'watchthis' => 'Itihi tungkaran ini',
+'minoredit' => 'Ngini adalah babakan sapalih',
+'watchthis' => 'Itihi tungkaran ngini',
 'savearticle' => 'Simpan tungkaran',
 'preview' => 'Tilik',
 'showpreview' => 'Tampaiakan titilikan',
@@ -638,11 +638,11 @@ Katasunduk pahadangan: $2',
 'showdiff' => 'Tampaiakan parubahan',
 'anoneditwarning' => "'''Paringatan:''' Pian baluman babuat log.
 Alamat IP Pian akan dirakam dalam tungkaran babakan halam",
-'anonpreviewwarning' => "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ini.''",
+'anonpreviewwarning' => "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ngini.''",
 'missingsummary' => "'''Pangingat:''' Pian kada manyadiakan sabuah kasimpulan babakan.
 Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada bakasimpulan.",
-'missingcommenttext' => 'Muhun buati sabuah kumintar di bawah ini.',
-'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuah subjek/judul gasan kumin ini.
+'missingcommenttext' => 'Muhun buati sabuah kumintar di bawah ngini.',
+'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuah subjek/judul gasan kumin ngini.
 Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada basubjek/bajudul.",
 'summary-preview' => 'Tilikan kasimpulan:',
 'subject-preview' => 'Titilikan subyek/judul:',
@@ -688,15 +688,15 @@ Pinanya ini sudah diugahakan atawa dihapus parhatan Pian maniringi tungkaran nan
 Katasunduk gasan pamakai hanyar nangini kawa diubah pintang tungkaran ''[[Special:ChangePassword|ubah katasunduk]]'' wayah babuat log.",
 'newarticle' => '(Hanyar)',
 'newarticletext' => "Pian maumpati sabuah tautan ka tungkaran nang baluman ada lagi. Gasan maulah tungkaran, mulai ja mangatik pada kutak di bawah (lihati [[{{MediaWiki:Helppage}}|tungkaran patulung]] gasan panjalasan labih). Amun Pian ka sia cagaran tasalah, klik picikan '''back''' di panjalajah web Pian.",
-'anontalkpagetext' => "----''Ini adalah tungkaran pamandiran gasan pamuruk kada bangaran nang baluman maulah akun pulang, atawa  kada mamuruknya. Kami tapaksa mamuruk numurik alamat IP hagan maminanduinya.
-Alamat IP nangkaini kawaai dipuruk ulih babarapa pamuruk.
+'anontalkpagetext' => "----''Ngini adalah tungkaran pamandiran gasan pamakai kada bangaran nang baluman ma-ulah akun pulang, atawa  kada mamakainya. Kami tapaksa mamakai numurik alamat IP hagan maminanduinya.
+Alamat IP nangkaini kawaai dipuruk ulih babarapa pamakai.
 Amun Pian adalah pamuruk kada bangaran wan marasa kumin nang kada pas ta ka Pian, muhun [[Special:UserLogin/signup|ulah sabuah akun]] or [[Special:UserLogin|babuat log]] hagan mahindari kabingungan awan pamuruk kada bangaran lain kaina.",
-'noarticletext' => 'Parhatan ini kadada naskah di tungkaran ini.
-Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ini]] pintang tungkaran lain,
+'noarticletext' => 'Parhatan ni kadada naskah di tungkaran ngini.
+Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ngini]] pintang tungkaran lain,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>,
-atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} mambabak tungkaran ini]</span>.',
-'noarticletext-nopermission' => 'Parhatan ini kadada naskah di tungkaran ini.
-Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ini]] pintang tungkaran lain,
+atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} mambabak tungkaran ngini]</span>.',
+'noarticletext-nopermission' => 'Parhatan ni kadada naskah di tungkaran ngini.
+Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ngini]] pintang tungkaran lain,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>.',
 'userpage-userdoesnotexist' => 'Akun pamuruk "<nowiki>$1</nowiki>" kada tadaptar.
 Muhun pariksa amun Pian handak maulah/mambabak tungkaran ini.',
@@ -723,7 +723,7 @@ Log blukir pahabisannya tasadia di bawah ini gasan rujukan:',
 Inatakan bahwasa saragam  tungkaran-tungkaran .css wan .js mamuruk aksara halus, cuntuh {{ns:user}}:Foo/vector.css sawagai tandingan {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dihanyarakan)',
 'note' => "'''Catatan:'''",
-'previewnote' => "'''Ingatakanlah bahwasa ini titilikan haja nang balum disimpan!'''",
+'previewnote' => "'''Ingatakanlah bahwasa ngini titilikan haja''' Parubahan Pian nang baluman disimpan!",
 'previewconflict' => 'Titilikan ini mancarminakan naskah dalam naskah wilayah atas babakan sawagai mana ini akan mancungul amun disimpan.',
 'session_fail_preview' => "'''Ampun! Kami kada kawa manarusakan babakan Pian karana kahilangan sési data.'''
 Cubai pang sa'asa pulang.
@@ -739,6 +739,7 @@ Babakan ini kada ditarima hagan mancagah kasalahan pada naskah tungkaran.
 Nangini ambahanu tajadi amun Pian mamuruk sabuah layanan proxy buggy bapandal web kada bangaran.",
 'edit_form_incomplete' => "'''Babarapa hagian matan purmulir babakan kada sampai server; pariksa pulang apakah babakan Pian tatap utuh wan cubai lagi.'''",
 'editing' => 'Mambabak $1',
+'creating' => 'Ma-ulah $1',
 'editingsection' => 'Mambabak $1 (hagian)',
 'editingcomment' => 'Mambabak $1 (hagian hanyar)',
 'editconflict' => 'Babakan bacakut: $1',
@@ -761,7 +762,7 @@ Pian jua bajanji ka kami amun Pian manulis ini saurangan, atawa manjumput ini ma
 Amun Pian kada hakun tulisan Pian dibabak kada baumpat lalu, lalu ai kada usah manyumbang di sia.<br />
 Pian jua bajanji ka kami amun Pian manulis ini saurangan, atawa manjumput ini matan sabuah asal mula ampun umum atawa nang samacam asal mula bibas (lihati $1 gasan rarincian).
 '''Jangan kirimkan gawian bahak cipta kada baijin!'''",
-'longpageerror' => "'''Kasalahan: Naskah nang Pian kirim panjangnya $1 kilubita, nangapa tapanjang pada pamanjangnya nang kawa $2 kilubita.'''
+'longpageerror' => "'''Kasalahan: Naskah nang Pian kirim panjangnya {{PLURAL:$1|asa kilubita|$1 kilubita}}, nangapa tapanjang pada pamanjangnya nang kawa {{PLURAL:$2|asa kilubita|$2 kilubita}}.'''
 Nangini kada kawa disimpan.",
 'readonlywarning' => "'''Paringatan: Basis data sudah tasunduk gasan diharagu, jadinya Pian kada kawa manyimpan babakab Pian parhatan ini.'''
 Pian kawa amun handak cut-n-paste naskah ka sabuah barakas naskah wan simpan ini gasan kaina.
@@ -804,6 +805,7 @@ Ini cungul pinanya sudah tahapus.',
 'edit-no-change' => 'Babakan Pian diabaiakan, karana kadada parubahan diulah ka naskah ini.',
 'edit-already-exists' => 'Kada kawa maulah sabuah tungkaran hanyar.
 Nangini sudah ada.',
+'defaultmessagetext' => 'Naskah baku pasan',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Paringatan:''' Tungkaran ini mangandung kabanyakan pungsi parser kiauan.
@@ -961,7 +963,7 @@ Muhun pariksa lolog.',
 
 # Suppression log
 'suppressionlog' => 'Log panikinan',
-'suppressionlogtext' => 'Nang di bawah adalah sabuah daptar matan pahahapusan wan Pamblublukiran tamasuk isi tasungkup matan papambakal. Lihati [[Special:IPBlockList|Daptar IP diblukir]] gasan daptar matan uprasi tahanyar tatangatan wan blublukir.',
+'suppressionlogtext' => 'Nang di bawah adalah sabuting daptar matan pahapusan wan pamblukiran tamasuk isi tasungkup matan pambakal. Lihati [[Special:BlockList|Daptar diblukir]] gasan daptar matan uprasi tahanyar tatangatan wan blukir.',
 
 # History merging
 'mergehistory' => 'Gabungakan hahalam tungkaran',
@@ -1002,7 +1004,7 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'compareselectedversions' => 'Tandingakan ralatan nang dipilih',
 'showhideselectedversions' => 'Tampaiakan/sungkupakan ralatan-ralatan',
 'editundo' => 'walangi',
-'diff-multi' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih {{PLURAL:$2|asa pamuruk|$2 papamuruk}} kada ditampaiakan)',
+'diff-multi' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih {{PLURAL:$2|asa pamakai|$2 papamakai}} kada ditampaiakan)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih labih pada $2 {{PLURAL:$2|pamuruk|papamuruk}} kada ditampaiakan)',
 
 # Search results
@@ -1024,7 +1026,7 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'viewprevnext' => 'Tiringi ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Papilihan manggagai',
 'searchmenu-exists' => "'''Ada tungkaran bangaran \"[[:\$1]]\" dalam wiki ini.'''",
-'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ini!'''",
+'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ngini!'''",
 'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Janaki daptar tungkaran lawan awalan ngini]]',
 'searchprofile-articles' => 'Tungkaran isi',
@@ -1042,7 +1044,7 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'search-result-score' => 'Kacucukan: $1%',
 'search-redirect' => '(Paugahan $1)',
 'search-section' => '(hagian $1)',
-'search-suggest' => 'Inikah maksud Pian: $1',
+'search-suggest' => 'Nginikah maksud Pian: $1',
 'search-interwiki-caption' => 'Dingsanak rangka gawian',
 'search-interwiki-default' => 'Kulihan $1',
 'search-interwiki-more' => '(lagi)',
@@ -1179,7 +1181,7 @@ Pariksa tag HTML.',
 'prefs-help-realname' => 'Ngaran bujur adalah pilihan haja.
 Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan gawian Pian.',
 'prefs-help-email' => 'Alamat suril adalah opsional, tagal pun parlu gasan mambulikakan setelan katasunduk, amunai Pian kada ingatan.',
-'prefs-help-email-others' => 'Pian kawa jua maijinakan urang mangiau Pian lung tungkaran pamuruk atawa pamandiran Pian kada parlu manampaiakan identitas Pian.',
+'prefs-help-email-others' => 'Pian kawa jua maijinakan urang mangiau Pian lung tungkaran pamakai atawa pamandiran Pian kada parlu manampaiakan identitas Pian.',
 'prefs-help-email-required' => 'Alamat suril diparluakan.',
 'prefs-info' => 'Panjalasan pandal',
 'prefs-i18n' => 'Intarnasionalisasi',
@@ -1357,17 +1359,17 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'recentchanges-legend' => 'Pilihan parubahan tahanyar',
 'recentchangestext' => 'Jajak parubahan wiki pahanyarnya pada tungkaran ngini',
 'recentchanges-feed-description' => 'Susuri parubahan pahanyarnya dalam wiki di kitihan ini',
-'recentchanges-label-newpage' => 'Babakan ini maulah sabuah tungkaran hanyar',
-'recentchanges-label-minor' => 'Ini adalah sabuah babakan sapalih',
-'recentchanges-label-bot' => 'Babakan ini digawi ulih saikung bot',
-'recentchanges-label-unpatrolled' => "Babakan ini baluman ta'awasi",
+'recentchanges-label-newpage' => 'Babakan ngini maulah sabuah tungkaran hanyar',
+'recentchanges-label-minor' => 'Ngini adalah sabuah babakan sapalih',
+'recentchanges-label-bot' => 'Babakan ngini digawi ulih saikung bot',
+'recentchanges-label-unpatrolled' => "Babakan ngini baluman ta'awasi",
 'rcnote' => "Di bawah ni {{PLURAL:$1|'''1'''|'''$1'''}} parubahan tahanyar dalam {{PLURAL:$2|'''1''' hari|'''$2''' hari}} tauncit, sampai $4 pukul $5.",
 'rcnotefrom' => "Di bawah ngini parubahan tumatan '''$2''' (ditampaiakan sampai '''$1''' parubahan)",
 'rclistfrom' => 'Tampaiakan parubahan tahanyar matan $1',
 'rcshowhideminor' => '$1 pambabakan sapalih',
 'rcshowhidebots' => '$1 bot',
-'rcshowhideliu' => '$1 pamuruk nang babuat di log',
-'rcshowhideanons' => '$1 pamuruk kada bangaran',
+'rcshowhideliu' => '$1 pamakai nang babuat di log',
+'rcshowhideanons' => '$1 pamakai kada bangaran',
 'rcshowhidepatr' => "$1 babakan ta'awasi",
 'rcshowhidemine' => '$1 babakan ulun',
 'rclinks' => 'Tampaiakan $1 parubahan tahanyar dalam $2 hari tauncit<br />$3',
@@ -1393,7 +1395,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'recentchangeslinked-toolbox' => 'Parubahan tarait',
 'recentchangeslinked-title' => 'Parubahan nang tarait lawan "$1"',
 'recentchangeslinked-noresult' => 'Kadada parubahan pada tautan tutungkaran salawas wayah ditantuakan',
-'recentchangeslinked-summary' => "Ini adalah sabuah daptar parubahan nang diulah hahanyar ini pada tungkaran batautan matan sabuah tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
+'recentchangeslinked-summary' => "Ngini adalah sabuah daptar parubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuah tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
 Tutungkaran dalam [[Special:Watchlist|daptar itihan Pian]] ditandai '''kandal'''.",
 'recentchangeslinked-page' => 'Ngaran tungkaran:',
 'recentchangeslinked-to' => 'Tampaiakan parubahan matan tungkaran-tungkaran nang tataut lawan tungkaran nang disurungakan',
@@ -1651,7 +1653,7 @@ Parhatan disaring ulih pamuruk, babarakas nang pamuruk hunggah ralatan pahanyarn
 # File description page
 'file-anchor-link' => 'Barakas',
 'filehist' => 'Barakas halam',
-'filehist-help' => 'Klik pada tanggal/waktu gasan maniringi barakas ini pada wayah itu.',
+'filehist-help' => 'Klik pada tanggal/waktu gasan maniringi barakas ngini pada wayah itu.',
 'filehist-deleteall' => 'hapus samunyaan',
 'filehist-deleteone' => 'hapus',
 'filehist-revert' => 'bulikakan',
@@ -1660,13 +1662,13 @@ Parhatan disaring ulih pamuruk, babarakas nang pamuruk hunggah ralatan pahanyarn
 'filehist-thumb' => 'Pahalusan',
 'filehist-thumbtext' => 'Pahalusan gasan bantuk per $1',
 'filehist-nothumb' => 'Kadada thumbnail',
-'filehist-user' => 'Pamuruk',
+'filehist-user' => 'Pamakai',
 'filehist-dimensions' => 'Matra',
 'filehist-filesize' => 'Ukuran barakas',
 'filehist-comment' => 'Ulasan',
 'filehist-missing' => 'Barakas hilang',
 'imagelinks' => 'Tautan barakas',
-'linkstoimage' => '{{PLURAL:$1|tautan tungkaran|$1 tautan tungkaran}} dudi ka barakas ini:',
+'linkstoimage' => '{{PLURAL:$1|tautan tungkaran|$1 tautan tungkaran}} dudi ka barakas ngini:',
 'linkstoimage-more' => 'Labihan pada $1 {{PLURAL:$1|tatautan tungkaran|tautan tutungkaran}} ka barakas ngini.
 Daptar barikut manampaiakan {{PLURAL:$1|tautan panambaian tungkaran|$1 panambaian tatautan tungkaran}} ka barakas ngini haja.
 Sabuah [[Special:WhatLinksHere/$2|daptar hibak]] tasadia.',
@@ -1932,7 +1934,7 @@ Protokol nang didukung: <tt>$1</tt> (jangan tambahakan dalam panggagaian Pian)',
 'activeusers-noresult' => 'Kadada papamuruk tatamu.',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Log pamuruk hanyar',
+'newuserlogpage' => 'Log pamakai hanyar',
 'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
 
 # Special:ListGroupRights
@@ -2075,7 +2077,7 @@ kitihan-bulik wan pangganian labih jauh:
 'historywarning' => "'''Paringatan:''' Tungkaran nang Pian pasal hagan hapus baisi sabuah halam sakitar $1 {{PLURAL:$1|ralatan|raralatan}}:",
 'confirmdeletetext' => 'Pian handak mahapus sabuah tungkaran awan samunyaan halamnya.
 Muhun mamastiakan amun Pian handak manggawi ini, bahwasa Pian paham akibatnya, wan apa nang Pian gawi ini sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan {{SITENAME}}]].',
-'actioncomplete' => 'Pangulahan tuntung',
+'actioncomplete' => 'Pa-ulahan tuntung',
 'actionfailed' => 'Palakuan luput',
 'deletedtext' => '"$1" sudah tahapus. Lihati $2 sabuah rakaman gasan nang hanyar ni tahapus.',
 'dellogpage' => 'Log pahapusan',
@@ -2250,8 +2252,8 @@ $1',
 'blanknamespace' => '(Tatambaian)',
 
 # Contributions
-'contributions' => 'Sumbangan pamuruk',
-'contributions-title' => 'Sumbangan pamuruk gasan $1',
+'contributions' => 'Sumbangan pamakai',
+'contributions-title' => 'Sumbangan pamakai gasan $1',
 'mycontris' => 'Sumbangan ulun',
 'contribsub2' => 'Gasan $1 ($2)',
 'nocontribs' => 'Kadada parubahan taugai parsis awan karitaria ngini.',
@@ -2259,7 +2261,7 @@ $1',
 'month' => 'Matan bulan (wan sabalumnya):',
 'year' => 'Matan tahun (wan sabalumnya):',
 
-'sp-contributions-newbies' => 'Tampaiakan sumbangan pamuruk-pamuruk hanyar haja',
+'sp-contributions-newbies' => 'Tampaiakan sumbangan papamakai hanyar haja',
 'sp-contributions-newbies-sub' => 'Gasan akun hanyar',
 'sp-contributions-newbies-title' => 'Sumbangan pamuruk gasan akun hanyar',
 'sp-contributions-blocklog' => 'Log blukir',
@@ -2273,7 +2275,7 @@ Log blukir pahabisannya tasadia di bawah ni gasan rujukan:',
 'sp-contributions-blocked-notice-anon' => 'Alamat IP ngini parhatan ini diblukir.
 Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
 'sp-contributions-search' => 'Gagai gasan sumbangan',
-'sp-contributions-username' => 'Alamat IP atawa ngaran pamuruk:',
+'sp-contributions-username' => 'Alamat IP atawa ngaran-pamakai:',
 'sp-contributions-toponly' => 'Tampaiakan hanya ralatan tauncit',
 'sp-contributions-submit' => 'Gagai',
 
@@ -2334,8 +2336,8 @@ Isi sabuah alasan khas di bawah (gasan cuntuh, manulisakan tutungkaran nang suah
 'ipb-confirm' => 'Yakinakan blukir',
 'badipaddress' => 'Alamat IP kada sah',
 'blockipsuccesssub' => 'Pamblukiran ruhui',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] sudah diblukir.<br />
-Janaki [[Special:BlockList|daptar IP dibluk]] hagan maniring-pulang blukir.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] hudah diblukir.<br />
+Janaki [[Special:BlockList|daptar dibluk]] hagan maniring-pulang blukir.',
 'ipb-blockingself' => 'Pian pasal mamblukir Pian surang! Bujurkah Pian mahandaki ngitu?',
 'ipb-confirmhideuser' => 'Pian pasal mamblukir saurang pamuruk awan "sungkupakan pamuruk" di-kawa-akan. Ngini akan manikin/kadada ngaran pamuruk dalam samunyaan daptar wan log masukan. Pian yakin kah handak manggawi ngitu?',
 'ipb-edit-dropdown' => 'Aalasan pamblukiran babakan',
@@ -2350,7 +2352,7 @@ Janaki [[Special:BlockList|daptar IP dibluk]] hagan maniring-pulang blukir.',
 'unblocked-range' => '$1 sudah dilapas blukirnya',
 'unblocked-id' => 'Blukir $1 sudah dibuang',
 'blocklist' => 'Pamuruk tablukir',
-'ipblocklist' => 'Pamuruk tablukir',
+'ipblocklist' => 'Pamakai tablukir',
 'ipblocklist-legend' => 'Ugai saurang pamuruk tablukir',
 'blocklist-userblocks' => 'Sungkupakan pamblukiran akun',
 'blocklist-tempblocks' => 'Sungkupakan pamblukiran samantara',
@@ -2389,8 +2391,8 @@ Log panikinan disadiakan di bawah gasan rujukan:',
 'blocklogentry' => 'mamblukir [[$1]] sampai wayah $2 $3',
 'reblock-logentry' => 'setelan blukir diubah gasan [[$1]] awan sabuah wayah kadaluarsa $2 $3',
 'blocklogtext' => 'Ngini adalah log matan blukir wan lapas-blukir pamuruk.
-Blukir alamat IP utumatis kada didaptar.
-Janaki [[Special:BlockList|daptar IP diblukir]] gasan daptar oparasi diikat wan diblukir tadamini.',
+Blukir alamat IP utumatis kada tadaptar.
+Janaki [[Special:BlockList|daptar diblukir]] gasan daptar uprasi dibabat wan pamblukiran pahanyarnya.',
 'unblocklogentry' => 'Mahilangakan blukir "$1"',
 'block-log-flags-anononly' => 'papamuruk kada bangaran haja',
 'block-log-flags-nocreate' => 'Paulahan akun dipajahakan',
@@ -2639,31 +2641,31 @@ Muhun cubai pulang.',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ralatan|raralatan}} matan $2',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tungkaran pamuruk Pian',
+'tooltip-pt-userpage' => 'Tungkaran pamakai Pian',
 'tooltip-pt-anonuserpage' => 'Tungkaran pamuruk matan alamat IP Pian mambabak sawagai',
 'tooltip-pt-mytalk' => 'Tungkaran pamandiran Pian',
 'tooltip-pt-anontalk' => 'Pamandiran pasal bababakan matan alamat IP ngini',
 'tooltip-pt-preferences' => 'Nang Pian katuju',
 'tooltip-pt-watchlist' => 'Daptar tungkaran-tungkaran nang Pian itihi parubahannya',
 'tooltip-pt-mycontris' => 'Daptar sumbangan Pian',
-'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
+'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ngini kada kawajiban pang',
 'tooltip-pt-anonlogin' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
 'tooltip-pt-logout' => 'Kaluar',
 'tooltip-ca-talk' => 'Pamandiran pasal isi tungkaran',
-'tooltip-ca-edit' => 'Pian kawa mambabak tungkaran ini. Tabéngkéng amun mamuruk picikan titilikan sabalum manyimpan',
+'tooltip-ca-edit' => 'Pian kawa mambabak tungkaran ngini. Tabéngkéng amun mamakai picikan titilikan sabalum manyimpan',
 'tooltip-ca-addsection' => 'Mulai hagian hanyar',
-'tooltip-ca-viewsource' => 'Tungkaran ini dilindungi. Pian kawa maniring asal mulanya.',
-'tooltip-ca-history' => 'Raralatan bahari tungkaran ini',
+'tooltip-ca-viewsource' => 'Tungkaran ngini dilindungi. Pian kawa maniring asal mulanya.',
+'tooltip-ca-history' => 'Raralatan bahari tungkaran ngini',
 'tooltip-ca-protect' => 'Lindungi tungkaran ini',
 'tooltip-ca-unprotect' => 'Ganti parlindungan tungkaran ngini',
 'tooltip-ca-delete' => 'Hapus tungkaran ini',
 'tooltip-ca-undelete' => 'Bulikakan babakan ka tungkaran ini sabalum tungkaran ini dihapus',
-'tooltip-ca-move' => 'Pindahakan tungkaran ini',
-'tooltip-ca-watch' => 'Tambahi tungkaran ini ka daptar itihan Pian',
-'tooltip-ca-unwatch' => 'Buang tungkaran ini matan daptar itihan Pian',
+'tooltip-ca-move' => 'Pindahakan tungkaran ngini',
+'tooltip-ca-watch' => 'Tambahi tungkaran ngini ka daptar itihan Pian',
+'tooltip-ca-unwatch' => 'Buang tungkaran ngini matan daptar itihan Pian',
 'tooltip-search' => 'Gagai {{SITENAME}}',
 'tooltip-search-go' => 'Tulak ka sabuah tungkaran bangaran sama munnya sudah ada',
-'tooltip-search-fulltext' => 'Gagai tungkaran nang baisi naskah nangkaya ini',
+'tooltip-search-fulltext' => 'Gagai tungkaran nang baisi naskah nangkaya ngini',
 'tooltip-p-logo' => 'Ilangi tungkaran tatambaian',
 'tooltip-n-mainpage' => 'Ilangi tungkaran tatambaian',
 'tooltip-n-mainpage-description' => 'Ilangi Tungkaran Tatambaian',
@@ -2673,17 +2675,17 @@ Muhun cubai pulang.',
 'tooltip-n-randompage' => 'Tampaiakan sabuah babarang tungkaran',
 'tooltip-n-help' => 'Wadah maugai patulung',
 'tooltip-t-whatlinkshere' => 'Daptar samunyaan tungkaran wiki nang ada tautan ka sia',
-'tooltip-t-recentchangeslinked' => 'Parubahan tahanyar dalam tutungkaran tataut matan tungkaran ini',
+'tooltip-t-recentchangeslinked' => 'Parubahan tahanyar dalam tutungkaran tataut matan tungkaran ngini',
 'tooltip-feed-rss' => 'Kitihan RSS gasan tungkaran ini',
-'tooltip-feed-atom' => 'Kitihan Atum gasan tungkaran ini',
-'tooltip-t-contributions' => 'Tiringi daptar sumbangan pamuruk ini',
-'tooltip-t-emailuser' => 'Kirimi surel ka pamuruk ini',
+'tooltip-feed-atom' => 'Kitihan Atum gasan tungkaran ngini',
+'tooltip-t-contributions' => 'Sabuah daptar sumbangan pamakai ngini',
+'tooltip-t-emailuser' => 'Kirimi surel ka pamakai ini',
 'tooltip-t-upload' => 'Hunggahakan babarakas',
 'tooltip-t-specialpages' => 'Daptar samunyaan tungkaran istimiwa',
-'tooltip-t-print' => 'Nang kawa dicitaknya tungkaran ini',
-'tooltip-t-permalink' => 'Tautan tatap ka raralatan tungkaran ini',
+'tooltip-t-print' => 'Nang kawa dicitaknya tungkaran ngini',
+'tooltip-t-permalink' => 'Tautan tatap ka raralatan tungkaran ngini',
 'tooltip-ca-nstab-main' => 'Tiringi tungkaran isi',
-'tooltip-ca-nstab-user' => 'Tiring tungkaran pamuruk',
+'tooltip-ca-nstab-user' => 'Tiring tungkaran pamakai',
 'tooltip-ca-nstab-media' => 'Tiringi tungkaran media',
 'tooltip-ca-nstab-special' => 'Nangini sabuah tungkaran istimiwa nang kada kawa dibabak.',
 'tooltip-ca-nstab-project' => 'Tiringi tungkaran rangka gawian',
@@ -2694,14 +2696,14 @@ Muhun cubai pulang.',
 'tooltip-ca-nstab-category' => 'Lihati tungkaran tumbung',
 'tooltip-minoredit' => 'Tandai ini sabagai sabuah pambabakan sapalih',
 'tooltip-save' => 'Simpan parubahan Pian',
-'tooltip-preview' => 'Tilik parubahan Pian, muhun puruk ini sabalum manyimpan!',
+'tooltip-preview' => 'Tilik parubahan Pian, muhun pakai ngini sabalum manyimpan!',
 'tooltip-diff' => 'Tampaiakan nang apa parubahan nang Pian ulah',
-'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ini',
+'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ngini',
 'tooltip-watch' => 'Tambahakan tungkaran ini ka daptar itihan Pian',
 'tooltip-recreate' => 'Ulah pulang tungkaran biar gin suah dihapus',
 'tooltip-upload' => 'Mulai pangunggahan',
-'tooltip-rollback' => 'Bulikakan ka babakan-babakan tungkaran ini matan panyumbang tauncit dalam sakali klik.',
-'tooltip-undo' => 'Mamantukakan ralatan ini wan mambuka kutak pambabakan lawan mode tilik. Alasan kawa ditambahakan di kutak kasimpulan.',
+'tooltip-rollback' => 'Bulikakan ka babakan-babakan tungkaran ngini matan panyumbang tauncit dalam sakali klik.',
+'tooltip-undo' => 'Mamantukakan ralatan ngini wan mambuka kutak pambabakan lawan mode tilik. Alasan kawa ditambahakan di kutak kasimpulan.',
 'tooltip-preferences-save' => 'Simpan kakatujuan',
 'tooltip-summary' => 'Buati sabuah kasimpulan handap',
 
@@ -2786,7 +2788,7 @@ Manarusakan ngini, kawa manyarang sistem Pian.",
 'svg-long-desc' => 'Barakas SVG, nominal $1 × $2 piksel, basar barakas: $3',
 'show-big-image' => 'Ukuran hibak',
 'show-big-image-preview' => 'Takaran tilikan ngini: $1.',
-'show-big-image-other' => 'Resolusi lain: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Risulusi|Risulusi}} lain: $1.',
 'show-big-image-size' => '$1 × $2 piksal',
 'file-info-gif-looped' => 'mambulat',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|pigura|pipigura}}',
@@ -2822,7 +2824,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => 'Barakas ini mangandung panjalasan tambahan, mungkin ditambahakan ulih kudakan atawa paundai nang dipurukakan gasan maulah atawa digitalisasi barakas. Amun barakas ini sudah diubah, parincian nang ada mungkin kada sapanuhnya sasuai lawan barakas nang diubah.',
+'metadata-help' => 'Barakas ngini mangandung panjalasan tambahan, mungkin ditambahakan ulih kudakan atawa paundai nang dipurukakan gasan maulah atawa digitalisasi barakas. Amun barakas ngini sudah diubah, parincian nang ada mungkin kada sapanuhnya sasuai lawan barakas nang diubah.',
 'metadata-expand' => 'Tampaiakan tambahan rincian',
 'metadata-collapse' => 'Sungkupakan tambahan rincian',
 'metadata-fields' => 'Pancitraan metadata tadaptar dalam pasan ngini akan masuk dalam tungkaran pancitraan wayah tabel metadata tasungkup. Nang lainnya cagaran babaku tasungkup.
@@ -3230,7 +3232,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 'exif-urgency-other' => 'Ganti-suai utamaan ($1)',
 
 # External editor support
-'edit-externally' => 'Babak barakas ini puruk sabuah aplikasi luar',
+'edit-externally' => 'Babak barakas ngini puruk sabuah aplikasi luar',
 'edit-externally-help' => '(Lihati [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] untuk panjalasan labih)',
 
 # 'all' in various places, this might be different for inflected languages
@@ -3431,6 +3433,7 @@ Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuah salinan Lisansi Publik
 'version-software' => 'Parangkat lunak tapasang',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Virsi',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Wadah barakas',
@@ -3560,9 +3563,9 @@ Situs ngini mangalami kangalihan teknik.',
 'logentry-move-move_redir-noredirect' => '$1 diugah tungkaran $3 ka $4 lung sabuah paugahan awan-kada maninggalakan sabuah paugahan',
 'logentry-patrol-patrol' => "$1 diciri'i ralatan $4 matan tungkaran $3 taawasi",
 'logentry-patrol-patrol-auto' => "$1 utumatis diciri'i ralatan $4 matan tungkaran $3 taawasi",
-'logentry-newusers-newusers' => '$1 diulah sabuah akun pamuruk',
-'logentry-newusers-create' => '$1 diulah sabuah akun pamuruk',
-'logentry-newusers-create2' => '$1 diulah sabuah akun pamuruk $3',
+'logentry-newusers-newusers' => '$1 ma-ulah sabuting akun pamakai',
+'logentry-newusers-create' => '$1 ma-ulah sabuting akun pamakai',
+'logentry-newusers-create2' => '$1 ma-ulah sabuting akun pamakai $3',
 'logentry-newusers-autocreate' => 'Akun $1 utumatis diulah',
 'newuserlog-byemail' => 'Katasunduk dikirimakan lung suril.',
 
index 85f28b5..306ed62 100644 (file)
@@ -311,7 +311,7 @@ $1',
 'disclaimerpage' => 'Project:সাধারণ দাবিত্যাগ',
 'edithelp' => 'সম্পাদনা সহায়িকা',
 'edithelppage' => 'Help:কিভাবে একটি পাতা সম্পাদনা করবেন',
-'helppage' => 'Help:সহায়িà¦\95া',
+'helppage' => 'Help:সà§\82à¦\9aি',
 'mainpage' => 'প্রধান পাতা',
 'mainpage-description' => 'প্রধান পাতা',
 'policy-url' => 'Project:নীতিমালা',
@@ -451,6 +451,9 @@ $2',
 'customjsprotected' => 'আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।',
 'ns-specialprotected' => '{{ns:special}} নামস্থানে পাতাসমূহ সম্পাদনা করা যাবে না।',
 'titleprotected' => "[[User:$1|$1]]-কে এই শিরোনামের পাতা সৃষ্টি করতে বাধা দেয়া হচ্ছে। কারণ: ''$2''।",
+'filereadonlyerror' => '"$1" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
+
+একজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: "$3"',
 
 # Virus scanner
 'virus-badscanner' => "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: ''$1''",
@@ -534,6 +537,7 @@ $2',
 'emailconfirmlink' => 'আপনার ই-মেইলের ঠিকানা নিশ্চিত করুন',
 'invalidemailaddress' => 'এই ই-মেইল ঠিকানাটি গ্রহণযোগ্য নয়, কারণ সম্ভবত এটি সঠিক ফরম্যাটে লেখা হয়নি। অনুগ্রহ করে সঠিক ফরম্যাটে লেখা ই-মেইল ঠিকানা দিন, অথবা ক্ষেত্রটি খালি রাখুন।',
 'cannotchangeemail' => 'একাউন্ট ইমেইল ঠিকানা এই উইকিতে পরিবর্তন করা যাবে না।',
+'emaildisabled' => 'এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।',
 'accountcreated' => 'অ্যাকাউন্ট তৈরি করা হয়েছে',
 'accountcreatedtext' => '$1 এর জন্য ব্যবহারকারী অ্যাকাউন্ট তৈরি করা হয়েছে।',
 'createaccount-title' => '{{SITENAME}}-এর জন্য অ্যাকাউন্ট সৃষ্টি',
@@ -578,6 +582,7 @@ $2',
 'passwordreset-username' => 'ব্যবহারকারী নাম:',
 'passwordreset-domain' => 'ডোমেইন:',
 'passwordreset-capture' => 'অনুসন্ধানের ফলাফলের ইমেইল দেখুন?',
+'passwordreset-capture-help' => 'আপনি যদি এই চেক বক্সে ক্লিক করেন, তবে অস্থায়ী শব্দচাবিসহ একটি ই-মেইল আপনাকে দেখানো হবে ও সেইসাথে ব্যবহারকারীকে তা পাঠানো হবে।',
 'passwordreset-email' => 'ইমেইল ঠিকানা:',
 'passwordreset-emailtitle' => '{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি',
 'passwordreset-emailtext-ip' => 'কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার
@@ -712,12 +717,12 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'userpage-userdoesnotexist-view' => 'ব্যবহারকারী অ্যাকাউন্ট "$1" অনিবন্ধিত।',
 'blocked-notice-logextract' => 'এই ব্যবহারকারী বর্তমানে ব্লক রয়েছে।
 রেফারেন্সের জন্য সাম্প্রতিক ব্লক লগ ভুক্তি নিচে দেওয়া হল:',
-'clearyourcache' => "'''লক্ষ্য করুন:আপনার পছন্দগুলো রক্ষা করার পর পরিবর্তনগুলো দেখার জন্য আপনাকে ব্রাউজারের ক্যাশ এড়াতে হতে পারে।'''
-*'''ফায়ারফক্স/সাফারি:''' ''শিফট'' কী চেপে ধরে ''রিলোড''-এ ক্লিক করুন, কিংবা হয় ''কন্ট্রোল-F5'' অথবা ''কন্ট্রোল-R''(ম্যাক-এ ''কমান্ড-R'') একসাথে চাপুন;
-*'''গুগল ক্রোম:''' ''কন্ট্রোল-শিফট-R''  (ম্যাক-এ ''কমান্ড-শিফট-R'') চাপতে হবে
-*'''ইন্টারনেট এক্সপ্লোরার:''' ''কন্ট্রোল'' চেপে ধরে ''রিফ্রেশ''-এ ক্লিক করুন, কিংবা ''কন্ট্রোল-F5'' চাপুন
-*'''কংকারার:''' কেবল ''রিলোড'' ক্লিক করলেই বা ''F5'' চাপলেই চলবে;
-*'''অপেরা:''' ''Tools→Preferences''-এ গিয়ে ক্যাশ পরিষ্কার করে নিন;",
+'clearyourcache' => "'''লক্ষ্য করুন:''' সংরক্ষণের পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারে ক্যাশে পরিস্কার করার প্রয়োজন হতে পারে।
+* '''ফায়ারফক্স / সাফারি:''' ''শিফট'' কি ধরে রাখা অবস্থায় ''রিলোড''-এ ক্লিক করুন, অথবা ''Ctrl-F5'' বা ''Ctrl-R'' (ম্যাক-এ ''⌘-R'') চাপুন
+* '''গুগল ক্রোম:''' ''Ctrl-Shift-R'' (ম্যাক-এ ''⌘-Shift-R'') চাপুন
+* '''ইন্টারনেট এক্সপ্লোরার:''' ''Ctrl'' কি ধরে রাখা অবস্থায় ''রিফ্রেশ''-এ ক্লিক করুন, অথবা ''Ctrl-F5'' চাপুন
+* '''কনকুয়েরার:''' ''রিলোড''-এ ক্লিক করুন বা ''F5'' চাপুন
+* '''অপেরা:''' ''টুলস → প্রিফারেন্স''-এ গিয়ে ক্যাশে পরিস্কার করে নিন",
 'usercssyoucanpreview' => "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন CSS পরীক্ষা করুন।",
 'userjsyoucanpreview' => "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JavaScript পরীক্ষা করুন।",
 'usercsspreview' => "'''মনে রাখবেন আপনি আপনার জন্য বরাদ্ধকৃত সিএসএস প্রাকদর্শন করছেন।
@@ -730,7 +735,9 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'userinvalidcssjstitle' => "'''সতর্কীকরণ:''' \"\$1\" নামে কোন আবরণ নেই। মনে রাখবেন, পছন্দমাফিক .css এবং .js পাতাগুলি ছোট হাতের শিরোনাম ব্যবহার করে, যেমন {{ns:user}}:Foo/vector.css; কিন্তু এরকম শিরোনাম নয়: {{ns:user}}:Foo/Vector.css",
 'updated' => '(হালনাগাদ)',
 'note' => "'''নোট:'''",
-'previewnote' => "'''এটি প্রাকদর্শন মাত্র। কোনো পরিবর্তন এখনও সংরক্ষণ করা হয়নি!'''",
+'previewnote' => "'''খেয়াল করুন, এটি একটি প্রাকদর্শন মাত্র।'''
+আপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি!",
+'continue-editing' => 'সম্পাদনা চালিয়ে যান',
 'previewconflict' => 'এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।',
 'session_fail_preview' => "'''দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি। দয়া করে লেখাটি আবার জমা দেয়ার চেষ্টা করুন। যদি এতেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে বেরিয়ে গিয়ে আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন।'''",
 'session_fail_preview_html' => "'''দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।'''
@@ -741,6 +748,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'token_suffix_mismatch' => "'''আপনার সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, কারণ আপনার ক্লায়েন্ট প্রোগ্রামটি সম্পাদনা টেক্সটের বিরামচিহ্নগুলি গুলিয়ে ফেলেছে। পাতাটির টেক্সটে যাতে ক্ষতি না হয় সেজন্য সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে। আপনি কোন ত্রুটিপূর্ণ ওয়েব-ভিত্তিক বেনামী প্রক্সি সেবা ব্যবহার করলে এরকম হতে পারে।'''",
 'edit_form_incomplete' => "'''আপনার সম্পাদনার কিছু অংশ সার্ভারে পৌছায় নি; আপনার সম্পাদনা সম্পূর্ণরুপে আছে কিনা নিশ্চিত হয়ে আবার চেষ্টা করুন'''",
 'editing' => 'সম্পাদনা করছেন: $1',
+'creating' => '$1 পাতাটি তৈরি করছেন',
 'editingsection' => 'সম্পাদনা করছেন $1 (অনুচ্ছেদ)',
 'editingcomment' => 'সম্পাদনা করছেন $1 (নতুন অনুচ্ছেদ)',
 'editconflict' => 'সম্পাদনা দ্বন্দ্ব: $1',
@@ -759,7 +767,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন, বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন।
 '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না!'''",
 'copyrightwarning2' => "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
-'longpageerror' => "'''ত্রুটি: আপনার জমা দেয়া টেক্সটের পরিমাণ $1 কিলোবাইট, যা সর্বোচ্চ সীমা $2 কিলোবাইটের চেয়ে বেশি। এটি সংরক্ষণ করা সম্ভব নয়।'''",
+'longpageerror' => " '''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ $1 কিলোবাইট, যা সর্বোচ্চ সীমা $2 কিলোবাইটের চেয়ে বেশি। এটি সংরক্ষণ করা সম্ভব নয়।'''",
 'readonlywarning' => "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।
 আপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।'''
 
@@ -801,6 +809,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'edit-no-change' => 'আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।',
 'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
 পাতাটি ইতিমধ্যেই বিদ্যমান।',
+'defaultmessagetext' => 'আদি টেক্সট',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।
@@ -814,6 +823,8 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 তাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
 'post-expand-template-argument-category' => 'বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা',
 'parser-template-loop-warning' => 'টেম্পলেট লুপ সনাক্ত হয়েছে: [[$1]]',
+'parser-template-recursion-depth-warning' => 'টেমপ্লেট  পুনরাবৃত্তি (রিকার্শন)  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
+'language-converter-depth-warning' => 'ভাষা পরিবর্তন  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
 
 # "Undo" feature
 'undo-success' => 'সম্পাদনাটি বাতিল করা যাবে। অনুগ্রহ করে নিচের তুলনাটি পরীক্ষা করে দেখুন ও নিশ্চিত করুন যে এটাই আপনি করতে চান, এবং তারপর নিচের সম্পাদনাগুলি সংরক্ষণ করে সম্পাদনাটির বাতিল প্রক্রিয়া সমাপ্ত করুন।',
@@ -904,6 +915,8 @@ $3-এর দেয়া কারণ হল ''$2''",
 'revdelete-submit' => 'নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো',
 'revdelete-success' => "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
 'logdelete-success' => "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
+'logdelete-failure' => "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''
+$1",
 'revdel-restore' => 'দৃশ্যমানতা পরিবর্তন করো',
 'revdel-restore-deleted' => 'অপসারিত সংস্করণ',
 'revdel-restore-visible' => 'প্রদর্শনযোগ্য সংস্করণ',
@@ -1152,7 +1165,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'userrights-lookup-user' => 'ব্যবহারকারী দল ব্যবস্থাপনা করুন',
 'userrights-user-editname' => 'ব্যবহারকারীর নাম লিখুন:',
 'editusergroup' => 'ব্যবহারকারীর দল সম্পাদনা করো',
-'editinguser' => "ব্যবহারকারী সম্পাদনা করছেন '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "'''[[User:$1|$1]]''' $2 ব্যবহারকারীর জন্য ব্যবহারকারী অধিকার পরিবর্তন করছেন",
 'userrights-editusergroup' => 'ব্যবহারকারীর দল সম্পাদনা করো',
 'saveusergroups' => 'ব্যবহারকারীর দল সংরক্ষণ করো',
 'userrights-groupsmember' => 'সদস্য:',
@@ -1362,6 +1375,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'illegalfilename' => '"$1" ফাইলনামটিতে এমন কিছু ক্যারেক্টার আছে যেগুলি পাতার শিরোনামে ব্যবহার করা অবৈধ। অনুগ্রহ করে ফাইলটি নতুন করে নামকরণ করুন এবং তারপর আপলোড করার চেষ্টা করুন।',
 'badfilename' => 'ফাইলের নামটি পরিবর্তন করে $1" করা হয়েছে।',
 'filetype-badmime' => '"$1" MIME ধরনের ফাইল আপলোড করা যাবে না।',
+'filetype-bad-ie-mime' => 'এই ফাইলটি আপলোড করা সম্ভব নয় কারণ ইন্টারনেট এক্সপ্লোরার একে "$1" হিসেবে সনাক্ত করতে পারে, যা অননুমোদিত এবং সম্ভাব্য ক্ষতিকারক ফাইল টাইপ।',
 'filetype-unwanted-type' => "'''\".\$1\"''' ফাইল ধরনটি অগ্রহণযোগ্য।
 পছন্দনীয় {{PLURAL:\$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হলো \$2।",
 'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|ফাইল ধরনটি অনুমোদিত নয়|ফাইল ধরনগুলো অনুমোদিত নয়}}। অনুমোদিত {{PLURAL:$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হল $2।',
@@ -1371,12 +1385,14 @@ $3-এর দেয়া কারণ হল ''$2''",
 'filename-tooshort' => 'ফাইল নামটি খুব ছোট।',
 'filetype-banned' => 'এই ধরনের ফাইল নিষিদ্ধ।',
 'illegal-filename' => 'ফাইলের এই নামটি গ্রহণযোগ্য নয়।',
+'overwrite' => 'বিদ্যমান কোনো ফাইল প্রতিস্থাপন গ্রহণযোগ্য নয়।',
 'unknown-error' => 'একটি অজানা ত্রুটি দেখা দিয়েছে।',
 'tmp-create-error' => 'অস্থায়ী ফাইল তৈরি করা যাবে না।',
 'tmp-write-error' => 'অস্থায়ী ফাইলে লিখতে সমস্যা হয়েছে।',
 'large-file' => '$1-এর চেয়ে বড় আকারের ফাইল সুপারিশ করা হয় না; এই ফাইলটি $2।',
 'largefileserver' => 'সার্ভারে যতখানি অনুমোদিত তার চেয়ে এই ফাইলের আকার বড়।',
 'emptyfile' => 'আপনি যে ফাইলটি আপলোড করেছেন, তা খালি মনে হচ্ছে। ফাইলের নামে টাইপিং ত্রুটির কারণে এরকম হতে পারে। অনুগ্রহ করে পরীক্ষা করে দেখুন আপনি আসলেই এই ফাইলটি আপলোড করতে চান কি না।',
+'windows-nonascii-filename' => 'এই উইকি বিশেষ ক্যারেক্টারসমৃদ্ধ ফাইলের নাম সমর্থন করে না।',
 'fileexists' => "এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান। অনুগ্রহ করে '''<tt>[[:$1]]</tt>''' পরীক্ষা করে দেখুন, যদি আপনি এটি পরিবর্তনের ব্যাপারে নিশ্চিত না হন। [[$1|thumb]]",
 'fileexists-extension' => "একই নামের আরেকটি ফাইল আছে: [[$2|thumb]]
 * আপলোড করা ফাইলের নাম: '''<tt>[[:$1]]</tt>'''
@@ -1401,6 +1417,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'overwroteimage' => '"[[$1]]"-এর একটি নতুন সংস্করণ আপলোড করা হয়েছে',
 'uploaddisabled' => 'আপলোড নিষ্ক্রিয় আছে',
 'copyuploaddisabled' => 'ইউআরএল এর মাধ্যমে আপলোড নিস্ক্রিয় রয়েছে।',
+'uploadfromurl-queued' => 'আপনার আপলোড সারিবদ্ধ হয়েছে।',
 'uploaddisabledtext' => 'ফাইল আপলোড নিষ্ক্রিয়।',
 'php-uploaddisabledtext' => 'পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।
 অনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।',
@@ -1417,8 +1434,10 @@ $3-এর দেয়া কারণ হল ''$2''",
 'filewasdeleted' => 'এই নামের একটি ফাইল পূর্বে আপলোড করা হয়েছিল এবং তারপর মুছে ফেলা হয়েছিল। আপনি ফাইলটি আবার আপলোড করার আগে $1 পরীক্ষা করে দেখুন।',
 'filename-bad-prefix' => "আপনি যে ফাইলটি আপলোড করছেন, তার নাম '''\"\$1\"''' দিয়ে শুরু হয়েছে। এ ধরনের নাম সাধারণত ডিজিটাল ক্যামেরাগুলি স্বয়ংক্রিয়ভাবে দিয়ে থাকে এবং এগুলি ব্যাখ্যামূলক নয়। অনুগ্রহ করে আপনার ফাইলের জন্য আরও ব্যাখ্যামূলক একটি নাম পছন্দ করুন।",
 'upload-success-subj' => 'আপলোড সফল হয়েছে',
+'upload-success-msg' => '[$2] থেকে আপনার আপলোড সফল হয়েছে। এটি এখানে: [[:{{ns:file}}:$1]] পাওয়া যাবে',
 'upload-failure-subj' => 'আপলোড সমস্যা',
 'upload-warning-subj' => 'আপলোড সতর্কীকরণ',
+'upload-warning-msg' => '[$2] থেকে করা আপনার আপলোডে সমস্যা হয়েছে। সমস্যার সমাধানকল্পে আপনাকে সম্ভবত [[Special:Upload/stash/$1|আপলোড ফর্ম]]-এ ফিরে যেতে হবে।',
 
 'upload-proto-error' => 'ভুল প্রোটোকল',
 'upload-proto-error-text' => 'দূরবর্তী আপলোডের জন্য URLগুলি <code>http://</code> বা <code>ftp://</code> দিয়ে শুরু হওয়া আবশ্যক।',
@@ -1460,6 +1479,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'http-invalid-url' => 'ভুল ইউআরএল: $1',
 'http-read-error' => 'HTTP পঠন ত্রুটি।',
 'http-timed-out' => 'HTTP অনুরোধের সময় পার হয়েছে।',
+'http-curl-error' => 'ইউআরএল নিয়ে আসার ক্ষেত্রে ত্রুটি: $1',
 'http-host-unreachable' => 'URL-এ পৌঁছানো যায়নি',
 'http-bad-status' => 'HTTP অনুরোধের সময় কোন সমস্যা হয়েছে: $1 $2',
 
@@ -1544,6 +1564,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 ** ফাইলের অনুলিপি',
 'filedelete-edit-reasonlist' => 'অপসারণের কারণ সম্পাদনা',
 'filedelete-maintenance' => 'রক্ষণাবেক্ষণের সময় ফাইল অপরাসণ এবং পুনরুদ্ধার সাময়িকভাবে নিস্ক্রিয় রয়েছে।',
+'filedelete-maintenance-title' => 'ফাইলটি অপসারণ করা সম্ভব নয়',
 
 # MIME search
 'mimesearch' => 'MIME অনুসন্ধান',
@@ -1590,7 +1611,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'statistics-users-active-desc' => 'ব্যবহারকারী যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} একটি কাজ করেছেন।',
 'statistics-mostpopular' => 'সবচেয়ে বেশী বার দেখা পাতাসমূহ',
 
-'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহ',
+'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহে সংযোগকৃত পাতাসমূহ',
 'disambiguationspage' => 'Template:দ্ব্যর্থতা_নিরসন',
 'disambiguations-text' => "নিচের পাতাগুলি থেকে একটি '''দ্ব্যর্থতা নিরসন পাতা'''-তে সংযোগ আছে। এর পরিবর্তে এগুলি থেকে একটি উপযুক্ত বিষয়ে সংযোগ থাকা আবশ্যক।<br />যদি কোন পাতায় এমন কোন টেমপ্লেট থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে একটি দ্ব্যর্থতা নিরসন পাতা হিসেবে গণ্য করা হয়।",
 
@@ -1708,6 +1729,10 @@ $3-এর দেয়া কারণ হল ''$2''",
 'allpagesprefix' => 'এই উপসর্গবিশিষ্ট পাতাগুলো দেখাও:',
 'allpagesbadtitle' => 'প্রদত্ত পাতার শিরোনামটি অবৈধ ছিল অথবা এটিতে কোন আন্তঃভাষা বা আন্তঃউইকি উপসর্গ ছিল। এটিতে এক বা একাধিক ক্যারেক্টার থাকতে পারে যা শিরোনামে ব্যবহার করা সম্ভব নয়।',
 'allpages-bad-ns' => '{{SITENAME}}-এ "$1" নামের কোন নামস্থান নেই।',
+'allpages-hide-redirects' => 'পুনর্নির্দেশনাগুলো লুকাও',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'সাম্প্রতিকগুলো প্রদর্শন করো।',
 
 # Special:Categories
 'categories' => 'বিষয়শ্রেণীসমূহ',
@@ -2353,6 +2378,9 @@ $1',
 'import-logentry-interwiki' => '$1 উইকি-স্থানান্তরিত',
 'import-logentry-interwiki-detail' => '$2-এর করা $1 {{PLURAL:$1|সংশোধন|টি সংশোধন}}',
 
+# JavaScriptTest
+'javascripttest' => 'জাভাস্ক্রিপ্ট পরীক্ষা',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'আপনার ব্যবহারকারী পাতা',
 'tooltip-pt-anonuserpage' => 'যে আইপি ঠিকানা থেকে আপনি সম্পাদনা করছেন, তার ব্যবহারকারী পাতা',
@@ -2413,6 +2441,7 @@ $1',
 'tooltip-diff' => 'আপনি টেক্সটে কী কী পরিবর্তন করেছেন, তা দেখানো হোক।',
 'tooltip-compareselectedversions' => 'এই পাতার দুইটি নির্বাচিত সংস্করণের মধ্যে তুলনা দেখুন।',
 'tooltip-watch' => 'এই পাতাটি আমার নজরতালিকায় যোগ করো',
+'tooltip-watchlistedit-normal-submit' => 'শিরোনাম অপসারণ',
 'tooltip-recreate' => 'মুছে ফেলা সত্ত্বেও পাতাটি পুনরায় সৃষ্টি করুন',
 'tooltip-upload' => 'আপলোড শুরু করো',
 'tooltip-rollback' => '"পুনর্বহাল" এই পাতায় সর্বশেষ অবদানকারীর সম্পাদনাসমূহ বাতিল করে পাতাটিকে পূর্বাবস্থায় ফিরিয়ে দেয়',
@@ -2866,6 +2895,7 @@ $1',
 # Pseudotags used for GPSDestDistanceRef
 'exif-gpsdestdistance-k' => 'কিলোমিটার',
 'exif-gpsdestdistance-m' => 'ফাইল',
+'exif-gpsdestdistance-n' => 'নটিক্যাল মাইল',
 
 'exif-gpsdop-excellent' => 'খুব ভাল ($1)',
 'exif-gpsdop-good' => 'ভাল ($1)',
@@ -2893,6 +2923,7 @@ $1',
 
 'exif-rating-rejected' => 'প্রত্যাখাত',
 
+'exif-iimcategory-ace' => 'শিল্প, সংস্কৃতি এবং বিনোদন',
 'exif-iimcategory-clj' => 'অপরাধ ও আইন',
 'exif-iimcategory-dis' => 'দুর্যোগ ও দুর্ঘটনা',
 'exif-iimcategory-fin' => 'অর্থনীতি এবং বাণিজ্য',
@@ -2971,11 +3002,13 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 # action=purge
 'confirm_purge_button' => 'ঠিক আছে',
 'confirm-purge-top' => 'এই পাতার ক্যাশে পরিষ্কার করতে চান?',
+'confirm-purge-bottom' => 'পাতার ক্যাশে পরিস্কারের ফলে তা আপনাকে পাতাটির সবচেয়ে সাম্প্রতিক সংস্করণ প্রদর্শনে বাধ্য করে।',
 
 # action=watch/unwatch
 'confirm-watch-button' => 'ঠিক আছে',
 'confirm-watch-top' => 'এই পাতাটি আপনার নজরতালিকায় যুক্ত করা হবে?',
 'confirm-unwatch-button' => 'ঠিক আছে',
+'confirm-unwatch-top' => 'এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?',
 
 # Multipage image navigation
 'imgmultipageprev' => '← পূর্ববর্তী পাতা',
@@ -3064,6 +3097,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-software' => 'ইনস্টলকৃত সফটওয়্যার',
 'version-software-product' => 'পণ্য',
 'version-software-version' => 'সংস্করণ',
+'version-entrypoints-header-url' => 'ইউআরএল',
 
 # Special:FilePath
 'filepath' => 'ফাইলের পাথ',
@@ -3130,6 +3164,9 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'compare-rev1' => 'সংশোধন ১',
 'compare-rev2' => 'সংশোধন ২',
 'compare-submit' => 'তুলনা',
+'compare-invalid-title' => 'আপনার প্রদেয় শিরোনামটি সঠিক নয়।',
+'compare-title-not-exists' => 'আপনার কাঙ্ক্ষিত শিরোনামটি নেই।',
+'compare-revision-not-exists' => 'আপনার কাঙ্ক্ষিত সংস্করণটি নেই।',
 
 # Database error messages
 'dberr-header' => 'এই উইকিতে কোন সমস্যা রয়েছে',
@@ -3143,14 +3180,33 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 
 # HTML forms
 'htmlform-invalid-input' => 'আপনার প্রদানকৃত ইনপুটে সমস্যা রয়েছে',
+'htmlform-select-badoption' => 'যে মান আপনি উল্লেখ করেছেন তা গ্রহণযোগ্য অপশন নয়।',
 'htmlform-required' => 'মান প্রদান করা আবশ্যক।',
 'htmlform-submit' => 'জমা দাও',
 'htmlform-reset' => 'পরিবর্তন বাতিল',
 'htmlform-selectorother-other' => 'অন্য',
 
 # New logging system
+'logentry-delete-delete' => '$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে',
+'logentry-delete-restore' => '$1 কর্তৃক $3 পাতাটি ফিরিয়ে আনা হয়েছে',
+'revdelete-content-hid' => 'বিষয়বস্তু লুকায়িত',
+'revdelete-summary-hid' => 'সম্পাদনা সারাংশ লুকায়িত',
+'revdelete-uname-hid' => 'ব্যবহারকারী নাম লুকায়িত',
+'revdelete-content-unhid' => 'বিষয়বস্তু প্রদর্শিত',
+'revdelete-summary-unhid' => 'সম্পাদনা সারাংশ প্রদর্শিত',
+'revdelete-uname-unhid' => 'ব্যবহারকারী নাম প্রদর্শিত',
 'revdelete-restricted' => 'এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে প্রয়োগ করো',
 'revdelete-unrestricted' => 'এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে তুলে নাও',
+'logentry-move-move' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে স্থানান্তর করেছেন',
+'logentry-move-move-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
+'logentry-move-move_redir' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার ওপর দিয়ে স্থানান্তর করেছেন',
+'logentry-move-move_redir-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনার ওপর দিয়ে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
+'logentry-patrol-patrol' => '$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
+'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
+'logentry-newusers-newusers' => '$1 একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-create' => '$1 একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-create2' => '$1 ব্যবহারকারী $3 নামে একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-autocreate' => '$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে তৈরি হয়েছে',
 'newuserlog-byemail' => 'শব্দচাবি ইমেইলের মাধ্যমে পাঠানো হয়েছে',
 
 # Feedback
@@ -3162,6 +3218,8 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'feedback-error1' => 'ত্রুটি: এপিআই থেকে অজানা ফলাফল এসেছে',
 'feedback-error2' => 'ত্রুটি: সম্পাদনা ব্যর্থ',
 'feedback-error3' => 'ত্রুটি: এপিআই থেকে কোন সাড়া নেই',
+'feedback-close' => 'সম্পন্ন',
+'feedback-bugnew' => 'আমি পরীক্ষা করেছি। নতুন একটি বাগ রিপোর্ট করুন।',
 
 # API errors
 'api-error-badaccess-groups' => 'আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।',
@@ -3172,6 +3230,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'api-error-duplicate-archive-popup-title' => 'অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}} যা ইতমধ্যে অপসারণ করা হয়েছে',
 'api-error-duplicate-popup-title' => 'অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}}',
 'api-error-empty-file' => 'আপনার জমাদানকৃত ফাইলটি খালি।',
+'api-error-emptypage' => 'নতুন ও খালি পাতা তৈরি গ্রহণযোগ্য নয়।',
 'api-error-fetchfileerror' => 'অভ্যন্তরীণ ত্রুটি: ফাইল নিয়ে আসার সময় কোনো সমস্যা হয়েছিলো।',
 'api-error-file-too-large' => 'আপনার জমাদানকৃত ফাইলটি অনেক বড়।',
 'api-error-filename-tooshort' => 'এই ফাইল নামটি খুবই ছোট।',
@@ -3196,7 +3255,19 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'api-error-unknown-code' => 'অজানা ত্রুটি: "$1"',
 'api-error-unknown-error' => 'অভ্যন্তরীণ ত্রুটি: আপনার ফাইলটি আপলোড করার সময় কিছু সমস্যা হয়েছে।',
 'api-error-unknown-warning' => 'অজানা সতর্কীকরণ: $1',
+'api-error-unknownerror' => 'অজানা ত্রুটি: "$1"',
 'api-error-uploaddisabled' => 'এই উইকির জন্য আপলোড সুবিধা নিস্ক্রিয় রয়েছে।',
 'api-error-verification-error' => 'সম্ভবত এই ফাইলটি ত্রুটিপূর্ণ অথবা এর এক্সটেনশনটি ভুল।',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|সেকেন্ড|সেকেন্ড}}',
+'duration-minutes' => '$1 {{PLURAL:$1|মিনিট|মিনিট}}',
+'duration-hours' => '$1 {{PLURAL:$1|ঘন্টা|ঘন্টা}}',
+'duration-days' => '$1 {{PLURAL:$1|দিন|দিন}}',
+'duration-weeks' => '{{PLURAL: $1|সপ্তাহ|সপ্তাহ}}',
+'duration-years' => '$1 {{PLURAL:$1|বছর|বছর}}',
+'duration-decades' => '$1 {{PLURAL:$1|দশক|দশক}}',
+'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
+'duration-millennia' => '$1 {{PLURAL:$1|সহস্রাব্দ|সহস্রাব্দ}}',
+
 );
index a9a7847..4c78b6f 100644 (file)
@@ -561,9 +561,9 @@ $2',
 'ns-specialprotected' => "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
 'titleprotected' => "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].
 Setu amañ perak ''$2''.",
-'filereadonlyerror' => 'Dibosupl kemmañ ar restr "$1" abalamour m\'emañ ar c\'havlec\'h restrom "$2" e mod lenn nemetken.
+'filereadonlyerror' => 'Dibosupl kemmañ ar restr "$1" abalamour m\'emañ ar c\'havlec\'h restroù "$2" e mod lenn nemetken.
 
-"\'\'$3\'\'" eo an abeg roet.',
+"\'\'$3\'\'" eo an abeg roet gant ar merour en deus prennet anezhi.',
 
 # Virus scanner
 'virus-badscanner' => "Kefluniadur fall : skanner viruzoù dianav : ''$1''",
@@ -849,7 +849,8 @@ Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
 'updated' => '(Hizivaet)',
 'note' => "'''Notenn :'''",
 'previewnote' => "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''
-N'eo ket bet enrollet ho kemmoù evit c'hoazh ! [[#editform|→ Kenderc'hel da gemmañ]]",
+N'eo ket bet enrollet ho kemmoù evit c'hoazh !",
+'continue-editing' => "Kenderc'hel da gemmañ",
 'previewconflict' => 'Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.',
 'session_fail_preview' => "'''Ho tigarez! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.'''
 Klaskit en-dro mar plij.
@@ -923,6 +924,7 @@ Diverket eo bet evit doare.',
 'edit-no-change' => "N'eo ket bet kemeret ho tegasadenn e kont rak ne oa ket bet kemmet netra en destenn.",
 'edit-already-exists' => "N'eus ket bet gallet krouiñ ur bajenn nevez.
 Krouet e oa bet c'hoazh.",
+'defaultmessagetext' => 'Testenn dre ziouer',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Diwallit : Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo gant ar bajenn-mañ.
@@ -938,6 +940,10 @@ A-gostez eo bet lezet an arventenn-se.',
 'parser-template-loop-warning' => "Patrom e kelc'h detektet : [[$1]]",
 'parser-template-recursion-depth-warning' => 'Tizhet bevenn donder galvoù ar patromoù ($1)',
 'language-converter-depth-warning' => "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
+'node-count-exceeded-category' => "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
+'node-count-exceeded-warning' => "Pajenn a ya en tu all d'an niver a skoulmoù",
+'expansion-depth-exceeded-category' => "Pajennoù m'eur aet dreist d'an donder astenn",
+'expansion-depth-exceeded-warning' => "Pajenn a ya dreist d'an donder astenn",
 
 # "Undo" feature
 'undo-success' => "Gallout a reer disteurel ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
@@ -2021,6 +2027,11 @@ Gallout a rit strishaat ar mod diskwel en ur zibab ar marilh, an anv implijer (d
 'allpages-bad-ns' => 'N\'eus ket a esaouenn anv anvet "$1" war {{SITENAME}}.',
 'allpages-hide-redirects' => 'Kuzhat an adkasoù',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Emaoc'h o sellet ouzh ur stumm krubuilhet eus ar bajenn-mañ, a c'hall bezañ kement ha $1 kozh",
+'cachedspecial-viewing-cached-ts' => "Emaoc'h o sellet ouzh ur stumm krubuilhet eus ar bajenn-mañ a c'hall bezañ dispredet un disterañ.",
+'cachedspecial-refresh-now' => 'Gwelet an hini nevesañ.',
+
 # Special:Categories
 'categories' => 'Roll ar rummadoù',
 'categoriespagetext' => 'Er {{PLURAL:$1|rummad|rummadoù}}da-heul ez eus pajennoù pe restroù media.
@@ -2516,7 +2527,7 @@ Setu aze an abeg(où) m\'eo bet stanket $1 : "$2"',
 'blocklog-showsuppresslog' => "Stanket ha kuzhet eo bet an implijer-mañ c'hoazh. A-is emañ marilh ar diverkadennoù, d'ho titouriñ :",
 'blocklogentry' => 'en/he deus stanket [[$1]] betek an $2 $3',
 'reblock-logentry' => "en deus kemmet an arventennoù stankañ evit [[$1]] gant un termen d'an $2 $3",
-'blocklogtext' => "Setu roud stankadennoù ha distankadennoù an implijerien. N'eo ket bet rollet ar chomlec'hioù IP bet stanket outo ent emgefre. Sellet ouzh [[Special:BlockList|roll an implijerien stanket]] evit gwelet piv zo stanket e gwirionez.",
+'blocklogtext' => "Setu roud stankadennoù ha distankadennoù an implijerien. N'eo ket bet rollet ar chomlec'hioù IP bet stanket ent emgefre. Sellet ouzh [[Special:BlockList|roll an implijerien stanket]] evit gwelet piv zo stanket e gwirionez.",
 'unblocklogentry' => 'distanket "$1"',
 'block-log-flags-anononly' => 'implijerien dizanv hepken',
 'block-log-flags-nocreate' => 'berzet eo krouiñ kontoù',
@@ -3623,6 +3634,9 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'version-software' => 'Meziant staliet',
 'version-software-product' => 'Produ',
 'version-software-version' => 'Stumm',
+'version-entrypoints' => 'URLoù ar poent mont e-barzh',
+'version-entrypoints-header-entrypoint' => 'Poent mont e-barzh',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Hent moned ur restr',
@@ -3761,7 +3775,7 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
 'feedback-bugornote' => "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [\$1 kemenn un draen].
 A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[\$3 \$2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
 'feedback-subject' => 'Danvez :',
-'feedback-message' => 'Kemennadenn:',
+'feedback-message' => 'Kemennadenn :',
 'feedback-cancel' => 'Nullañ',
 'feedback-submit' => 'Kas ho soñj',
 'feedback-adding' => "Oc'h ouzhpennañ ho soñj war ar bajenn...",
@@ -3811,4 +3825,15 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'api-error-uploaddisabled' => 'Diweredekaat eo an enporzh war ar wiki-mañ.',
 'api-error-verification-error' => 'Pe eo brein ar restr pe eo fall an astenn anezhi.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|eilenn|eilenn}}',
+'duration-minutes' => '$1 {{PLURAL:$1|munut|munut}}',
+'duration-hours' => '($1 {{PLURAL:$1|eurvezh|eurvezh}})',
+'duration-days' => '($1 {{PLURAL:$1|deiz|deiz}})',
+'duration-weeks' => '$1 {{PLURAL:$1|sizhun|sizhun}}',
+'duration-years' => '$1 {{PLURAL:$1|bloaz|bloaz}}',
+'duration-decades' => '$1 {{PLURAL:$1|degad|degas}}',
+'duration-centuries' => "$1 {{PLURAL:$1|c'hantved|kantved}}",
+'duration-millennia' => '$1 {{PLURAL:$1|milvloaz|milvoaz}}',
+
 );
index b666236..b7c9154 100644 (file)
@@ -754,6 +754,7 @@ Nijedan e-mail neće biti poslan za bilo koju uslugu od slijedećih.',
 'invalidemailaddress' => 'Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.
 Molimo vas da unesete ispravnu adresu ili ostavite prazno polje.',
 'cannotchangeemail' => 'Na ovom wikiju ne možete promijeniti e-mail adresu računa.',
+'emaildisabled' => 'Ova web-stranica ne može da šalje e-poruke.',
 'accountcreated' => 'Korisnički račun je napravljen',
 'accountcreatedtext' => 'Korisnički račun za $1 je napravljen.',
 'createaccount-title' => 'Pravljenje korisničkog računa za {{SITENAME}}',
@@ -960,7 +961,8 @@ Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
 Ne zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Osvježeno)',
 'note' => "'''Pažnja:'''",
-'previewnote' => "'''Ovo je samo pregled; izmjene stranice nisu još sačuvane!'''",
+'previewnote' => "'''Ne zaboravite da je ovo samo pregled'''
+Izmjene stranice nisu još sačuvane!",
 'previewconflict' => 'Ovaj pregled reflektuje tekst u gornjem polju
 kako će izgledati ako pritisnete "Sačuvaj članak".',
 'session_fail_preview' => "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
@@ -1202,7 +1204,7 @@ Molimo provjerite zapise.',
 # Suppression log
 'suppressionlog' => 'Zapisi sakrivanja',
 'suppressionlogtext' => 'Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. 
-Vidi [[Special:BlockList|spisak IP blokiranja]] za pregled trenutno važećih blokada.',
+Vidi [[Special:BlockList|spisak blokiranja]] za pregled trenutno važećih blokada.',
 
 # History merging
 'mergehistory' => 'Spoji historije stranice',
@@ -1317,7 +1319,7 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'qbsettings-fixedright' => 'Pričvršćena desno',
 'qbsettings-floatingleft' => 'Plutajuća lijevo',
 'qbsettings-floatingright' => 'Plutajući desno',
-'qbsettings-directionality' => 'Čvrsto, u zavisnosti od usmjerenosti pisma vašeg jezika',
+'qbsettings-directionality' => 'Čvrsto, u zavisnosti od usmjerenosti pisma Vašeg jezika',
 
 # Preferences page
 'preferences' => 'Podešavanja',
@@ -2239,7 +2241,7 @@ Ako kasnije želite da uklonite stranicu sa vašeg spiska praćenih članaka, kl
 'watchmethod-list' => 'provjerava se da li ima nedavnih izmjena u praćenim stranicama',
 'watchlistcontains' => 'Vaš spisak praćenih članaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.',
 'iteminvalidname' => "Problem sa '$1', neispravno ime...",
-'wlnote' => "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}.",
+'wlnote' => "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}, od $3, $4.",
 'wlshowlast' => 'Prikaži posljednjih $1 sati $2 dana $3',
 'watchlist-options' => 'Opcije spiska praćenja',
 
@@ -2550,8 +2552,8 @@ Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
 'ipb-confirm' => 'Potvrdite blokiranje',
 'badipaddress' => 'Pogrešna IP adresa',
 'blockipsuccesssub' => 'Blokiranje je uspjelo',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je blokiran.
-<br />Pogledajte [[Special:BlockList|IP spisak blokiranih korisnika]] za pregled blokiranja.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />
+Pogledajte [[Special:BlockList|spisak blokiranja]] za pregled blokiranja.',
 'ipb-blockingself' => 'Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?',
 'ipb-confirmhideuser' => "Upravo ćete blokirati korisnika sa uključenom opcijom ''sakrij korisnika''. Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Da li ste sigurni da to želite?",
 'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
@@ -2604,8 +2606,8 @@ Razlog za blokiranje je korisnika $1 je: \'\'$2\'\'',
 'blocklogentry' => 'je blokirao [[$1]] sa vremenom isticanja blokade od $2 $3',
 'reblock-logentry' => 'promjena postavki blokiranja za [[$1]] sa vremenom isteka u $2 $3',
 'blocklogtext' => 'Ovo je historija akcija blokiranja i deblokiranja korisnika.
-Automatsko blokirane IP adrese nisu uspisane ovde.
-Pogledajte [[Special:BlockList|blokirane IP adrese]] za spisak trenutnih zabrana i blokiranja.',
+Automatski blokirane IP adrese nisu navedene ovdje.
+Pogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.',
 'unblocklogentry' => 'deblokiran $1',
 'block-log-flags-anononly' => 'samo anonimni korisnici',
 'block-log-flags-nocreate' => 'pravljenje računa onemogućeno',
@@ -2743,7 +2745,7 @@ stranica za razgovor nije mogla biti premještena jer takva već postoji na novo
 Odredišna stranica "[[:$1]]" već postoji.
 Da li je želite obrisati kako bi ste mogli izvršiti premještanje?',
 'delete_and_move_confirm' => 'Da, obriši stranicu',
-'delete_and_move_reason' => 'Obrisano da bi se napravio prostor za premještanje',
+'delete_and_move_reason' => 'Obrisano da bi se napravio prostor za premještanje iz "[[$1]]"',
 'selfmove' => 'Izvorni i ciljani naziv su isti; strana ne može da se premjesti preko same sebe.',
 'immobile-source-namespace' => 'Ne mogu premjestiti stranice u imenski prostor "$1"',
 'immobile-target-namespace' => 'Ne mogu se premjestiti stranice u imenski prostor "$1"',
@@ -2869,10 +2871,11 @@ Nedostaje privremeni folder.',
 
 # JavaScriptTest
 'javascripttest' => 'Testiranje JavaScript-e',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena.',
+'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
 'javascripttest-title' => 'Pokretanje $1 testova',
 'javascripttest-pagetext-noframework' => 'Ova stranica je određena za pokretanje JavaScript testova.',
 'javascripttest-pagetext-unknownframework' => 'Nepoznat radni okvir testiranja"$1".',
+'javascripttest-pagetext-skins' => 'Izaberite s kojom temom želite da pokrenete probu:',
 'javascripttest-qunit-intro' => 'Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.',
 
 # Tooltip help for the actions
@@ -3761,6 +3764,7 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-software' => 'Instalirani softver',
 'version-software-product' => 'Proizvod',
 'version-software-version' => 'Verzija',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Putanja datoteke',
@@ -3874,6 +3878,10 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'revdelete-unrestricted' => 'uklonjena ograničenja za administratore',
 'logentry-move-move' => '$1 je premjestio stranicu $3 na $4',
 'logentry-move-move-noredirect' => '$1 je premjestio stranicu $3 na $4 bez ostavljanja preusmjerenja',
+'logentry-move-move_redir' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja',
+'logentry-move-move_redir-noredirect' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja',
+'logentry-patrol-patrol' => '$1 je označio izmjenu $4 stranice $3 pregledanim',
+'logentry-patrol-patrol-auto' => '$1 je automatski označio izmjenu $4 stranice $3 pregledanim',
 'logentry-newusers-newusers' => '$1 je napravio korisnički račun',
 'logentry-newusers-create' => '$1 je napravio korisnički račun',
 'logentry-newusers-create2' => '$1 je napravio korisnički račun $3',
@@ -3881,6 +3889,8 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'newuserlog-byemail' => 'šifra je poslana putem e-maila',
 
 # Feedback
+'feedback-bugornote' => 'Ako ste spremni detaljno opisati tehnički problem molimo [$1 prijavite "bug" (grešku)].
+Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan na stranicu "[$3 $2]", zajedno s vašim korisničkim imenom i internetskog preglednika koji koristite.',
 'feedback-subject' => 'Tema:',
 'feedback-message' => 'Poruka:',
 'feedback-cancel' => 'Odustani',
@@ -3932,4 +3942,8 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'api-error-uploaddisabled' => 'Postavljanje je onemogućeno na ovoj wiki.',
 'api-error-verification-error' => 'Ova datoteka je možda oštećenja ili ima pogrešan nastavak.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
+'duration-days' => '$1 {{PLURAL:$1|dan|dana}}',
+
 );
index 7f4276a..69ed27b 100644 (file)
@@ -570,8 +570,8 @@ $2",
 'ns-specialprotected' => 'No es poden modificar les pàgines especials.',
 'titleprotected' => "La creació d'aquesta pàgina està protegida per [[User:$1|$1]].
 Els seus motius han estat: «''$2''».",
-'filereadonlyerror' => "No s'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers «$2» està en mode només de lectura.
-El motiu donat és «''$3''».",
+'filereadonlyerror' => 'No s\'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers "$2" està en mode només de lectura.
+L\'administrador que l\'ha bloquejat ha donat aquesta explicació: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Mala configuració: antivirus desconegut: ''$1''",
@@ -849,7 +849,7 @@ Per més detalls, la darrera entrada del registre es mostra a continuació:",
 'updated' => '(Actualitzat)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Recorda que això és només una previsualització.'''
-Els vostres canvis encara no s'han desat! [[#editform|→ Continuar editant]]",
+Els vostres canvis encara no s'han desat!",
 'previewconflict' => "Aquesta previsualització reflecteix, a l'àrea
 d'edició superior, el text tal i com apareixerà si trieu desar-lo.",
 'session_fail_preview' => "'''No s'ha pogut processar la vostra modificació a causa d'una pèrdua de dades de la sessió.
@@ -929,6 +929,7 @@ Sembla haver estat esborrada.",
 'edit-no-change' => 'La vostra modificació ha estat ignorada perquè no feia cap canvi al text.',
 'edit-already-exists' => "No s'ha pogut crear una pàgina.
 Ja existeix.",
+'defaultmessagetext' => 'Missatge per defecte',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Atenció: Aquesta pàgina conté massa crides a funcions parserfunction complexes.
@@ -1087,8 +1088,8 @@ Si us plau, verifica els registres.",
 
 # Suppression log
 'suppressionlog' => 'Registre de supressió',
-'suppressionlogtext' => 'A continuació es mostra una llista de les supressions i blocs que impliquen contingut ocult a administradors.
-Veure la [[Special:BlockList|List]] per a la llista de prohibicions actualment operatives i blocs.',
+'suppressionlogtext' => 'A continuació es mostra una llista de les supressions i blocs que impliquen contingut ocult per administradors.
+Veure la [[Special:BlockList|llista de bloqueigs]] per a la llista de prohibicions actualment operatives i bloqueigs.',
 
 # History merging
 'mergehistory' => 'Fusiona els historials de les pàgines',
@@ -1672,6 +1673,10 @@ $1',
 'backend-fail-contenttype' => 'No es pot determinar el tipus de contingut del fitxer per emmagatzemar a «$1».',
 'backend-fail-batchsize' => "El rerefons d'emmagatzemament ha rebut un lot {{PLURAL:$1|d'$1 operació|de $1 operacions}} de fitxer; el límit és $2 {{PLURAL:$2|operació|operacions}}.",
 
+# File journal errors
+'filejournal-fail-dbconnect' => 'No es pot connectar amb la base de dades per emmagatzemar el backend "$1".',
+'filejournal-fail-dbquery' => 'No es pot actualitzat la base de dades per a emmagatzemar el backend "$1".',
+
 # Lock manager
 'lockmanager-notlocked' => "No s'ha pogut desbloquejar «$1»; no és bloquejat.",
 'lockmanager-fail-closelock' => "No s'ha pogut bloquejar el fitxer per «$1».",
@@ -2444,8 +2449,8 @@ quines pàgines en concret estan sent vandalitzades).",
 'ipb-confirm' => 'Confirma el blocatge',
 'badipaddress' => "L'adreça IP no té el format correcte.",
 'blockipsuccesssub' => "S'ha blocat amb èxit",
-'blockipsuccesstext' => "L'usuari «[[Special:Contributions/$1|$1]]» ha estat blocat.
-<br />Vegeu la [[Special:BlockList|llista d'IP blocades]] per revisar els bloquejos.",
+'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] ha estat {{GENDER:$1|bloquejat|bloquejada|bloquejat/da}}.<br />
+Vegeu la [[Special:BlockList|llista d'IP blocades]] per revisar els bloqueigs.",
 'ipb-blockingself' => 'Esteu a punt de blocar-vos a vós mateix! Esteu segurs de voler-ho fer?',
 'ipb-confirmhideuser' => "Esteu a punt de bloquejar un usuari que està marcat amb l'opció «amaga l'usuari». Això suprimirà el seu nom a totes les llistes i registres. Esteu segurs de voler-ho fer?",
 'ipb-edit-dropdown' => 'Edita les raons per a blocar',
@@ -2499,7 +2504,7 @@ Per més detalls, a sota es mostra el registre de bloquejos:',
 Per més detalls, a sota es mostra el registre de supressions:',
 'blocklogentry' => "ha blocat l'{{GENDER:$1|usuari|usuària}} [[$1]] per un període de: $2 $3",
 'reblock-logentry' => 'canviades les opcions del blocatge a [[$1]] amb caducitat a $2, $3',
-'blocklogtext' => "Això és una relació de accions de bloqueig i desbloqueig. Les adreces IP bloquejades automàticament no apareixen. Vegeu la [[Special:BlockList|llista d'usuaris actualment bloquejats]].",
+'blocklogtext' => 'Això és una relació de accions de bloqueig i desbloqueig. Les adreces IP bloquejades automàticament no apareixen. Vegeu la [[Special:BlockList|llista de bloqueigs]] per veure una llista dels actuals bloqueigs operatius.',
 'unblocklogentry' => 'ha desblocat $1',
 'block-log-flags-anononly' => 'només els usuaris anònims',
 'block-log-flags-nocreate' => "s'ha desactivat la creació de comptes",
index 0d7185f..5655162 100644 (file)
@@ -413,8 +413,8 @@ $1',
 'editlink' => 'دەستکاری',
 'viewsourcelink' => 'سەرچاوەکەی ببینە',
 'editsectionhint' => 'دەستکاری کردنی بەشی: $1',
-'toc' => 'Ù\86اÙ\88Û\95رÛ\86Ú©',
-'showtoc' => 'نیشاندان',
+'toc' => 'Ù¾Û\8eرست',
+'showtoc' => 'نیشانیبدە',
 'hidetoc' => 'بیشارەوە',
 'collapsible-collapse' => 'کۆیبکەوە',
 'collapsible-expand' => 'بڵاویبکەوە',
@@ -1257,7 +1257,7 @@ $1",
 'prefs-advancedrendering' => 'هەڵبژاردە پێشکەوتووەکان',
 'prefs-advancedsearchoptions' => 'هەڵبژاردە پێشکەوتووەکان',
 'prefs-advancedwatchlist' => 'هەڵبژاردە پێشکەوتووەکان',
-'prefs-displayrc' => 'هەڵبژاردەکانی نیشان‌دان',
+'prefs-displayrc' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-displaysearchoptions' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-displaywatchlist' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-diffs' => 'جیاوازییەکان',
@@ -1881,7 +1881,7 @@ $1',
 
 # Special:ListUsers
 'listusersfrom' => 'نیشاندانی بەکارھێنەران بە دست پێکردن لە:',
-'listusers-submit' => 'نیشاندان',
+'listusers-submit' => 'نیشانیبدە',
 'listusers-noresult' => 'ھیچ بەکارھێنەرێک نەدۆزرایەوە.',
 'listusers-blocked' => '(بەربەست‌کراو)',
 
@@ -3206,4 +3206,15 @@ $5
 'api-error-unknown-code' => 'ھەڵەی نەزانراو: «$1».',
 'api-error-unknownerror' => 'ھەڵەی نەزانراو: «$1».',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|چرکە|چرکە}}',
+'duration-minutes' => '$1 {{PLURAL:$1|خولەک|خولەک}}',
+'duration-hours' => '$1 {{PLURAL:$1|کاتژمێر|کاتژمێر}}',
+'duration-days' => '$1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}',
+'duration-weeks' => '$1 {{PLURAL:$1|ھەفتە|ھەفتە}}',
+'duration-years' => '$1 {{PLURAL:$1|ساڵ|ساڵ}}',
+'duration-decades' => '$1 {{PLURAL:$1|دەیە|دەیە}}',
+'duration-centuries' => '$1 {{PLURAL:$1|سەدە|سەدە}}',
+'duration-millennia' => '$1 {{PLURAL:$1|ھەزارە|ھەزارە}}',
+
 );
index ff86968..265892b 100644 (file)
@@ -913,7 +913,7 @@ $3 мына бу себепни бильдирди: ''$2''",
 'prefs-rc' => 'Сонъки денъишмелер',
 'prefs-watchlist' => 'Козетюв джедвели',
 'prefs-watchlist-days' => 'Козетюв джедвелинде косьтериледжек кунь сайысы:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Энъ чокъ $1 {{PLURAL:$1|кунь|кунь}}',
 'prefs-watchlist-edits' => 'Кенишлетилген козетюв джедвелинде косьтериледжек денъишмелер сайысы:',
 'prefs-watchlist-edits-max' => '(энъ чокъ 1000)',
 'prefs-watchlist-token' => 'Козетюв джедвели ишарети:',
index 0837acc..1f8db74 100644 (file)
@@ -910,7 +910,7 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'prefs-rc' => 'Soñki deñişmeler',
 'prefs-watchlist' => 'Közetüv cedveli',
 'prefs-watchlist-days' => 'Közetüv cedvelinde kösterilecek kün sayısı:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Eñ çoq $1 {{PLURAL:$1|kün|kün}}',
 'prefs-watchlist-edits' => 'Kenişletilgen közetüv cedvelinde kösterilecek deñişmeler sayısı:',
 'prefs-watchlist-edits-max' => 'Eñ çoq 1000',
 'prefs-watchlist-token' => 'Közetüv cedveli işareti:',
index 8100d12..b492d78 100644 (file)
@@ -371,7 +371,7 @@ $messages = array(
 'tog-rememberpassword' => 'Zapamatovat si mé přihlášení v tomto prohlížeči (maximálně $1 {{PLURAL:$1|den|dny|dní}})',
 'tog-watchcreations' => 'Přidávat mnou založené stránky ke sledovaným',
 'tog-watchdefault' => 'Přidávat mnou editované stránky ke sledovaným',
-'tog-watchmoves' => 'Přidávat přesouvané stránky mezi sledované',
+'tog-watchmoves' => 'Přidávat mnou přesouvané stránky mezi sledované',
 'tog-watchdeletion' => 'Přidávat stránky, které smažu, mezi sledované',
 'tog-minordefault' => 'Označit editaci implicitně jako malá editace',
 'tog-previewontop' => 'Zobrazovat náhled před editačním oknem (ne za ním)',
@@ -950,16 +950,16 @@ Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace z
 'summary-preview' => 'Náhled shrnutí:',
 'subject-preview' => 'Náhled předmětu/nadpisu:',
 'blockedtitle' => 'Uživatel zablokován',
-'blockedtext' => "'''Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.'''
+'blockedtext' => "Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.'''
 
-Zablokování provedl $1.
+Zablokování provedl{{gender:$1||a}} $1.
 Udaným důvodem bylo ''$2''.
 
 * Začátek blokování: $8
 * Zablokování vyprší: $6
 * Blokovaný uživatel: $7
 
-Pokud chcete zablokování prodiskutovat, můžete kontaktovat uživatele $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].
+Pokud chcete zablokování prodiskutovat, můžete kontaktovat {{gender:$1|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].
 Uvědomte si, že nemůžete použít nabídku „Poslat e-mail“, jestliže nemáte ve svém [[Special:Preferences|nastavení]] uvedenu platnou e-mailovou adresu nebo pokud vám byla tato možnost zakázána.
 Vaše IP adresa je $3 a&nbsp;identifikační číslo bloku je #$5; tyto údaje uvádějte ve všech dotazech na správce.",
 'autoblockedtext' => "Vaše IP adresa byla automaticky zablokována, protože ji používal jiný uživatel, kterého zablokoval $1.
@@ -1022,7 +1022,8 @@ Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
 'updated' => '(Změna uložena)',
 'note' => "'''Poznámka:'''&nbsp;",
 'previewnote' => "'''Pamatujte, že toto je pouze náhled.'''
-Změny zatím nebyly uloženy! [[#editform|→ Pokračovat v editaci]]",
+Změny zatím nebyly uloženy!",
+'continue-editing' => 'Pokračovat v editaci',
 'previewconflict' => 'Tento náhled ukazuje text tak, jak bude vypadat po uložení stránky.',
 'session_fail_preview' => "'''Váš požadavek se nepodařilo zpracovat kvůli ztrátě dat z relace.
 Zkuste to prosím znovu.
@@ -1114,6 +1115,10 @@ Tyto argumenty byly vynechány.',
 'parser-template-loop-warning' => 'Nalezena smyčka šablon: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Překročen limit hloubky rekurzivního vkládání šablon ($1)',
 'language-converter-depth-warning' => 'Překročen limit vnoření u jazykové konverze ($1)',
+'node-count-exceeded-category' => 'Stránky překračující počet uzlů',
+'node-count-exceeded-warning' => 'Stránka překročila počet uzlů',
+'expansion-depth-exceeded-category' => 'Stránky překračující hloubku expanze',
+'expansion-depth-exceeded-warning' => 'Stránka překročila hloubku expanze',
 
 # "Undo" feature
 'undo-success' => 'Editace může být zrušena. Zkontrolujte a pak potvrďte změny zobrazené níže.',
@@ -2190,6 +2195,11 @@ Zobrazení můžete zúžit výběrem typu záznamu, uživatelského jména (zá
 'allpages-bad-ns' => '{{SITENAME}} nemá jmenný prostor "$1".',
 'allpages-hide-redirects' => 'Skrýt přesměrování',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Prohlížíte si cachovanou verzi této stránky, která může být až $1 stará.',
+'cachedspecial-viewing-cached-ts' => 'Prohlížíte si cachovanou verzi této stránky, která nemusí být zcela aktuální.',
+'cachedspecial-refresh-now' => 'Zobrazit nejnovější.',
+
 # Special:Categories
 'categories' => 'Kategorie',
 'categoriespagetext' => 'Následující kategorie {{PLURAL:$1|obsahuje|obsahují}} stránky nebo soubory.
@@ -2618,7 +2628,7 @@ Udejte přesný důvod níže (například ocitujte, které stránky byly poško
 'ipb-confirm' => 'Potvrdit zablokování',
 'badipaddress' => 'Neplatná IP adresa',
 'blockipsuccesssub' => 'Zablokování uspělo',
-'blockipsuccesstext' => 'Uživatel „[[Special:Contributions/$1|$1]]“ je zablokován.<br />
+'blockipsuccesstext' => '„[[Special:Contributions/$1|$1]]“ je {{GENDER:$1|zablokován|zablokována}}.<br />
 Můžete si prohlédnout [[Special:BlockList|seznam zablokovaných uživatelů]].',
 'ipb-blockingself' => 'Chystáte se zablokovat {{gender:|sám|sama|sami}} sebe! Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?',
 'ipb-confirmhideuser' => 'Chystáte se zablokovat uživatele se zapnutou volbou „skrýt uživatelské jméno“. To způsobí, že jméno uživatele zmizí ze všech seznamů a protokolovacích záznamů. Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?',
@@ -2670,7 +2680,9 @@ Zde je pro přehled zobrazen výpis z knihy zablokování:',
 'blocklog-showsuppresslog' => 'Tento uživatel byl zablokován a skryt. Zde je pro přehled zobrazen výpis záznamu utajení:',
 'blocklogentry' => 'blokuje „[[$1]]“ s časem vypršení $2 $3',
 'reblock-logentry' => 'mění nastavení bloku „[[$1]]“ s časem vypršení $2 $3',
-'blocklogtext' => 'Toto je kniha úkonů blokování a odblokování uživatelů. Automaticky blokované IP adresy nejsou vypsány. Podívejte se na [[Special:BlockList|seznam blokování IP]] s výčtem aktuálních zákazů a blokování.',
+'blocklogtext' => 'Toto je kniha úkonů blokování a odblokování uživatelů.
+Automaticky blokované IP adresy nejsou vypsány.
+Vizte též [[Special:BlockList|seznam všech probíhajících bloků]].',
 'unblocklogentry' => 'odblokovává „$1“',
 'block-log-flags-anononly' => 'pouze anonymní uživatelé',
 'block-log-flags-nocreate' => 'vytváření účtů zablokováno',
@@ -3816,6 +3828,9 @@ MediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOL
 'version-software' => 'Nainstalovaný software',
 'version-software-product' => 'Název',
 'version-software-version' => 'Verze',
+'version-entrypoints' => 'URL vstupních bodů',
+'version-entrypoints-header-entrypoint' => 'Vstupní bod',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Cesta k souboru',
@@ -4004,4 +4019,15 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 'api-error-uploaddisabled' => 'Načítání souborů je na této wiki vypnuto.',
 'api-error-verification-error' => 'Soubor je možná poškozen nebo má špatnou příponu.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundy|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuty|minut}}',
+'duration-hours' => '$1 {{PLURAL:$1|hodina|hodiny|hodin}}',
+'duration-days' => '$1 {{PLURAL:$1|den|dny|dní}}',
+'duration-weeks' => '$1 {{PLURAL:$1|týden|týdny|týdnů}}',
+'duration-years' => '$1 {{PLURAL:$1|rok|roky|let}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekáda|dekády|dekád}}',
+'duration-centuries' => '$1 {{PLURAL:$1|století}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tisíciletí}}',
+
 );
index 19227ca..ab49bf6 100644 (file)
@@ -89,355 +89,360 @@ $linkTrail = '/^([a-zабвгдеєжѕзїіıићклмнопсстѹфхѡѿ
 
 $messages = array(
 # Dates
-'sunday'        => 'нєдѣлꙗ',
-'monday'        => 'понедѣл҄ьникъ',
-'tuesday'       => 'въторьникъ',
-'wednesday'     => 'срѣда',
-'thursday'      => 'чєтврьтъкъ',
-'friday'        => 'пѧтъкъ',
-'saturday'      => 'сѫбота',
-'sun'           => 'н҃д',
-'mon'           => 'п҃н',
-'tue'           => 'в҃т',
-'wed'           => 'с҃р',
-'thu'           => 'ч҃т',
-'fri'           => 'п҃т',
-'sat'           => 'с҃б',
-'january'       => 'їаноуарїи',
-'february'      => 'фєвроуарїи',
-'march'         => 'мартїи',
-'april'         => 'апрїлїи',
-'may_long'      => 'маїи',
-'june'          => 'їоунїи',
-'july'          => 'їоулїи',
-'august'        => 'аѷгоустъ',
-'september'     => 'сєптємврїи',
-'october'       => 'октѡврїи',
-'november'      => 'ноємврїи',
-'december'      => 'дєкємврїи',
-'january-gen'   => 'їаноуарїꙗ',
-'february-gen'  => 'фєвроуарїꙗ',
-'march-gen'     => 'мартїꙗ',
-'april-gen'     => 'апрїлїꙗ',
-'may-gen'       => 'маїꙗ',
-'june-gen'      => 'їоунїꙗ',
-'july-gen'      => 'їоулїꙗ',
-'august-gen'    => 'аѷгоуста',
+'sunday' => 'нєдѣлꙗ',
+'monday' => 'понедѣл҄ьникъ',
+'tuesday' => 'въторьникъ',
+'wednesday' => 'срѣда',
+'thursday' => 'чєтврьтъкъ',
+'friday' => 'пѧтъкъ',
+'saturday' => 'сѫбота',
+'sun' => 'н҃д',
+'mon' => 'п҃н',
+'tue' => 'в҃т',
+'wed' => 'с҃р',
+'thu' => 'ч҃т',
+'fri' => 'п҃т',
+'sat' => 'с҃б',
+'january' => 'їаноуарїи',
+'february' => 'фєвроуарїи',
+'march' => 'мартїи',
+'april' => 'апрїлїи',
+'may_long' => 'маїи',
+'june' => 'їоунїи',
+'july' => 'їоулїи',
+'august' => 'аѷгоустъ',
+'september' => 'сєптємврїи',
+'october' => 'октѡврїи',
+'november' => 'ноємврїи',
+'december' => 'дєкємврїи',
+'january-gen' => 'їаноуарїꙗ',
+'february-gen' => 'фєвроуарїꙗ',
+'march-gen' => 'мартїꙗ',
+'april-gen' => 'апрїлїꙗ',
+'may-gen' => 'маїꙗ',
+'june-gen' => 'їоунїꙗ',
+'july-gen' => 'їоулїꙗ',
+'august-gen' => 'аѷгоуста',
 'september-gen' => 'сєптємврїꙗ',
-'october-gen'   => 'октѡврїꙗ',
-'november-gen'  => 'ноємврїꙗ',
-'december-gen'  => 'дєкємврїꙗ',
-'jan'           => 'ꙗ҃н',
-'feb'           => 'фє҃в',
-'mar'           => 'ма҃р',
-'apr'           => 'ап҃р',
-'may'           => 'маїи',
-'jun'           => 'їо҃ун',
-'jul'           => 'їо҃ул',
-'aug'           => 'аѵ҃г',
-'sep'           => 'сє҃п',
-'oct'           => 'ок҃т',
-'nov'           => 'но҃є',
-'dec'           => 'дє҃к',
+'october-gen' => 'октѡврїꙗ',
+'november-gen' => 'ноємврїꙗ',
+'december-gen' => 'дєкємврїꙗ',
+'jan' => 'ꙗ҃н',
+'feb' => 'фє҃в',
+'mar' => 'ма҃р',
+'apr' => 'ап҃р',
+'may' => 'маїи',
+'jun' => 'їо҃ун',
+'jul' => 'їо҃ул',
+'aug' => 'аѵ҃г',
+'sep' => 'сє҃п',
+'oct' => 'ок҃т',
+'nov' => 'но҃є',
+'dec' => 'дє҃к',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
-'category_header'        => 'катигорїѩ ⁖ $1 ⁖ страницѧ',
-'subcategories'          => 'подъкатигорїѩ',
-'hidden-categories'      => '{{PLURAL:$1|съкрꙑта катигорїꙗ|съкрꙑти катигорїи|съкрꙑтꙑ катигорїѩ}}',
-'category-subcat-count'  => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}',
+'pagecategories' => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
+'category_header' => 'катигорїѩ ⁖ $1 ⁖ страницѧ',
+'subcategories' => 'подъкатигорїѩ',
+'hidden-categories' => '{{PLURAL:$1|съкрꙑта катигорїꙗ|съкрꙑти катигорїи|съкрꙑтꙑ катигорїѩ}}',
+'category-subcat-count' => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}',
 'listingcontinuesabbrev' => '· вѧщє',
 
 'linkprefix' => '/^(.*?)(„|«)$/sD',
 
-'about'         => 'опьсаниѥ',
-'article'       => 'члѣнъ',
-'newwindow'     => '(иномь окънѣ)',
+'about' => 'опьсаниѥ',
+'article' => 'члѣнъ',
+'newwindow' => '(иномь окънѣ)',
 'moredotdotdot' => 'вѧщє ···',
-'mypage'        => 'моꙗ страница',
-'mytalk'        => 'моꙗ бєсѣда',
-'navigation'    => 'плаваниѥ',
-'and'           => '&#32;и',
+'mypage' => 'моꙗ страница',
+'mytalk' => 'моꙗ бєсѣда',
+'navigation' => 'плаваниѥ',
+'and' => '&#32;и',
 
 # Cologne Blue skin
-'qbedit'         => 'исправи',
-'qbpageoptions'  => 'си страни́ца',
-'qbmyoptions'    => 'моꙗ страницѧ',
+'qbedit' => 'исправи',
+'qbpageoptions' => 'си страни́ца',
+'qbmyoptions' => 'моꙗ страницѧ',
 'qbspecialpages' => 'нарочьнꙑ страницѧ',
-'faq'            => 'чѧстꙑ въпросꙑ',
+'faq' => 'чѧстꙑ въпросꙑ',
 
 # Vector skin
 'vector-action-addsection' => 'новꙑ бєсѣдꙑ чѧсти сътворѥниѥ',
-'vector-action-delete'     => 'поничьжєниѥ',
-'vector-action-move'       => 'прѣимєнованиѥ',
-'vector-action-protect'    => 'ꙁабранѥниѥ',
-'vector-action-unprotect'  => 'поущєниѥ',
-'vector-view-create'       => 'сътворѥниѥ',
-'vector-view-edit'         => 'исправи',
-'vector-view-history'      => 'їсторїꙗ',
-'vector-view-view'         => 'чьтѥниѥ',
-'vector-view-viewsource'   => 'страницѧ источьнъ обраꙁъ',
-'actions'                  => 'дѣиства',
-'namespaces'               => 'имєнъ просторꙑ',
-
-'errorpagetitle'    => 'блаꙁна',
-'tagline'           => '{{grammar:genitive|{{SITENAME}}}} страница',
-'help'              => 'помощь',
-'search'            => 'исканиѥ',
-'searchbutton'      => 'ищи',
-'go'                => 'прѣиди',
-'searcharticle'     => 'прѣиди',
-'history'           => 'страницѧ їсторїꙗ',
-'history_short'     => 'їсторїꙗ',
-'printableversion'  => 'пєчатьнъ обраꙁъ',
-'permalink'         => 'въиньна съвѧꙁь',
-'print'             => 'пєчатаниѥ',
-'edit'              => 'исправи',
-'create'            => 'сътворѥниѥ',
-'editthispage'      => 'си страницѧ исправлѥниѥ',
-'create-this-page'  => 'си страницѧ сътворѥниѥ',
-'delete'            => 'поничьжєниѥ',
-'deletethispage'    => 'си страницѧ поничьжєниѥ',
-'protect'           => 'ꙁабранѥниѥ',
-'protect_change'    => 'иꙁмѣнѥниѥ',
-'protectthispage'   => 'си страницѧ ꙁабранєниѥ',
-'unprotect'         => 'поущєниѥ',
-'newpage'           => 'нова страница',
-'talkpage'          => 'си страницѧ бєсѣда',
-'talkpagelinktext'  => 'бєсѣда',
-'specialpage'       => 'нарочьна страница',
-'personaltools'     => 'моꙗ орѫдиꙗ',
-'postcomment'       => 'нова чѧсть',
-'talk'              => 'бєсѣда',
-'toolbox'           => 'орѫдиꙗ',
-'otherlanguages'    => 'дроугꙑ ѩꙁꙑкꙑ',
-'redirectedfrom'    => '(прѣнаправлѥниѥ отъ ⁖ $1 ⁖)',
-'redirectpagesub'   => 'прѣнаправлѥниѥ',
-'lastmodifiedat'    => 'страницѧ послѣдьнꙗ мѣна сътворѥна $2 · $1 бѣ ⁙',
-'jumpto'            => 'прѣиди къ :',
-'jumptonavigation'  => 'плаваниѥ',
-'jumptosearch'      => 'исканиѥ',
+'vector-action-delete' => 'поничьжєниѥ',
+'vector-action-move' => 'прѣимєнованиѥ',
+'vector-action-protect' => 'ꙁабранѥниѥ',
+'vector-action-unprotect' => 'иꙁмѣни ꙁабранѥниꙗ обраꙁъ',
+'vector-view-create' => 'сътворѥниѥ',
+'vector-view-edit' => 'исправи',
+'vector-view-history' => 'їсторїꙗ',
+'vector-view-view' => 'чьтѥниѥ',
+'vector-view-viewsource' => 'страницѧ источьнъ обраꙁъ',
+'actions' => 'дѣиства',
+'namespaces' => 'имєнъ просторꙑ',
+
+'errorpagetitle' => 'блаꙁна',
+'tagline' => '{{grammar:genitive|{{SITENAME}}}} страница',
+'help' => 'помощь',
+'search' => 'исканиѥ',
+'searchbutton' => 'ищи',
+'go' => 'прѣиди',
+'searcharticle' => 'прѣиди',
+'history' => 'страницѧ їсторїꙗ',
+'history_short' => 'їсторїꙗ',
+'printableversion' => 'пєчатьнъ обраꙁъ',
+'permalink' => 'въиньна съвѧꙁь',
+'print' => 'пєчатаниѥ',
+'edit' => 'исправи',
+'create' => 'сътворѥниѥ',
+'editthispage' => 'си страницѧ исправлѥниѥ',
+'create-this-page' => 'си страницѧ сътворѥниѥ',
+'delete' => 'поничьжєниѥ',
+'deletethispage' => 'си страницѧ поничьжєниѥ',
+'protect' => 'ꙁабранѥниѥ',
+'protect_change' => 'иꙁмѣнѥниѥ',
+'protectthispage' => 'си страницѧ ꙁабранєниѥ',
+'unprotect' => 'поущєниѥ',
+'newpage' => 'нова страница',
+'talkpage' => 'си страницѧ бєсѣда',
+'talkpagelinktext' => 'бєсѣда',
+'specialpage' => 'нарочьна страница',
+'personaltools' => 'моꙗ орѫдиꙗ',
+'postcomment' => 'нова чѧсть',
+'talk' => 'бєсѣда',
+'toolbox' => 'орѫдиꙗ',
+'otherlanguages' => 'дроугꙑ ѩꙁꙑкꙑ',
+'redirectedfrom' => '(прѣнаправлѥниѥ отъ ⁖ $1 ⁖)',
+'redirectpagesub' => 'прѣнаправлѥниѥ',
+'lastmodifiedat' => 'страницѧ послѣдьнꙗ мѣна сътворѥна $2 · $1 бѣ ⁙',
+'jumpto' => 'прѣиди къ :',
+'jumptonavigation' => 'плаваниѥ',
+'jumptosearch' => 'исканиѥ',
 'pool-errorunknown' => 'нєвѣдома блаꙁна',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => 'О {{grammar:instrumental|{{SITENAME}}}}',
-'aboutpage'            => 'Project:О сѥмь опꙑтьствовании',
-'copyright'            => 'подъ прощєниѥмь $1 пьсано ѥстъ',
-'copyrightpage'        => '{{ns:project}}:Творьцъ права',
-'currentevents'        => 'сѫщѧѩ вѣщи',
-'currentevents-url'    => 'Project:Сѫщѧѩ вѣщи',
-'edithelp'             => 'помощь по исправлѥниѭ',
-'edithelppage'         => 'Help:Исправлѥниѥ страницѧ',
-'helppage'             => 'Help:Каталогъ',
-'mainpage'             => 'главьна страница',
+'aboutsite' => 'О {{grammar:instrumental|{{SITENAME}}}}',
+'aboutpage' => 'Project:О сѥмь опꙑтьствовании',
+'copyright' => 'подъ прощєниѥмь $1 пьсано ѥстъ',
+'copyrightpage' => '{{ns:project}}:Творьцъ права',
+'currentevents' => 'сѫщѧѩ вѣщи',
+'currentevents-url' => 'Project:Сѫщѧѩ вѣщи',
+'edithelp' => 'помощь по исправлѥниѭ',
+'edithelppage' => 'Help:Исправлѥниѥ страницѧ',
+'helppage' => 'Help:Каталогъ',
+'mainpage' => 'главьна страница',
 'mainpage-description' => 'главьна страница',
-'policy-url'           => 'Project:Полїтїка',
-'portal'               => 'обьщєниꙗ съвѣтъ',
-'portal-url'           => 'Project:Обьщєниꙗ съвѣтъ',
-
-'pagetitle'           => '$1 · {{SITENAME}}',
-'retrievedfrom'       => 'поѩто иꙁ ⁖ $1 ⁖',
-'youhavenewmessages'  => '$1 тєбѣ напьсанꙑ сѫтъ ($2)',
-'newmessageslink'     => 'нови напьсаниꙗ',
+'policy-url' => 'Project:Полїтїка',
+'portal' => 'обьщєниꙗ съвѣтъ',
+'portal-url' => 'Project:Обьщєниꙗ съвѣтъ',
+
+'pagetitle' => '$1 · {{SITENAME}}',
+'retrievedfrom' => 'поѩто иꙁ ⁖ $1 ⁖',
+'youhavenewmessages' => '$1 тєбѣ напьсанꙑ сѫтъ ($2)',
+'newmessageslink' => 'нови напьсаниꙗ',
 'newmessagesdifflink' => 'послѣдьнꙗ мѣна',
-'editsection'         => 'исправи',
-'editold'             => 'исправи',
-'viewsourceold'       => 'страницѧ источьнъ обраꙁъ',
-'editlink'            => 'исправи',
-'viewsourcelink'      => 'страницѧ источьнъ обраꙁъ',
-'editsectionhint'     => 'исправлѥниѥ чѧсти : $1',
-'toc'                 => 'каталогъ',
-'showtoc'             => 'виждь',
-'hidetoc'             => 'съкрꙑи',
-'viewdeleted'         => '$1 видєти хощєши ;',
-'red-link-title'      => '$1 (си страницѧ нѣстъ)',
+'editsection' => 'исправи',
+'editold' => 'исправи',
+'viewsourceold' => 'страницѧ источьнъ обраꙁъ',
+'editlink' => 'исправи',
+'viewsourcelink' => 'страницѧ источьнъ обраꙁъ',
+'editsectionhint' => 'исправлѥниѥ чѧсти : $1',
+'toc' => 'каталогъ',
+'showtoc' => 'виждь',
+'hidetoc' => 'съкрꙑи',
+'viewdeleted' => '$1 видєти хощєши ;',
+'red-link-title' => '$1 (си страницѧ нѣстъ)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'члѣнъ',
-'nstab-user'      => 'польꙃєватєл҄ь',
-'nstab-media'     => 'срѣдьства',
-'nstab-special'   => 'нарочьна',
-'nstab-project'   => 'съвѣтъ',
-'nstab-image'     => 'дѣло',
+'nstab-main' => 'члѣнъ',
+'nstab-user' => 'польꙃєватєл҄ь',
+'nstab-media' => 'срѣдьства',
+'nstab-special' => 'нарочьна',
+'nstab-project' => 'съвѣтъ',
+'nstab-image' => 'дѣло',
 'nstab-mediawiki' => 'напьсаниѥ',
-'nstab-template'  => 'обраꙁьць',
-'nstab-help'      => 'страница помощи',
-'nstab-category'  => 'катигорїꙗ',
+'nstab-template' => 'обраꙁьць',
+'nstab-help' => 'страница помощи',
+'nstab-category' => 'катигорїꙗ',
 
 # General errors
-'error'      => 'блаꙁна',
+'error' => 'блаꙁна',
 'viewsource' => 'страницѧ источьнъ обраꙁъ',
 
 # Login and logout pages
-'yourname'                => 'твоѥ имѧ',
-'yourpassword'            => 'таино слово напиши',
-'yourpasswordagain'       => 'опакꙑ таиноѥ слово напиши',
-'login'                   => 'въниди',
+'yourname' => 'твоѥ имѧ',
+'yourpassword' => 'таино слово напиши',
+'yourpasswordagain' => 'опакꙑ таиноѥ слово напиши',
+'login' => 'въниди',
 'nav-login-createaccount' => 'въниди / съꙁижди си мѣсто',
-'userlogin'               => 'въниди / съꙁижди си мѣсто',
-'userloginnocreate'       => 'въниди',
-'logout'                  => 'ис̾ходъ',
-'userlogout'              => 'ис̾ходъ',
-'nologin'                 => 'мѣсто ти нѣстъ ли ? $1',
-'nologinlink'             => 'съꙁижди си мѣсто',
-'createaccount'           => 'съꙁижди си мѣсто',
-'gotaccount'              => 'мѣсто ти ѥстъ ли? $1',
-'gotaccountlink'          => 'въниди',
-'createaccountreason'     => 'какъ съмꙑслъ :',
-'userexists'              => 'сѫщє польꙃєватєлꙗ имѧ пьса ⁙ ино иꙁобрѧщи',
-'loginerror'              => 'въхода блаꙁна',
-'accountcreated'          => 'мѣсто сътворєно ѥстъ',
-'loginlanguagelabel'      => 'ѩꙁꙑкъ : $1',
+'userlogin' => 'въниди / съꙁижди си мѣсто',
+'userloginnocreate' => 'въниди',
+'logout' => 'ис̾ходъ',
+'userlogout' => 'ис̾ходъ',
+'nologin' => 'мѣсто ти нѣстъ ли ? $1',
+'nologinlink' => 'съꙁижди си мѣсто',
+'createaccount' => 'съꙁижди си мѣсто',
+'gotaccount' => 'мѣсто ти ѥстъ ли? $1',
+'gotaccountlink' => 'въниди',
+'createaccountreason' => 'какъ съмꙑслъ :',
+'userexists' => 'сѫщє польꙃєватєлꙗ имѧ пьса ⁙ ино иꙁобрѧщи',
+'loginerror' => 'въхода блаꙁна',
+'accountcreated' => 'мѣсто сътворєно ѥстъ',
+'loginlanguagelabel' => 'ѩꙁꙑкъ : $1',
 
 # Change password dialog
-'resetpass'                 => 'таина словєсє иꙁмѣнѥниѥ',
-'oldpassword'               => 'старо таино слово :',
-'newpassword'               => 'ново таино слово :',
+'resetpass' => 'таина словєсє иꙁмѣнѥниѥ',
+'oldpassword' => 'старо таино слово :',
+'newpassword' => 'ново таино слово :',
 'resetpass-submit-loggedin' => 'таина словєсє иꙁмѣнѥниѥ',
 
 # Special:PasswordReset
 'passwordreset-username' => 'польꙃєватєлꙗ имѧ :',
 
 # Edit page toolbar
-'link_sample'    => 'съвѧꙁи имѧ',
-'link_tip'       => 'вънѫтрьнꙗ съвѧꙁь',
+'link_sample' => 'съвѧꙁи имѧ',
+'link_tip' => 'вънѫтрьнꙗ съвѧꙁь',
 'extlink_sample' => 'http://www.example.com съвѧꙁи имѧ',
-'extlink_tip'    => 'вънѣщьнꙗ съвѧꙁь (помьни о http://)',
-'media_tip'      => 'дѣла съвѧꙁь',
-'sig_tip'        => 'твои аѵтографъ и нꙑнѣшьна врѣмѧ и дьнь',
+'extlink_tip' => 'вънѣщьнꙗ съвѧꙁь (помьни о http://)',
+'media_tip' => 'дѣла съвѧꙁь',
+'sig_tip' => 'твои аѵтографъ и нꙑнѣшьна врѣмѧ и дьнь',
 
 # Edit pages
-'summary'                    => 'опьсаниѥ :',
-'minoredit'                  => 'малаꙗ мѣна',
-'watchthis'                  => 'си страницѧ блюдєниѥ',
-'savearticle'                => 'съхранѥниѥ',
-'showpreview'                => 'мѣнꙑ поꙁьрѣниѥ (бєꙁ съхранѥниꙗ)',
-'blockedtitle'               => 'польꙃєватєл҄ь ꙁаграждєнъ ѥстъ',
-'loginreqlink'               => 'въниди',
-'newarticle'                 => '(новъ)',
-'noarticletext'              => 'нꙑнѣ с̑ьдє ничєсожє нє напьсано ѥстъ ⁙
+'summary' => 'опьсаниѥ :',
+'minoredit' => 'малаꙗ мѣна',
+'watchthis' => 'си страницѧ блюдєниѥ',
+'savearticle' => 'съхранѥниѥ',
+'showpreview' => 'мѣнꙑ поꙁьрѣниѥ (бєꙁ съхранѥниꙗ)',
+'blockedtitle' => 'польꙃєватєл҄ь ꙁаграждєнъ ѥстъ',
+'loginreqlink' => 'въниди',
+'newarticle' => '(новъ)',
+'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'  => 'польꙃєватєльска мѣста ⁖ $1 ⁖ нꙑнѣ нѣстъ ⁙
+'userpage-userdoesnotexist' => 'польꙃєватєльска мѣста ⁖ $1 ⁖ нꙑнѣ нѣстъ ⁙
 прѣдъ сътворѥниѥмь или исправлѥниѥмь си страницѧ помꙑсли жє ащє исто тъ дѣиство ноуждьно ли',
-'clearyourcache'             => 'НАРОЧИТО: По съхранѥнии можєши обити своѥго съмотрила съхранъ да видѣлъ би мѣнꙑ ⁙ Mozilla ли Firefox ли Safari ли жьмꙑи Shift а мꙑшиѭ жьми Reload или жьми Ctrl-Shift-R (Cmd-Shift-R вън Apple Mac)  ⁙ Konqueror ли жьми кромѣ Reload или F5 ⁙ Опєрꙑ польꙃєватєльмъ можєть бꙑти ноужда пльнѣ поничьжити ихъ съмотрила съхранъ въ Tools > Preferences ⁙ IE ли жьмꙑи Ctrl а мꙑшиѭ жьми Refresh или жьми Ctrl-F5',
-'note'                       => "'''НАРОЧИТО:'''",
-'editing'                    => 'исправлѥниѥ: $1',
-'editingsection'             => 'исправлѥниѥ ⁖ $1 ⁖ (чѧсть)',
-'editingcomment'             => 'исправлѥниѥ ⁖ $1 ⁖ (нова чѧсть)',
-'templatesused'              => 'сѥѩ страницѧ {{PLURAL:$1|сь обраꙁьць польꙃоуѥтъ сѧ ѥстъ|с҄и обраꙁьца польꙃоуѭтъ сѧ ѥстє|с҄и обраꙁьци польꙃоуѭтъ сѧ сѫтъ}} :',
-'template-protected'         => '(ꙁабранєно ѥстъ)',
-'template-semiprotected'     => '(чѧстьно ꙁабранѥно)',
+'clearyourcache' => "'''НАРОЧИТО''': По съхранѥнии можєши обити своѥго съмотрила съхранъ да видѣлъ би мѣнꙑ
+* '''Mozilla ли Firefox ли Safari''' ли жьмꙑи Shift а мꙑшиѭ жьми Reload или жьми Ctrl-Shift-R (⌘-R вън Apple Mac)
+* '''Google Chrome:''' ли жьмꙑи Ctrl-Shift-R (⌘-Shift-R въ Mac)
+* '''Internet Explorer''' ли жьмꙑи Ctrl а мꙑшиѭ жьми Refresh или жьми Ctrl-F5
+* '''Konqueror''' ли жьми кромѣ Reload или F5 
+* '''Опєрꙑ''' польꙃєватєльмъ можєть бꙑти ноужда пльнѣ поничьжити ихъ съмотрила съхранъ въ Tools → Preferences ⁙",
+'note' => "'''НАРОЧИТО:'''",
+'editing' => 'исправлѥниѥ: $1',
+'editingsection' => 'исправлѥниѥ ⁖ $1 ⁖ (чѧсть)',
+'editingcomment' => 'исправлѥниѥ ⁖ $1 ⁖ (нова чѧсть)',
+'templatesused' => 'сѥѩ страницѧ {{PLURAL:$1|сь обраꙁьць польꙃоуѥтъ сѧ ѥстъ|с҄и обраꙁьца польꙃоуѭтъ сѧ ѥстє|с҄и обраꙁьци польꙃоуѭтъ сѧ сѫтъ}} :',
+'template-protected' => '(ꙁабранєно ѥстъ)',
+'template-semiprotected' => '(чѧстьно ꙁабранѥно)',
 
 # History pages
-'viewpagelogs'           => 'си страницѧ їсторїѩ',
-'cur'                    => 'нꙑ҃н',
-'last'                   => 'пс҃лд',
-'page_first'             => 'прьва страница',
-'page_last'              => 'послѣдьнꙗ страница',
+'viewpagelogs' => 'си страницѧ їсторїѩ',
+'cur' => 'нꙑ҃н',
+'last' => 'пс҃лд',
+'page_first' => 'прьва страница',
+'page_last' => 'послѣдьнꙗ страница',
 'history-fieldset-title' => 'виждь мѣнъ їсторїѭ',
-'history-show-deleted'   => 'тъкъмо поничьжєнꙑ мѣнꙑ',
-'histfirst'              => 'прьвꙑ',
-'histlast'               => 'послѣдьнꙗ',
-'historysize'            => '{{PLURAL:$1|1 баитъ|$1 баита|$1 баитъ}}',
-'historyempty'           => '(поусто)',
+'history-show-deleted' => 'тъкъмо поничьжєнꙑ мѣнꙑ',
+'histfirst' => 'прьвꙑ',
+'histlast' => 'послѣдьнꙗ',
+'historysize' => '{{PLURAL:$1|1 баитъ|$1 баита|$1 баитъ}}',
+'historyempty' => '(поусто)',
 
 # Revision feed
-'history-feed-title'          => 'мѣнъ їсторїꙗ',
+'history-feed-title' => 'мѣнъ їсторїꙗ',
 'history-feed-item-nocomment' => '$1 при $2',
 
 # Revision deletion
-'rev-delundel'               => 'каꙁаниѥ / съкрꙑтиѥ',
-'rev-showdeleted'            => 'виждь',
+'rev-delundel' => 'каꙁаниѥ / съкрꙑтиѥ',
+'rev-showdeleted' => 'виждь',
 'revdelete-show-file-submit' => 'да',
-'revdelete-radio-set'        => 'да',
-'revdelete-radio-unset'      => 'нѣтъ',
-'revdelete-log'              => 'какъ съмꙑслъ :',
-'pagehist'                   => 'страницѧ їсторїꙗ',
-'deletedhist'                => 'поничьжєна їсторїꙗ',
-'revdelete-otherreason'      => 'инъ или допльнитєл҄ьнъ съмꙑслъ :',
-'revdelete-reasonotherlist'  => 'инъ съмꙑслъ',
+'revdelete-radio-set' => 'да',
+'revdelete-radio-unset' => 'нѣтъ',
+'revdelete-log' => 'какъ съмꙑслъ :',
+'pagehist' => 'страницѧ їсторїꙗ',
+'deletedhist' => 'поничьжєна їсторїꙗ',
+'revdelete-otherreason' => 'инъ или допльнитєл҄ьнъ съмꙑслъ :',
+'revdelete-reasonotherlist' => 'инъ съмꙑслъ',
 
 # History merging
 'mergehistory-reason' => 'какъ съмꙑслъ :',
 
 # Search results
-'searchresults'                  => 'исканиꙗ слѣдьствиѥ',
-'searchresults-title'            => 'исканиꙗ ⁖ $1 ⁖ слѣдьствиѥ',
-'viewprevnext'                   => 'виждь ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists'              => "'''страница имєньмь ⁖ [[:$1]] ⁖ ѥстъ створѥна ю'''",
-'searchmenu-new'                 => "'''страницѫ ⁖ [[:$1]] ⁖ сътворити можєши'''",
-'searchhelp-url'                 => 'Help:Каталогъ',
-'searchprofile-articles'         => 'члѣни',
-'searchprofile-project'          => 'опꙑтьствовании и помощи страницѧ',
-'searchprofile-images'           => 'дѣла',
-'searchprofile-everything'       => 'вьсѩ страницѧ',
+'searchresults' => 'исканиꙗ слѣдьствиѥ',
+'searchresults-title' => 'исканиꙗ ⁖ $1 ⁖ слѣдьствиѥ',
+'viewprevnext' => 'виждь ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''страница имєньмь ⁖ [[:$1]] ⁖ ѥстъ створѥна ю'''",
+'searchmenu-new' => "'''страницѫ ⁖ [[:$1]] ⁖ сътворити можєши'''",
+'searchhelp-url' => 'Help:Каталогъ',
+'searchprofile-articles' => 'члѣни',
+'searchprofile-project' => 'опꙑтьствовании и помощи страницѧ',
+'searchprofile-images' => 'дѣла',
+'searchprofile-everything' => 'вьсѩ страницѧ',
 'searchprofile-articles-tooltip' => 'ищи въ $1',
-'search-result-size'             => '$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 словєсъ}})',
-'search-redirect'                => '(прѣнаправлєниѥ $1)',
-'search-section'                 => '(чѧсть $1)',
-'search-interwiki-caption'       => 'родьствьна опꙑтьствованиꙗ',
-'search-interwiki-more'          => '(вѧщє)',
-'searchall'                      => 'вьсꙗ',
-'powersearch'                    => 'ищи',
-'powersearch-redir'              => 'прѣнаправлѥниꙗ',
+'search-result-size' => '$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 словєсъ}})',
+'search-redirect' => '(прѣнаправлєниѥ $1)',
+'search-section' => '(чѧсть $1)',
+'search-interwiki-caption' => 'родьствьна опꙑтьствованиꙗ',
+'search-interwiki-more' => '(вѧщє)',
+'searchall' => 'вьсꙗ',
+'powersearch' => 'ищи',
+'powersearch-redir' => 'прѣнаправлѥниꙗ',
 
 # Preferences page
-'preferences'               => 'строи',
-'mypreferences'             => 'мои строи',
-'changepassword'            => 'таина словєсє иꙁмѣнѥниѥ',
-'prefs-rc'                  => 'послѣдьнѩ мѣнꙑ',
-'prefs-watchlist'           => 'блюдєниꙗ',
-'prefs-resetpass'           => 'таина словєсє иꙁмѣнѥниѥ',
-'saveprefs'                 => 'съхранѥниѥ',
-'prefs-editing'             => 'исправлѥниѥ',
-'rows'                      => 'рѧдꙑ :',
-'searchresultshead'         => 'исканиѥ',
-'timezoneregion-africa'     => 'Афрїка',
-'timezoneregion-america'    => 'Амєрїка',
+'preferences' => 'строи',
+'mypreferences' => 'мои строи',
+'changepassword' => 'таина словєсє иꙁмѣнѥниѥ',
+'prefs-rc' => 'послѣдьнѩ мѣнꙑ',
+'prefs-watchlist' => 'блюдєниꙗ',
+'prefs-resetpass' => 'таина словєсє иꙁмѣнѥниѥ',
+'saveprefs' => 'съхранѥниѥ',
+'prefs-editing' => 'исправлѥниѥ',
+'rows' => 'рѧдꙑ :',
+'searchresultshead' => 'исканиѥ',
+'timezoneregion-africa' => 'Афрїка',
+'timezoneregion-america' => 'Амєрїка',
 'timezoneregion-antarctica' => 'Антарктїка',
-'timezoneregion-arctic'     => 'Арктїка',
-'timezoneregion-asia'       => 'Асїꙗ',
-'timezoneregion-atlantic'   => 'Атлантїчьскъ ѡкєанъ',
-'timezoneregion-australia'  => 'Аѵстралїꙗ',
-'timezoneregion-europe'     => 'Єѵрѡпа',
-'timezoneregion-indian'     => 'Їндїискъ ѡкєанъ',
-'timezoneregion-pacific'    => 'Тихꙑи ѡкєанъ',
-'prefs-searchoptions'       => 'исканиꙗ строи',
-'prefs-namespaces'          => 'имєнъ просторꙑ',
-'prefs-files'               => 'дѣла',
-'username'                  => 'польꙃєватєлꙗ имѧ :',
-'uid'                       => 'польꙃєватєлꙗ число :',
-'yourrealname'              => 'истиньно имѧ :',
-'yourlanguage'              => 'ѩꙁꙑкъ :',
-'yournick'                  => 'аѵтографъ :',
-'yourgender'                => 'полъ :',
-'gender-male'               => 'мѫжъ',
-'gender-female'             => 'жєна',
-'prefs-signature'           => 'аѵтографъ',
+'timezoneregion-arctic' => 'Арктїка',
+'timezoneregion-asia' => 'Асїꙗ',
+'timezoneregion-atlantic' => 'Атлантїчьскъ ѡкєанъ',
+'timezoneregion-australia' => 'Аѵстралїꙗ',
+'timezoneregion-europe' => 'Єѵрѡпа',
+'timezoneregion-indian' => 'Їндїискъ ѡкєанъ',
+'timezoneregion-pacific' => 'Тихꙑи ѡкєанъ',
+'prefs-searchoptions' => 'исканиꙗ строи',
+'prefs-namespaces' => 'имєнъ просторꙑ',
+'prefs-files' => 'дѣла',
+'username' => 'польꙃєватєлꙗ имѧ :',
+'uid' => 'польꙃєватєлꙗ число :',
+'yourrealname' => 'истиньно имѧ :',
+'yourlanguage' => 'ѩꙁꙑкъ :',
+'yournick' => 'аѵтографъ :',
+'yourgender' => 'полъ :',
+'gender-male' => 'мѫжъ',
+'gender-female' => 'жєна',
+'prefs-signature' => 'аѵтографъ',
 
 # User rights
 'userrights-reason' => 'какъ съмꙑслъ :',
 
 # Groups
-'group'            => 'чинъ :',
-'group-user'       => 'польꙃєватєлє',
-'group-bot'        => 'аѵтомати',
-'group-sysop'      => 'съмотритєлє',
+'group' => 'чинъ :',
+'group-user' => 'польꙃєватєлє',
+'group-bot' => 'аѵтомати',
+'group-sysop' => 'съмотритєлє',
 'group-bureaucrat' => 'чинодатєлє',
 
-'group-user-member'       => '{{GENDER:$1|польꙃєватєл҄ь|польꙃєватєл҄ьница}}',
-'group-bot-member'        => 'аѵтоматъ',
-'group-sysop-member'      => 'съмотритєл҄ь',
-'group-bureaucrat-member' => 'чинодатєл҄ь',
+'group-user-member' => '{{GENDER:$1|польꙃєватєл҄ь|польꙃєватєл҄ьница}}',
+'group-bot-member' => '{{GENDER:$1|аѵтоматъ}}',
+'group-sysop-member' => '{{GENDER:$1|съмотритєл҄ь}}',
+'group-bureaucrat-member' => '{{GENDER:$1|чинодатєл҄ь}}',
 
-'grouppage-user'       => '{{ns:project}}:Польꙃєватєлє',
-'grouppage-bot'        => '{{ns:project}}:Аѵтомати',
-'grouppage-sysop'      => '{{ns:project}}:Съмотритєлє',
+'grouppage-user' => '{{ns:project}}:Польꙃєватєлє',
+'grouppage-bot' => '{{ns:project}}:Аѵтомати',
+'grouppage-sysop' => '{{ns:project}}:Съмотритєлє',
 'grouppage-bureaucrat' => '{{ns:project}}:Чинодатєлє',
 
 # User rights log
@@ -447,76 +452,76 @@ $messages = array(
 'action-edit' => 'си страницѧ исправлєниѥ',
 
 # Recent changes
-'nchanges'                    => '$1 {{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
-'recentchanges'               => 'послѣдьнѩ мѣнꙑ',
-'recentchanges-legend'        => 'послѣдьн҄ь мѣнъ строи',
-'recentchangestext'           => 'с҄ьдє послѣдьнѩ мѣнꙑ сѥѩ викиопꙑтьствованиꙗ видѣти можєши',
+'nchanges' => '$1 {{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
+'recentchanges' => 'послѣдьнѩ мѣнꙑ',
+'recentchanges-legend' => 'послѣдьн҄ь мѣнъ строи',
+'recentchangestext' => 'с҄ьдє послѣдьнѩ мѣнꙑ сѥѩ викиопꙑтьствованиꙗ видѣти можєши',
 'recentchanges-label-newpage' => 'по сѥи мѣнꙑ нова страница сътворѥна ѥстъ',
-'recentchanges-label-minor'   => 'малаꙗ мѣна',
-'recentchanges-label-bot'     => 'сѭ мѣноу аѵтоматъ сътворихъ',
-'rcnote'                      => "нижѣ {{PLURAL:$1|'''1''' послѣдьнѭ мѣнѫ|'''$1''' послѣдьни мѣнꙑ|'''$1''' послѣдьнъ мѣнъ|'''$1''' послѣдьнъ мѣнъ}} ꙁа {{PLURAL:$2|дьнь|'''$2''' дьнꙗ|'''$2''' дьнъ|'''$2''' дьнъ}} · ꙗко нꙑнѣ $5 · $4 лѣта",
-'rcshowhideminor'             => '$1 малꙑ мѣнꙑ',
-'rcshowhidebots'              => '$1 аѵтоматъ',
-'rcshowhideliu'               => '$1 польꙃєватєлъ · ѩжє съꙁижьдє сѥ мѣсто · мѣнꙑ',
-'rcshowhideanons'             => '$1 анѡнѷмьнъ польꙃєватєлъ мѣнꙑ',
-'rcshowhidemine'              => '$1 моꙗ мѣнꙑ',
-'rclinks'                     => '$1 послѣдьн҄ь  мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ<br />$3',
-'diff'                        => 'ра҃ꙁн',
-'hist'                        => 'їс҃т',
-'hide'                        => 'съкрꙑи',
-'show'                        => 'виждь',
-'minoreditletter'             => 'м҃л',
-'newpageletter'               => 'н҃в',
-'boteditletter'               => 'а҃ѵ',
+'recentchanges-label-minor' => 'малаꙗ мѣна',
+'recentchanges-label-bot' => 'сѭ мѣноу аѵтоматъ сътворихъ',
+'rcnote' => "нижѣ {{PLURAL:$1|'''1''' послѣдьнѭ мѣнѫ|'''$1''' послѣдьни мѣнꙑ|'''$1''' послѣдьнъ мѣнъ|'''$1''' послѣдьнъ мѣнъ}} ꙁа {{PLURAL:$2|дьнь|'''$2''' дьнꙗ|'''$2''' дьнъ|'''$2''' дьнъ}} · ꙗко нꙑнѣ $5 · $4 лѣта",
+'rcshowhideminor' => '$1 малꙑ мѣнꙑ',
+'rcshowhidebots' => '$1 аѵтоматъ',
+'rcshowhideliu' => '$1 польꙃєватєлъ · ѩжє съꙁижьдє сѥ мѣсто · мѣнꙑ',
+'rcshowhideanons' => '$1 анѡнѷмьнъ польꙃєватєлъ мѣнꙑ',
+'rcshowhidemine' => '$1 моꙗ мѣнꙑ',
+'rclinks' => '$1 послѣдьн҄ь  мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ<br />$3',
+'diff' => 'ра҃ꙁн',
+'hist' => 'їс҃т',
+'hide' => 'съкрꙑи',
+'show' => 'виждь',
+'minoreditletter' => 'м҃л',
+'newpageletter' => 'н҃в',
+'boteditletter' => 'а҃ѵ',
 
 # Recent changes linked
-'recentchangeslinked'         => 'съвѧꙁанꙑ страницѧ',
-'recentchangeslinked-feed'    => 'съвѧꙁанꙑ страницѧ',
+'recentchangeslinked' => 'съвѧꙁанꙑ страницѧ',
+'recentchangeslinked-feed' => 'съвѧꙁанꙑ страницѧ',
 'recentchangeslinked-toolbox' => 'съвѧꙁанꙑ страницѧ',
-'recentchangeslinked-page'    => 'страницѧ имѧ :',
+'recentchangeslinked-page' => 'страницѧ имѧ :',
 
 # Upload
-'upload'              => 'положєниѥ дѣла',
-'uploadbtn'           => 'положєниѥ дѣла',
-'uploadlog'           => 'дѣлъ положєниꙗ їсторїꙗ',
-'uploadlogpage'       => 'дѣлъ положєниꙗ їсторїꙗ',
-'filename'            => 'дѣла имѧ',
-'filedesc'            => 'опьсаниѥ',
-'fileuploadsummary'   => 'опьсаниѥ:',
-'uploadedimage'       => '⁖ [[$1]] ⁖ положєнъ ѥстъ',
-'watchthisupload'     => 'си дѣла блюдєниѥ',
+'upload' => 'положєниѥ дѣла',
+'uploadbtn' => 'положєниѥ дѣла',
+'uploadlog' => 'дѣлъ положєниꙗ їсторїꙗ',
+'uploadlogpage' => 'дѣлъ положєниꙗ їсторїꙗ',
+'filename' => 'дѣла имѧ',
+'filedesc' => 'опьсаниѥ',
+'fileuploadsummary' => 'опьсаниѥ:',
+'uploadedimage' => '⁖ [[$1]] ⁖ положєнъ ѥстъ',
+'watchthisupload' => 'си дѣла блюдєниѥ',
 'upload-success-subj' => 'дѣло положєно ѥстъ',
 
-'license'        => 'прощєниѥ :',
+'license' => 'прощєниѥ :',
 'license-header' => 'прощєниѥ',
 
 # Special:ListFiles
-'imgfile'        => 'дѣло',
-'listfiles'      => 'дѣлъ каталогъ',
+'imgfile' => 'дѣло',
+'listfiles' => 'дѣлъ каталогъ',
 'listfiles_name' => 'и́мѧ',
 'listfiles_user' => 'польꙃєватєл҄ь',
 'listfiles_size' => 'мѣра',
 
 # File description page
-'file-anchor-link'   => 'дѣло',
-'filehist'           => 'дѣла їсторїꙗ',
+'file-anchor-link' => 'дѣло',
+'filehist' => 'дѣла їсторїꙗ',
 'filehist-deleteone' => 'поничьжєниѥ',
-'filehist-current'   => 'нꙑнѣщьн҄ь обраꙁъ',
-'filehist-datetime'  => 'дьнь / врѣмѧ',
-'filehist-user'      => 'польꙃєватєл҄ь',
-'filehist-filesize'  => 'дѣла мѣра',
-'filehist-comment'   => 'опьсаниѥ',
-'imagelinks'         => 'дѣла польꙃєваниѥ',
-'sharedupload'       => 'сѥ дѣло въ $1 съхранѥно ѥстъ дѣла · ѥгожє дроугꙑ опꙑтьствованиѩ польꙃєвати могѫтъ',
+'filehist-current' => 'нꙑнѣщьн҄ь обраꙁъ',
+'filehist-datetime' => 'дьнь / врѣмѧ',
+'filehist-user' => 'польꙃєватєл҄ь',
+'filehist-filesize' => 'дѣла мѣра',
+'filehist-comment' => 'опьсаниѥ',
+'imagelinks' => 'дѣла польꙃєваниѥ',
+'sharedupload' => 'сѥ дѣло въ $1 съхранѥно ѥстъ дѣла · ѥгожє дроугꙑ опꙑтьствованиѩ польꙃєвати могѫтъ',
 
 # File reversion
 'filerevert-comment' => 'какъ съмꙑслъ :',
 
 # File deletion
-'filedelete'         => 'поничьжєниѥ $1',
-'filedelete-legend'  => 'дѣла поничьжєниѥ',
+'filedelete' => 'поничьжєниѥ $1',
+'filedelete-legend' => 'дѣла поничьжєниѥ',
 'filedelete-comment' => 'какъ съмꙑслъ :',
-'filedelete-submit'  => 'поничьжєниѥ',
+'filedelete-submit' => 'поничьжєниѥ',
 
 # MIME search
 'mimetype' => 'MIME тѷпъ :',
@@ -532,57 +537,57 @@ $messages = array(
 'randomredirect' => 'прѣнаправлѥниє въ нєꙁаапѫ',
 
 # Statistics
-'statistics'              => 'статїстїка',
+'statistics' => 'статїстїка',
 'statistics-header-pages' => 'страницѧ статїстїка',
 'statistics-header-edits' => 'мѣнъ статїстїка',
 'statistics-header-users' => 'польꙃєватєлъ статїстїка',
-'statistics-articles'     => 'истиньнꙑ члѣни',
-'statistics-pages'        => 'страницѧ',
-'statistics-files'        => 'положєнꙑ дѣла',
+'statistics-articles' => 'истиньнꙑ члѣни',
+'statistics-pages' => 'страницѧ',
+'statistics-files' => 'положєнꙑ дѣла',
 
-'disambiguations'     => 'страницѧ ижє съвѧꙁи съ мъногосъмꙑслиꙗ имѫтъ',
+'disambiguations' => 'страницѧ ижє съвѧꙁи съ мъногосъмꙑслиꙗ имѫтъ',
 'disambiguationspage' => 'Template:мъногосъмꙑслиѥ',
 
-'brokenredirects-edit'   => 'исправи',
+'brokenredirects-edit' => 'исправи',
 'brokenredirects-delete' => 'поничьжєниѥ',
 
 # Miscellaneous special pages
-'nbytes'            => '$1 {{PLURAL:$1|баитъ|баита|баитъ}}',
-'nlinks'            => '$1 {{PLURAL:$1|съвѧꙁь|съвѧꙁи|съвѧꙁии}}',
-'nmembers'          => '$1 {{PLURAL:$1|члѣнъ|члѣна|члѣни|члѣнъ}}',
-'shortpages'        => 'кратъкꙑ страницѧ',
-'listusers'         => 'польꙃєватєлъ каталогъ',
-'usercreated'       => '{{GENDER:$3|сътворилъ|сътворила}} мѣсто $1 въ $2',
-'newpages'          => 'нови члѣни',
+'nbytes' => '$1 {{PLURAL:$1|баитъ|баита|баитъ}}',
+'nlinks' => '$1 {{PLURAL:$1|съвѧꙁь|съвѧꙁи|съвѧꙁии}}',
+'nmembers' => '$1 {{PLURAL:$1|члѣнъ|члѣна|члѣни|члѣнъ}}',
+'shortpages' => 'кратъкꙑ страницѧ',
+'listusers' => 'польꙃєватєлъ каталогъ',
+'usercreated' => '{{GENDER:$3|сътворилъ|сътворила}} мѣсто $1 въ $2',
+'newpages' => 'нови члѣни',
 'newpages-username' => 'польꙃєватєлꙗ имѧ :',
-'move'              => 'прѣимєнованиѥ',
-'movethispage'      => 'си страницѧ прѣимєнованиѥ',
+'move' => 'прѣимєнованиѥ',
+'movethispage' => 'си страницѧ прѣимєнованиѥ',
 
 # Book sources
 'booksources-go' => 'прѣиди',
 
 # Special:Log
-'specialloguserlabel'  => 'польꙃєватєл҄ь:',
+'specialloguserlabel' => 'польꙃєватєл҄ь:',
 'speciallogtitlelabel' => 'страницѧ имѧ :',
-'log'                  => 'їсторїѩ',
-'all-logs-page'        => 'вьсѩ обьщѧ їсторїѩ',
+'log' => 'їсторїѩ',
+'all-logs-page' => 'вьсѩ обьщѧ їсторїѩ',
 
 # Special:AllPages
-'allpages'       => 'вьсѩ страницѧ',
+'allpages' => 'вьсѩ страницѧ',
 'alphaindexline' => 'отъ $1 до $2',
-'allpagesfrom'   => 'страницѧ видѣти хощѫ съ начѧльнами боукъвами :',
-'allarticles'    => 'вьсѩ страницѧ',
+'allpagesfrom' => 'страницѧ видѣти хощѫ съ начѧльнами боукъвами :',
+'allarticles' => 'вьсѩ страницѧ',
 'allpagessubmit' => 'прѣиди',
 
 # Special:Categories
 'categories' => 'катигорїѩ',
 
 # Special:DeletedContributions
-'deletedcontributions'       => 'поничьжєнꙑ добродѣꙗниꙗ',
+'deletedcontributions' => 'поничьжєнꙑ добродѣꙗниꙗ',
 'deletedcontributions-title' => 'поничьжєнꙑ добродѣꙗниꙗ',
 
 # Special:LinkSearch
-'linksearch'    => 'вънѣщьн҄ь съвѧꙁь исканиѥ',
+'linksearch' => 'вънѣщьн҄ь съвѧꙁь исканиѥ',
 'linksearch-ok' => 'ищи',
 
 # Special:ListUsers
@@ -595,141 +600,147 @@ $messages = array(
 'emailuser' => 'посъли єпїстолѫ',
 
 # Watchlist
-'watchlist'        => 'моꙗ блюдєниꙗ',
-'mywatchlist'      => 'моꙗ блюдєниꙗ',
-'addedwatchtext'   => "страница ⁖ [[:$1]] ⁖ нꙑнѣ подъ твоимь [[Special:Watchlist|блюдєниѥмь]] ѥстъ ⁙
+'watchlist' => 'моꙗ блюдєниꙗ',
+'mywatchlist' => 'моꙗ блюдєниꙗ',
+'addedwatchtext' => "страница ⁖ [[:$1]] ⁖ нꙑнѣ подъ твоимь [[Special:Watchlist|блюдєниѥмь]] ѥстъ ⁙
 всꙗ ѥѩ и ѥѩжє бєсѣдꙑ мѣнꙑ страницѧ ⁖ [[Special:Watchlist|моꙗ блюдєниꙗ]] ⁖ покаꙁанꙑ сѫтъ и  [[Special:RecentChanges|послѣдьнъ мѣнъ]] каталоꙃѣ '''чрьнꙑимъ''' сѧ авлꙗѭтъ",
 'removedwatchtext' => 'страница ⁖ [[:$1]] ⁖ нꙑнѣ твоѥго [[Special:Watchlist|блюдєниꙗ]] иꙁнєсєна ѥстъ',
-'watch'            => 'блюдєниѥ',
-'watchthispage'    => 'си страницѧ блюдєниѥ',
-'unwatch'          => 'остави блюдєниѥ',
+'watch' => 'блюдєниѥ',
+'watchthispage' => 'си страницѧ блюдєниѥ',
+'unwatch' => 'остави блюдєниѥ',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'блюдєниѥ ...',
+'watching' => 'блюдєниѥ ...',
 'unwatching' => 'оставьлєниѥ блюдєниꙗ ...',
 
 'created' => 'сътворѥнъ ѥстъ',
 
 # Delete
-'deletepage'      => 'поничьжєниѥ',
-'excontent'       => "вънѫтри бѣ: '$1'",
+'deletepage' => 'поничьжєниѥ',
+'excontent' => "вънѫтри бѣ: '$1'",
 'excontentauthor' => "вънѫтри бѣ : '$1' (и послѣдьн҄ии дѣтєл҄ь бѣ '[[Special:Contributions/$2|$2]]')",
-'delete-legend'   => 'поничьжєниѥ',
-'actioncomplete'  => 'дѣиство сътворєно ѥстъ',
-'deletedtext'     => 'страница ⁖ $1 ⁖ поничьжєна ѥстъ ⁙
+'delete-legend' => 'поничьжєниѥ',
+'actioncomplete' => 'дѣиство сътворєно ѥстъ',
+'deletedtext' => 'страница ⁖ $1 ⁖ поничьжєна ѥстъ ⁙
 виждь ⁖ $2 ⁖ послѣдьнъ поничьжєниѩ дѣлꙗ',
-'dellogpage'      => 'поничьжєниꙗ їсторїꙗ',
-'deletionlog'     => 'поничьжєниꙗ їсторїꙗ',
-'deletecomment'   => 'какъ съмꙑслъ :',
+'dellogpage' => 'поничьжєниꙗ їсторїꙗ',
+'deletionlog' => 'поничьжєниꙗ їсторїꙗ',
+'deletecomment' => 'какъ съмꙑслъ :',
 
 # Protect
-'protectlogpage'         => 'ꙁабранѥниꙗ їсторїꙗ',
-'protectedarticle'       => '⁖ [[$1]] ⁖ ꙁабранѥна ѥстъ',
-'prot_1movedto2'         => '⁖ [[$1]] ⁖ нарєчєнъ ⁖ [[$2]] ⁖ ѥстъ',
-'protectcomment'         => 'какъ съмꙑслъ :',
-'protect-level-sysop'    => 'толико съмотритєлє',
-'protect-expiry-options' => '2 часа:2 hours,1 дьнь:1 day,3 дьни:3 days,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
+'protectlogpage' => 'ꙁабранѥниꙗ їсторїꙗ',
+'protectedarticle' => '⁖ [[$1]] ⁖ ꙁабранѥна ѥстъ',
+'prot_1movedto2' => '⁖ [[$1]] ⁖ нарєчєнъ ⁖ [[$2]] ⁖ ѥстъ',
+'protectcomment' => 'какъ съмꙑслъ :',
+'protect-level-sysop' => 'толико съмотритєлє',
+'protect-expiry-options' => '1 часъ:1 hour,1 дьнь:1 day,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
+'pagesize' => '(баитъ)',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'исправи',
-'restriction-move'   => 'прѣимєнованиѥ',
+'restriction-edit' => 'исправи',
+'restriction-move' => 'прѣимєнованиѥ',
 'restriction-upload' => 'положєниѥ',
 
 # Undelete
-'undeletecomment'        => 'какъ съмꙑслъ :',
+'undeletecomment' => 'какъ съмꙑслъ :',
 'undelete-search-submit' => 'ищи',
 
 # Namespace form on various pages
-'namespace'      => 'имєнъ просторъ:',
+'namespace' => 'имєнъ просторъ:',
 'blanknamespace' => '(главьно)',
 
 # Contributions
-'contributions'       => 'польꙃєватєлꙗ добродѣꙗниꙗ',
+'contributions' => 'польꙃєватєлꙗ добродѣꙗниꙗ',
 'contributions-title' => 'польꙃєватєлꙗ ⁖ $1 ⁖ добродѣꙗниꙗ',
-'mycontris'           => 'моꙗ добродѣꙗниꙗ',
-'contribsub2'         => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
-'uctop'               => '(послѣдьнꙗ мѣна)',
+'mycontris' => 'моꙗ добродѣꙗниꙗ',
+'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
+'uctop' => '(послѣдьнꙗ мѣна)',
 
 'sp-contributions-blocklog' => 'ꙁаграждєниꙗ їсторїꙗ',
-'sp-contributions-deleted'  => 'поничьжєнꙑ добродѣꙗниꙗ',
-'sp-contributions-uploads'  => 'положєнꙑ дѣла',
-'sp-contributions-logs'     => 'їсторїѩ',
-'sp-contributions-talk'     => 'бєсѣда',
+'sp-contributions-deleted' => 'поничьжєнꙑ добродѣꙗниꙗ',
+'sp-contributions-uploads' => 'положєнꙑ дѣла',
+'sp-contributions-logs' => 'їсторїѩ',
+'sp-contributions-talk' => 'бєсѣда',
 'sp-contributions-username' => 'IP число или польꙃєватєлꙗ имѧ :',
-'sp-contributions-submit'   => 'ищи',
+'sp-contributions-submit' => 'ищи',
 
 # What links here
-'whatlinkshere'            => 'дос̑ьдєщьнѩ съвѧꙁи',
-'whatlinkshere-title'      => 'страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ',
-'whatlinkshere-page'       => 'страница :',
-'isredirect'               => 'прѣнаправлѥниѥ',
-'istemplate'               => 'внѫтри страницѧ',
-'isimage'                  => 'дѣла съвѧꙁь',
-'whatlinkshere-links'      => '← съвѧꙁи',
+'whatlinkshere' => 'дос̑ьдєщьнѩ съвѧꙁи',
+'whatlinkshere-title' => 'страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ',
+'whatlinkshere-page' => 'страница :',
+'isredirect' => 'прѣнаправлѥниѥ',
+'istemplate' => 'внѫтри страницѧ',
+'isimage' => 'дѣла съвѧꙁь',
+'whatlinkshere-links' => '← съвѧꙁи',
 'whatlinkshere-hideredirs' => '$1 прѣнаправлѥниꙗ',
-'whatlinkshere-hidelinks'  => '$1 съвѧꙁи',
+'whatlinkshere-hidelinks' => '$1 съвѧꙁи',
 
 # Block/unblock
-'blockip'            => 'ꙁагради польꙃєватєл҄ь',
+'blockip' => 'ꙁагради польꙃєватєл҄ь',
 'ipadressorusername' => 'IP число или польꙃєватєлꙗ имѧ :',
-'ipbreason'          => 'какъ съмꙑслъ :',
-'ipboptions'         => '2 часа:2 hours,1 дьнь:1 day,3 дьни:3 days,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
-'ipblocklist'        => 'ꙁаграждєнꙑ польꙃєватєлє',
-'blocklist-reason'   => 'какъ съмꙑслъ',
+'ipbreason' => 'какъ съмꙑслъ :',
+'ipboptions' => '2 часа:2 hours,1 дьнь:1 day,3 дьни:3 days,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
+'ipblocklist' => 'ꙁаграждєнꙑ польꙃєватєлє',
+'blocklist-reason' => 'какъ съмꙑслъ',
 'ipblocklist-submit' => 'исканиѥ',
-'infiniteblock'      => 'вѣчьно',
-'blocklink'          => 'ꙁагради',
-'contribslink'       => 'добродѣꙗниꙗ',
-'blocklogpage'       => 'ꙁаграждєниꙗ їсторїꙗ',
+'infiniteblock' => 'вѣчьно',
+'blocklink' => 'ꙁагради',
+'contribslink' => 'добродѣꙗниꙗ',
+'blocklogpage' => 'ꙁаграждєниꙗ їсторїꙗ',
 
 # Move page
-'move-page'               => 'прѣимєнованиѥ ⁖ $1 ⁖',
-'move-page-legend'        => 'страницѧ прѣимєнованиѥ',
-'movearticle'             => 'страница :',
-'newtitle'                => 'ново имѧ :',
-'move-watch'              => 'си страницѧ блюдєниѥ',
-'movepagebtn'             => 'прѣимєнованиѥ',
-'pagemovedsub'            => 'прѣимєнованиѥ сътворѥно ѥстъ',
-'movepage-moved'          => "'''⁖ $1 ⁖ нарєчєнъ ⁖ $2⁖ ѥстъ'''",
+'move-page' => 'прѣимєнованиѥ ⁖ $1 ⁖',
+'move-page-legend' => 'страницѧ прѣимєнованиѥ',
+'movearticle' => 'страница :',
+'newtitle' => 'ново имѧ :',
+'move-watch' => 'си страницѧ блюдєниѥ',
+'movepagebtn' => 'прѣимєнованиѥ',
+'pagemovedsub' => 'прѣимєнованиѥ сътворѥно ѥстъ',
+'movepage-moved' => "'''⁖ $1 ⁖ нарєчєнъ ⁖ $2⁖ ѥстъ'''",
 'movepage-moved-redirect' => 'прѣнаправлѥниѥ сътворѥно бѣ',
-'movedto'                 => 'прѣимєновано въ',
-'movetalk'                => 'си страницѧ бєсѣдꙑ прѣимєнованиѥ',
-'movelogpage'             => 'прѣимєнованиꙗ їсторїꙗ',
-'movereason'              => 'какъ съмꙑслъ :',
-'move-leave-redirect'     => 'прѣнаправлѥниꙗ сътворѥниѥ',
+'movedto' => 'прѣимєновано въ',
+'movetalk' => 'си страницѧ бєсѣдꙑ прѣимєнованиѥ',
+'movelogpage' => 'прѣимєнованиꙗ їсторїꙗ',
+'movereason' => 'какъ съмꙑслъ :',
+'move-leave-redirect' => 'прѣнаправлѥниꙗ сътворѥниѥ',
 
 # Namespace 8 related
-'allmessages'     => 'сѷстимьнꙑ напьсаниꙗ',
+'allmessages' => 'сѷстимьнꙑ напьсаниꙗ',
 'allmessagesname' => 'имѧ',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'            => 'твоꙗ польꙃєватєл҄ьска страница',
-'tooltip-pt-mytalk'              => 'твоꙗ бєсѣдꙑ страница',
-'tooltip-pt-preferences'         => 'твои строи',
-'tooltip-pt-mycontris'           => 'твоѩ добродѣꙗнии каталогъ',
-'tooltip-pt-logout'              => 'ис̾ходъ',
-'tooltip-ca-talk'                => 'си страницѧ бєсѣда',
-'tooltip-ca-viewsource'          => 'си страница ꙁабранєна ѥстъ ⁙
+'tooltip-pt-userpage' => 'твоꙗ польꙃєватєл҄ьска страница',
+'tooltip-pt-mytalk' => 'твоꙗ бєсѣдꙑ страница',
+'tooltip-pt-preferences' => 'твои строи',
+'tooltip-pt-mycontris' => 'твоѩ добродѣꙗнии каталогъ',
+'tooltip-pt-logout' => 'ис̾ходъ',
+'tooltip-ca-talk' => 'си страницѧ бєсѣда',
+'tooltip-ca-viewsource' => 'си страница ꙁабранєна ѥстъ ⁙
 ѥѩ источьнъ обраꙁъ видєти можєши',
-'tooltip-ca-protect'             => 'си страницѧ ꙁабранєниѥ',
-'tooltip-ca-delete'              => 'си страницѧ поничьжєниѥ',
-'tooltip-ca-move'                => 'си страницѧ прѣимєнованиѥ',
-'tooltip-ca-watch'               => 'си страницѧ блюдєниѥ',
-'tooltip-search'                 => 'ищи {{{grammar:genitive|{{SITENAME}}}}} страницѧ',
-'tooltip-p-logo'                 => 'главьна страница',
-'tooltip-n-mainpage'             => 'виждь главьноу страницѫ',
+'tooltip-ca-protect' => 'си страницѧ ꙁабранєниѥ',
+'tooltip-ca-delete' => 'си страницѧ поничьжєниѥ',
+'tooltip-ca-move' => 'си страницѧ прѣимєнованиѥ',
+'tooltip-ca-watch' => 'си страницѧ блюдєниѥ',
+'tooltip-search' => 'ищи {{{grammar:genitive|{{SITENAME}}}}} страницѧ',
+'tooltip-p-logo' => 'главьна страница',
+'tooltip-n-mainpage' => 'виждь главьноу страницѫ',
 'tooltip-n-mainpage-description' => 'виждь главьноу страницѫ',
-'tooltip-n-recentchanges'        => 'послѣдьн҄ь мѣнъ каталогъ',
-'tooltip-t-contributions'        => 'виждь польꙃєватєлꙗ добродѣꙗнии каталогъ',
-'tooltip-t-upload'               => 'положєниѥ дѣлъ',
-'tooltip-t-specialpages'         => 'вьсѣѩ нарочьнъ страницѧ каталогъ',
-'tooltip-t-print'                => 'сѥѩ страницѧ пєчатьнъ обраꙁъ',
-'tooltip-ca-nstab-special'       => 'си нарочьна страница ѥстъ · ѥѩжє иꙁмѣнꙗти нє можєши',
-'tooltip-watch'                  => 'си страницѧ блюдєниѥ',
+'tooltip-n-recentchanges' => 'послѣдьн҄ь мѣнъ каталогъ',
+'tooltip-t-contributions' => 'виждь польꙃєватєлꙗ добродѣꙗнии каталогъ',
+'tooltip-t-upload' => 'положєниѥ дѣлъ',
+'tooltip-t-specialpages' => 'вьсѣѩ нарочьнъ страницѧ каталогъ',
+'tooltip-t-print' => 'сѥѩ страницѧ пєчатьнъ обраꙁъ',
+'tooltip-ca-nstab-special' => 'си нарочьна страница ѥстъ · ѥѩжє иꙁмѣнꙗти нє можєши',
+'tooltip-watch' => 'си страницѧ блюдєниѥ',
+
+# Info page
+'pageinfo-header-watchlist' => 'блюдєниꙗ',
+'pageinfo-subjectpage' => 'страница',
+'pageinfo-talkpage' => 'бєсѣда',
 
 # Media information
 'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
-'svg-long-desc'  => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
+'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
 'show-big-image' => 'пльнъ вида обраꙁъ',
 
 # Special:NewFiles
@@ -741,7 +752,7 @@ $messages = array(
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'вьсꙗ',
 'namespacesall' => 'вьсꙗ',
-'monthsall'     => 'вьсѩ',
+'monthsall' => 'вьсѩ',
 
 'unit-pixel' => 'п҃ѯ',
 
@@ -755,13 +766,16 @@ $messages = array(
 'autosumm-new' => 'нова страница ⁖ $1 ⁖ сътворєна  ѥстъ',
 
 # Size units
-'size-bytes'     => '$1 Б҃',
+'size-bytes' => '$1 Б҃',
 'size-kilobytes' => '$1 Х҃Б',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|бєсѣда]])',
+
 # Special:Version
-'version'                  => 'MediaWiki обраꙁъ',
-'version-version'          => '(обраꙁъ $1)',
-'version-license'          => 'прощєниѥ',
+'version' => 'MediaWiki обраꙁъ',
+'version-version' => '(обраꙁъ $1)',
+'version-license' => 'прощєниѥ',
 'version-software-version' => 'обраꙁъ',
 
 # Special:FilePath
@@ -776,10 +790,16 @@ $messages = array(
 # Special:Tags
 'tags-edit' => 'исправи',
 
+# Database error messages
+'dberr-header' => 'Вики тєхнїчьнꙑ отѧжєниꙗ имѣтъ',
+
 # New logging system
-'logentry-delete-delete'        => '$1 поничьжихъ страницѫ ⁖ $3 ⁖',
-'logentry-move-move'            => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖',
+'logentry-delete-delete' => '$1 поничьжихъ страницѫ ⁖ $3 ⁖',
+'logentry-move-move' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖',
 'logentry-move-move-noredirect' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ бєꙁ прѣнаправлєниꙗ сътворѥниꙗ',
-'logentry-newusers-create'      => '$1 сътворихъ польꙃєватєльско мѣсто',
+'logentry-newusers-create' => '$1 сътворихъ польꙃєватєльско мѣсто',
+
+# API errors
+'api-error-unknownerror' => 'нєвѣдома блаꙁна : ⁖ $1 ⁖',
 
 );
index a8ecad3..68a8d1e 100644 (file)
@@ -187,6 +187,7 @@ $messages = array(
 'vector-view-edit' => 'Тӳрлет',
 'vector-view-history' => 'Кун-çул',
 'vector-view-view' => 'Вула',
+'vector-view-viewsource' => 'пуçламăш текста пăх',
 
 'errorpagetitle' => 'Йăнăш',
 'returnto' => '$1 страницăна таврăн.',
@@ -210,7 +211,7 @@ $messages = array(
 'deletethispage' => 'Хурат ăна',
 'undelete_short' => '$1 тӳрлетӳсене каялла тавăр',
 'protect' => 'хӳтĕле',
-'protect_change' => 'Ñ\85Ó³Ñ\82Ä\95лÄ\95ве Ñ\83лÄ\83Ñ\88Ñ\82аÑ\80',
+'protect_change' => 'улăштар',
 'protectthispage' => 'Хӳтĕле',
 'unprotect' => 'Хӳтĕлеве пăрахăçла',
 'unprotectthispage' => 'Хӳтĕлеве пăрахăçла',
@@ -587,6 +588,7 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'searchhelp-url' => 'Help:Пулăшу',
 'search-result-size' => '$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})',
 'showingresults' => 'Аяларах эсир <b>#$2</b> пуçласа кăтартнă <b>$1</b> йĕркене куратăр.',
+'showingresultsheader' => "{{PLURAL:$5|Результат '''$1'''  '''$3''' хушшинчен|Результатсем'''$1 - $2''' '''$3''' хушшинчен}}  '''$4''' валли",
 'powersearch' => 'Анлă шырав',
 'powersearch-legend' => 'Анлă шырав',
 
@@ -751,9 +753,13 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'file-anchor-link' => 'Файл',
 'filehist' => 'Файл историйĕ',
 'filehist-current' => 'хальхи',
+'filehist-datetime' => 'Дата/Вăхăт',
+'filehist-thumb' => 'Миниатюра',
+'filehist-thumbtext' => '$1 версийĕн миниатюра ӳкерчĕкĕ',
 'filehist-user' => 'Хутшăнакан',
+'filehist-dimensions' => 'Пысăкăш',
 'filehist-comment' => 'Асăрхав',
-'imagelinks' => 'Файл çине каçасем',
+'imagelinks' => 'Файла усă курни',
 'linkstoimage' => 'Çак страницăсем ку файл çине кăтартаççĕ:',
 'nolinkstoimage' => 'Ку файл çине кăтартакан страницăсем çук.',
 'uploadnewversion-linktext' => 'Ку файлăн çĕнĕ версине кĕрт',
@@ -963,6 +969,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'viewdeletedpage' => 'Кăларса пăрахнă страницăсене пăх',
 'undeleterevisions' => 'Архивра пурĕ $1 верси',
 'undeletebtn' => 'Каялла тавăр!',
+'undeleteviewlink' => 'пăх',
 'undeletereset' => 'Тасат',
 'undeletedrevisions' => '$1 кăларса пăрахнă тӳрлетӳсене каялла тавăрнă',
 'undelete-search-box' => 'Кăларса пăрахнă страницăсен хушшинчи шырав',
@@ -1066,12 +1073,14 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'import-logentry-upload' => '«[[$1]]» — файлтан импортла',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ð\9fолÑ\8cзоваÑ\82елÑ\8c страници',
-'tooltip-pt-mytalk' => 'Ð\9cан канашлу страници',
+'tooltip-pt-userpage' => 'СиÑ\80Ä\95н Ñ\85Ñ\83Ñ\82Ñ\88Ä\83накан страници',
+'tooltip-pt-mytalk' => 'СиÑ\80Ä\95н канашлу страници',
 'tooltip-pt-preferences' => 'Сирĕн ĕнерлевсем',
+'tooltip-pt-watchlist' => 'Эсир пăхакан страницисем',
+'tooltip-pt-logout' => 'Сайтран тух',
 'tooltip-ca-talk' => 'Статьяна сӳтсе явасси',
 'tooltip-ca-edit' => 'Эсир ку страницӑна тӳрлетме пултаратӑр. Тархасшӑн ҫырса хӑваричен страницӑ мӗнле пулассине пӑхӑр.',
-'tooltip-ca-addsection' => 'Кӗске ӑнлантару хушма пултаратӑр.',
+'tooltip-ca-addsection' => 'Çĕнĕ пай ту',
 'tooltip-ca-viewsource' => 'Ку страницӑна эсир улӑштарма пултараймастӑр. Ӑна мӗнле ҫырнине кӑна пӑхма пултаратӑр.',
 'tooltip-ca-protect' => 'Улӑшратусенчен сыхласси',
 'tooltip-ca-delete' => 'Страницӑна кӑларса пӑрахмалли',
@@ -1080,8 +1089,13 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'tooltip-ca-unwatch' => 'Ку страницӑ хыҫҫӑн урӑх сӑнамалла мар',
 'tooltip-search' => 'Шырав',
 'tooltip-p-logo' => 'Тӗп страницӑ',
+'tooltip-feed-atom' => 'Ку страницăн Atom куçару',
+'tooltip-ca-nstab-image' => 'Файлăн страници',
+'tooltip-ca-nstab-template' => 'Шаблонăн страници',
+'tooltip-ca-nstab-category' => 'Категори страницине уç',
 'tooltip-save' => 'Тӳрлетӳсене астуса хăвармалла',
 'tooltip-watch' => 'Çак страницăна пăхса тăмаллисем шутне хуш',
+'tooltip-summary' => 'Кĕскĕн ăнлантарса парăр',
 
 # Attribution
 'anonymous' => '{{GRAMMAR:genitive|{{SITENAME}}}} анонимлă хутшăнакансем',
@@ -1118,6 +1132,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'ilsubmit' => 'Шырамалла',
 'bydate' => 'дата тăрăх',
 
+# Metadata
+'metadata' => 'Метаданнăйсем:',
+
 # EXIF tags
 'exif-exifversion' => 'Exif версийĕ',
 'exif-flashpixversion' => 'Ĕçлеме пултаракан FlashPix версийĕ',
index 4926cdd..df4190e 100644 (file)
@@ -775,7 +775,8 @@ Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
 Cofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:user}}:Foo/vector.css yn hytrach na {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Diweddariad)',
 'note' => "'''Dalier sylw:'''",
-'previewnote' => "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto! [[#editform|→ Parhau i olygu]]",
+'previewnote' => "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto!",
+'continue-editing' => 'Parhau i olygu',
 'previewconflict' => "Mae'r rhagolwg hwn yn dangos y testun yn yr ardal golygu uchaf, fel ag y byddai'n ymddangos petaech yn rhoi'r dudalen ar gadw.",
 'session_fail_preview' => "'''Ymddiheurwn! Methwyd prosesu eich golygiad gan fod rhan o ddata'r sesiwn wedi'i golli. Ceisiwch eto.
 Os digwydd yr un peth eto, ceisiwch [[Special:UserLogout|allgofnodi]] ac yna mewngofnodi eto.'''",
@@ -869,6 +870,10 @@ Cafodd yr argiau hyn eu hepgor.",
 'parser-template-loop-warning' => 'Daethpwyd o hyd i ddolen yn y nodyn: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Wedi mynd dros ben y terfyn ar ddyfnder dychweliad nodiadau ($1)',
 'language-converter-depth-warning' => "Wedi mynd tu hwnt i'r terfyn dyfnder ($1) ar y cyfnewidydd iaith.",
+'node-count-exceeded-category' => 'Tudalennau lle mae nifer y nodau yn ormod',
+'node-count-exceeded-warning' => 'Mae nifer y nodau yn y dudalen yn ormod',
+'expansion-depth-exceeded-category' => "Tudalennau â dyfnder ehangu tu hwnt i'r terfyn",
+'expansion-depth-exceeded-warning' => "Mae dyfnder ehangu'r dudalen y tu hwnt i'r terfyn",
 
 # "Undo" feature
 'undo-success' => "Gellir dadwneud y golygiad. Byddwch gystal â gwirio'r gymhariaeth isod i sicrhau mai dyma sydd arnoch eisiau gwneud, ac yna rhowch y newidiadau ar gadw i gwblhau'r gwaith o ddadwneud y golygiad.",
@@ -1012,7 +1017,7 @@ Edrychwch ar y logiau er mwyn cael rhagor o wybodaeth.",
 # Suppression log
 'suppressionlog' => 'Lòg cuddio',
 'suppressionlogtext' => "Dyma restr y dileuon a'r blociau lle y cuddiwyd cynnwys rhag y gweinyddwyr.
-Gallwch weld rhestr y gwaharddiadau a'r blociau gweithredol ar y [[Special:BlockList|rhestr blociau IP]].",
+Gallwch weld rhestr y gwaharddiadau a'r blociau gweithredol ar y [[Special:BlockList|rhestr blociau]].",
 
 # History merging
 'mergehistory' => 'Cyfuno hanesion y tudalennau',
@@ -1945,6 +1950,11 @@ Sylwer bod llythrennau mawr neu fach o bwys i'r chwiliad.",
 'allpages-bad-ns' => 'Nid oes gan {{SITENAME}} barth o\'r enw "$1".',
 'allpages-hide-redirects' => 'Cuddio tudalennau ailgyfeirio',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Rydych yn edrych ar fersiwn o'r dudalen a roddwyd ar gadw mewn celc hyd at $1 yn ôl.",
+'cachedspecial-viewing-cached-ts' => "Rydych yn edrych ar fersiwn o'r dudalen a roddwyd ar gadw mewn celc. Gall fod yn wahanol i'r fersiwn cyfoes.",
+'cachedspecial-refresh-now' => 'Gweld y diwygiad diweddaraf.',
+
 # Special:Categories
 'categories' => 'Categorïau',
 'categoriespagetext' => "Mae'r {{PLURAL:$1|categori|categori|categorïau|categorïau|categorïau|categorïau}} isod yn cynnwys tudalennau neu ffeiliau amlgyfrwng.
@@ -2385,8 +2395,8 @@ Rhowch reswm dros rwystro'r defnyddiwr (er enghraifft, dywedwch pa dudalen(au) a
 'ipb-confirm' => "Cadarnhau'r rhwystr",
 'badipaddress' => 'Cyfeiriad IP annilys.',
 'blockipsuccesssub' => 'Llwyddodd y rhwystr',
-'blockipsuccesstext' => 'Mae cyfeiriad IP [[Special:Contributions/$1|$1]] wedi cael ei flocio.<br />
-Gwelwch y [[Special:BlockList|rhestr flociau IP]] er mwyn arolygu blociau.',
+'blockipsuccesstext' => 'Mae [[Special:Contributions/$1|$1]] wedi cael ei flocio.<br />
+Gweler y [[Special:BlockList|rhestr blociau]] er mwyn arolygu blociau.',
 'ipb-blockingself' => "Rydych ar rwystro'ch hunan! A ydych yn siŵr eich bod chi am wneud hyn?",
 'ipb-confirmhideuser' => 'Rydych ar rwystro defnyddiwr sydd yn "guddiedig." Bydd hyn yn atal enw\'r defnyddiwr ym mhob rhestr a chofnod lòg. A ydych yn siŵr eich bod chi am wneud hyn?',
 'ipb-edit-dropdown' => "Golygu'r rhesymau dros flocio",
@@ -2439,7 +2449,9 @@ Dyma'r lòg rhwystro perthnasol:",
 Dyma'r lòg cuddio perthnasol:",
 'blocklogentry' => 'wedi rhwystro "[[$1]]" sy\'n dod i\'w ben ar $2 $3',
 'reblock-logentry' => "wedi newid y gosodiadau rhwystro sydd ar [[$1]] sy'n dod i'w ben am $2 $3",
-'blocklogtext' => "Dyma lòg o'r holl weithredoedd rhwystro a dadrwystro. Nid yw'r cyfeiriadau IP sydd wedi cael ei rwystro'n awtomatig ar y rhestr. Gweler y [[Special:BlockList|rhestr rhwystrau IP]] am restr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o bryd.",
+'blocklogtext' => "Dyma lòg o'r holl weithredoedd rhwystro a dadrwystro. 
+Nid yw'r cyfeiriadau IP sydd wedi cael eu rhwystro'n awtomatig ar y rhestr. 
+Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o bryd ar y [[Special:BlockList|rhestr rhwystrau]].",
 'unblocklogentry' => 'wedi dadrwystro $1',
 'block-log-flags-anononly' => 'defnyddwyr anhysbys yn unig',
 'block-log-flags-nocreate' => 'analluogwyd creu cyfrif',
@@ -3492,6 +3504,9 @@ Dylech fod wedi derbyn [{{SERVER}}{{SCRIPTPATH}}/COPYING gopi o GNU General Publ
 'version-software' => 'Meddalwedd gosodedig',
 'version-software-product' => 'Cynnyrch',
 'version-software-version' => 'Fersiwn',
+'version-entrypoints' => 'URLs y mannau cyflwyno',
+'version-entrypoints-header-entrypoint' => 'Man cyflwyno',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Llwybr y ffeil',
@@ -3679,4 +3694,15 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'api-error-uploaddisabled' => 'Analluogwyd uwchlwytho ar y wici hwn.',
 'api-error-verification-error' => "Gallai'r ffeil hon fod wedi ei llygru, neu gall fod estyniad anghywir iddi.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|eiliad}}',
+'duration-minutes' => '$1 {{PLURAL:$1|munud|munud|funud|munud|munud|munud}}',
+'duration-hours' => '$1 {{PLURAL:$1|awr}}',
+'duration-days' => '$1 {{PLURAL:$1|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}}',
+'duration-weeks' => '$1 {{PLURAL:$1|wythnos}}',
+'duration-years' => '$1 {{PLURAL:$1|mlynedd|mlynedd|flynedd|mlynedd|mlynedd|mlynedd}}',
+'duration-decades' => '$1 {{PLURAL:$1|degawd|degawd|ddegawd|degawd|degawd|degawd}}',
+'duration-centuries' => '$1 {{PLURAL:$1|canmlwydd|ganmlwydd|ganmlwydd|canmlwydd|chanmlwydd|canmlwydd}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milflwydd|filflwydd|filflwydd|milflwydd|milflwydd|milflwydd}}',
+
 );
index a7cefa0..b330567 100644 (file)
@@ -571,7 +571,7 @@ $2',
 'titleprotected' => "Dette sidenavn er beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er ''$2''.",
 'filereadonlyerror' => 'Ude af stand til at redigere filen "$1", fordi fildatabasen "$2" er skrivebeskyttet.
 
-Begrundelsen er "\'\'$3\'\'".',
+Administratoren, som skrivebeskyttede den, gav følgende begrundelse: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Konfigurationsfejl: ukendt virus-scanner: ''$1''",
@@ -858,7 +858,8 @@ Loggen over den seneste blokering ses nedenfor:',
 'updated' => '(Opdateret)',
 'note' => "'''Bemærk:'''",
 'previewnote' => "'''Husk at dette er kun en forhåndsvisning.'''
-Dine ændringer er endnu ikke blevet gemt! [[#editform|→ Fortsæt med at redigere]]",
+Dine ændringer er endnu ikke blevet gemt!",
+'continue-editing' => 'Fortsæt med at redigere',
 'previewconflict' => 'Denne forhåndsvisning er resultatet af den redigérbare tekst ovenfor, sådan vil det komme til at se ud hvis du vælger at gemme teksten.',
 'session_fail_preview' => "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.
 Prøv venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
@@ -1086,7 +1087,7 @@ Se venligst loglisterne.',
 # Suppression log
 'suppressionlog' => 'Skjulningslog',
 'suppressionlogtext' => 'Nedenfor listes de sletninger og blokeringer, som involverer indhold, der er skjult for administratorer.
-Se [[Special:BlockList|IP-blokeringslisten]] for listen over alle aktuelle blokeringer.',
+Se [[Special:BlockList|blokeringslisten]] for listen over alle aktuelle blokeringer.',
 
 # History merging
 'mergehistory' => 'Sammenflet sidehistorikker',
@@ -2006,6 +2007,11 @@ Du kan afgrænse visningen ved at vælge en logtype, brugernavn eller påvirket
 'allpages-bad-ns' => 'Navnerummet $1 findes ikke på {{SITENAME}}.',
 'allpages-hide-redirects' => 'Skjul omdirigeringer',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du ser en hengemt version af denne side, som kan være op til $1 gammel.',
+'cachedspecial-viewing-cached-ts' => 'Du ser en hengemt version af denne side, som måske ikke er helt aktuel.',
+'cachedspecial-refresh-now' => 'Vis seneste.',
+
 # Special:Categories
 'categories' => 'Kategorier',
 'categoriespagetext' => 'Følgende {{PLURAL:$1|kategori|kategorier}} indeholder sider eller media.
@@ -2440,7 +2446,7 @@ Angiv en konkret begrundelse herunder (for eksempel med angivelse af sider der h
 'badipaddress' => 'IP-adressen/brugernavnet er udformet forkert eller eksistere ikke.',
 'blockipsuccesssub' => 'Blokeringen er gennemført.',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] er blevet blokeret.<br />
-Se [[Special:BlockList|IP-blokeringslisten]] for alle blokeringer.',
+Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.',
 'ipb-blockingself' => 'Du er ved at blokere dig selv! Er du sikker på, du vil gøre det?',
 'ipb-confirmhideuser' => 'Du er ved at blokere en bruger med "skjul bruger" aktiveret. Dette vil skjule brugerens navn på alle lister og logposter. Er du sikker på du vil gøre det?',
 'ipb-edit-dropdown' => 'Ændre spærreårsager',
@@ -2493,7 +2499,9 @@ Blokeringsloggen vises nedenfor som reference:',
 Skjulningsloggen vises nedenfor som reference:',
 'blocklogentry' => 'blokerede [[$1]] med en varighed på $2 $3',
 'reblock-logentry' => 'ændrede blokeringsindstillinger for [[$1]] med en varighed $2 $3',
-'blocklogtext' => 'Dette er en liste med blokerede brugere og ophævede blokeringer af brugere. Automatisk blokerede IP-adresser er ikke anført her. Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med blokerede brugere.',
+'blocklogtext' => 'Dette er en liste med blokerede brugere og ophævede blokeringer af brugere.
+Automatisk blokerede IP-adresser er ikke anført her.
+Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle blokeringer.',
 'unblocklogentry' => 'ophævede blokering af "$1"',
 'block-log-flags-anononly' => 'kun anonyme',
 'block-log-flags-nocreate' => 'Oprettelse af brugerkonti blokeret',
@@ -3729,4 +3737,15 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 'api-error-uploaddisabled' => 'Oplægning af filer er slået fra på denne wiki.',
 'api-error-verification-error' => 'Denne fil kan være beskadiget, eller den har måske en forkert filendelse.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minutter}}',
+'duration-hours' => '$1 {{PLURAL:$1|time|timer}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dage}}',
+'duration-weeks' => '$1 {{PLURAL:$1|uge|uger}}',
+'duration-years' => '$1 {{PLURAL:$1|år|år}}',
+'duration-decades' => '$1 {{PLURAL:$1|årti|årtier}}',
+'duration-centuries' => '$1 {{PLURAL:$1|århundrede|århundreder}}',
+'duration-millennia' => '$1 {{PLURAL:$1|årtusind|årtusinder}}',
+
 );
index c7513ce..672ce83 100644 (file)
@@ -768,6 +768,8 @@ Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''„$2“'' eingerich
 'filereadonlyerror' => 'Die Datei „$1“ kann nicht verändert werden, da auf das Dateirepositorium „$2“ nur Lesezugriff möglich ist.
 
 Der Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3“.',
+'invalidtitle-knownnamespace' => 'Ungültiger Titel mit Namensraum „$2“ und Text „$3“',
+'invalidtitle-unknownnamespace' => 'Ungültiger Titel mit unbekannter Namensraumnummer $1 und Text „$2“',
 
 # Virus scanner
 'virus-badscanner' => "Fehlerhafte Konfiguration: unbekannter Virenscanner: ''$1''",
@@ -1048,7 +1050,8 @@ Zur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:',
 'updated' => '(Geändert)',
 'note' => "'''Hinweis:'''",
 'previewnote' => "'''Dies ist nur eine Vorschau.'''
-Die Seite wurde noch nicht gespeichert! [[#editform|→ Weiter bearbeiten]]",
+Die Seite wurde noch nicht gespeichert!",
+'continue-editing' => 'Weiter bearbeiten',
 'previewconflict' => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn du jetzt speicherst.',
 'session_fail_preview' => "'''Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.
 Bitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.
@@ -1063,7 +1066,7 @@ Sollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und da
 Eine Speicherung kann den Seiteninhalt zerstören. Dies geschieht bisweilen durch die Benutzung eines anonymen Proxy-Dienstes, der fehlerhaft arbeitet.'''",
 'edit_form_incomplete' => "'''Der Inhalt des Bearbeitungsformulars hat den Server nicht vollständig erreicht. Bitte prüfe deine Bearbeitungen auf Vollständigkeit und versuche es erneut.'''",
 'editing' => 'Bearbeiten von „$1“',
-'creating' => '$1 wird erstellt',
+'creating' => 'Erstellen von „$1“',
 'editingsection' => 'Bearbeiten von „$1“ (Abschnitt)',
 'editingcomment' => 'Bearbeiten von „$1“ (Neuer Abschnitt)',
 'editconflict' => 'Bearbeitungskonflikt: $1',
@@ -1140,6 +1143,10 @@ Sie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|is
 'parser-template-loop-warning' => 'Vorlagenschleife entdeckt: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Vorlagenrekursionstiefengrenze überschritten ($1)',
 'language-converter-depth-warning' => 'Sprachkonvertertiefenlimit überschritten ($1)',
+'node-count-exceeded-category' => 'Seiten, die die Knotenanzahl überschritten haben',
+'node-count-exceeded-warning' => 'Die Seite hat die Knotenpunktanzahl überschritten.',
+'expansion-depth-exceeded-category' => 'Seiten, die die Expansionstiefe überschritten haben',
+'expansion-depth-exceeded-warning' => 'Die Seite hat die Expansionstiefe überschritten.',
 
 # "Undo" feature
 'undo-success' => 'Die Bearbeitung kann rückgängig gemacht werden.
@@ -1173,7 +1180,7 @@ Grund der Sperre: ''$2''",
 * ({{int:cur}}) = Unterschied zur aktuellen Version, ({{int:last}}) = Unterschied zur vorherigen Version
 * Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, {{int:minoreditletter}} = Kleine Änderung',
 'history-fieldset-title' => 'In der Versionsgeschichte suchen',
-'history-show-deleted' => 'nur gelöschte Versionen',
+'history-show-deleted' => 'Nur gelöschte Versionen zeigen',
 'histfirst' => 'Älteste',
 'histlast' => 'Neueste',
 'historysize' => '({{PLURAL:$1|1 Byte|$1 Bytes}})',
@@ -1409,7 +1416,7 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
 'datedefault' => 'Standard',
 'prefs-beta' => 'Beta-Funktionen',
 'prefs-datetime' => 'Datum und Zeit',
-'prefs-labs' => 'Alpha-Funktionen (experimentell)',
+'prefs-labs' => 'Alpha-Funktionen',
 'prefs-personal' => 'Benutzerdaten',
 'prefs-rc' => 'Letzte Änderungen',
 'prefs-watchlist' => 'Beobachtungsliste',
@@ -1900,8 +1907,8 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
 'lockmanager-fail-openlock' => 'Die Sperrdatei für „$1“ konnte nicht geöffnet werden.',
 'lockmanager-fail-releaselock' => 'Die Sperre für „$1“ konnte nicht freigegeben werden.',
 'lockmanager-fail-db-bucket' => 'Es konnte mit Sammelabruf $1 keine ausreichende Anzahl an Verbindungen zu Sperrdatenbanken hergestellt werden.',
-'lockmanager-fail-db-release' => 'Die Sperren auf Datenbank $1 konnte nicht freigegeben werden.',
-'lockmanager-fail-svr-release' => 'Die Sperren auf Server $1 konnte nicht freigegeben werden.',
+'lockmanager-fail-db-release' => 'Die Sperren auf Datenbank $1 konnten nicht freigegeben werden.',
+'lockmanager-fail-svr-release' => 'Die Sperren auf Server $1 konnten nicht freigegeben werden.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Es ist ein Fehler beim Öffnen der Datei zur ZIP-Überprüfung aufgetreten.',
@@ -1949,6 +1956,7 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
 'http-curl-error' => 'Fehler beim Abruf der URL: $1',
 'http-host-unreachable' => 'URL konnte nicht erreicht werden.',
 'http-bad-status' => 'Während der HTTP-Anfrage ist ein Fehler aufgetreten: $1 $2',
+'http-truncated-body' => 'Der Inhalt der Anforderung wurde nicht vollständig empfangen.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL ist nicht erreichbar',
@@ -2224,6 +2232,11 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
 'allpages-bad-ns' => 'Der Namensraum „$1“ ist in {{SITENAME}} nicht vorhanden.',
 'allpages-hide-redirects' => 'Weiterleitungen ausblenden',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du siehst die gecachte Version dieser Seite, die bis zu $1 alt sein kann.',
+'cachedspecial-viewing-cached-ts' => 'Du siehst die gecachte Version dieser Seite, die möglicherweise nicht aktuell ist.',
+'cachedspecial-refresh-now' => 'Aktuelle Version ansehen.',
+
 # Special:Categories
 'categories' => 'Kategorien',
 'categoriespagetext' => 'Folgende {{PLURAL:$1|Kategorie enthält|Kategorien enthalten}} Seiten oder Dateien.
@@ -2649,7 +2662,7 @@ Bitte gib den Grund für die Sperre an.',
 'ipb-confirm' => 'Sperrung bestätigen',
 'badipaddress' => 'Die IP-Adresse hat ein falsches Format.',
 'blockipsuccesssub' => 'Sperre erfolgreich',
-'blockipsuccesstext' => 'Der Benutzer/die IP-Adresse [[Special:Contributions/$1|$1]] wurde gesperrt.<br />
+'blockipsuccesstext' => 'Der Benutzer / die IP-Adresse [[Special:Contributions/$1|$1]] wurde gesperrt.<br />
 Zur Aufhebung der Sperre siehe die [[Special:BlockList|Liste aller aktiven Sperren]].',
 'ipb-blockingself' => 'Du bist gerade dabei, dich selbst zu sperren! Möchtest du das wirklich tun?',
 'ipb-confirmhideuser' => 'Du bist gerade dabei einen Benutzer im Modus „Benutzer verstecken“ zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchtest du das wirklich tun?',
@@ -3819,6 +3832,11 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'version-software' => 'Installierte Software',
 'version-software-product' => 'Software',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'Eingangspunkt-URLs',
+'version-entrypoints-header-entrypoint' => 'Eingangspunkt',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikelpfad]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skriptpfad]',
 
 # Special:FilePath
 'filepath' => 'Dateipfad',
@@ -4006,4 +4024,15 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 'api-error-uploaddisabled' => 'Das Hochladen ist in diesem Wiki deaktiviert.',
 'api-error-verification-error' => 'Die hochzuladende Datei ist entweder fehlerhaft oder hat keine Dateinamenserweiterung.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Sekunde|Sekunden}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Minute|Minuten}}',
+'duration-hours' => '$1 {{PLURAL:$1|Stunde|Stunden}}',
+'duration-days' => '$1 {{PLURAL:$1|Tag|Tage}}',
+'duration-weeks' => '$1 {{PLURAL:$1|Woche|Wochen}}',
+'duration-years' => '$1 {{PLURAL:$1|Jahr|Jahre}}',
+'duration-decades' => '$1 {{PLURAL:$1|Jahrzehnt|Jahrzehnte}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Jahrhundert|Jahrhunderte}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Jahrtausend|Jahrtausende}}',
+
 );
index dfab851..6d51334 100644 (file)
@@ -167,7 +167,7 @@ $messages = array(
 'qbpageoptions' => 'Ena pele',
 'qbpageinfo' => 'Gıre',
 'qbmyoptions' => 'Pelê mı',
-'qbspecialpages' => 'Pelê Mêniye',
+'qbspecialpages' => 'Peley xısusi',
 'faq' => 'PZP (Persê ke zehf persiyenê)',
 'faqpage' => 'Project: PZP',
 
@@ -200,7 +200,7 @@ $messages = array(
 'history_short' => 'Tarix',
 'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
 'printableversion' => 'Asayışê çapkerdışi',
-'permalink' => 'Gıreyo jûqere',
+'permalink' => 'Gıreyo daimi',
 'print' => 'Çap ke',
 'view' => 'Bıvêne',
 'edit' => 'Bıvurne',
@@ -219,7 +219,7 @@ $messages = array(
 'newpage' => 'Pela newiye',
 'talkpage' => 'Ena pele sero werêne',
 'talkpagelinktext' => 'Werênayış',
-'specialpage' => 'Pela xase',
+'specialpage' => 'Pela xısusi',
 'personaltools' => 'Hacetê şexsi',
 'postcomment' => 'Qısımo newe',
 'articlepage' => 'Pela zerreki bıvêne',
@@ -299,7 +299,7 @@ $1',
 'showtoc' => 'bımocne',
 'hidetoc' => 'bınımne',
 'collapsible-collapse' => 'Kılmever ke',
-'collapsible-expand' => 'Hera',
+'collapsible-expand' => 'Hera ke',
 'thisisdeleted' => 'Bıvêne ya zi $1 peyser bia?',
 'viewdeleted' => '$1 bıvêne?',
 'restorelink' => '{{PLURAL:$1|yew vurnayışo esterıte|$1 vurnayışê esterıtey}}',
@@ -319,7 +319,7 @@ $1',
 'nstab-main' => 'Pele',
 'nstab-user' => 'Pela Karberi',
 'nstab-media' => 'Pela Medya',
-'nstab-special' => 'Pela xase',
+'nstab-special' => 'Pela xısusi',
 'nstab-project' => 'Pela Procey',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Mesac',
@@ -383,7 +383,7 @@ Belka yewna ten kerdo hewn a.',
 'badtitletext' => 'Sernamey pela ke şıma waşt, nêvêrd, thalo/vengo ya ki zıwano miyanêno ğelet gırêdae ya ki sernamey wiki.
 Beno ke, tede yew ya zi zêdê işareti estê ke sernaman de nêxebetiyenê.',
 'perfcached' => 'Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de',
-'perfcachedts' => 'Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticeycı}} debyayo de',
+'perfcachedts' => 'Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de',
 'querypage-no-updates' => 'Nıka newe kerdış nêbeno. no datayi ca de newe nêbeni .',
 'wrong_wfQuery_params' => 'wfQuery() parametreyo şaş<br />
 Fonksiyon: $1<br />
@@ -396,12 +396,14 @@ Perse: $2',
 'protectedpagetext' => 'No pel qey nêvuriyayiş hao (nao) pawyeno.',
 'viewsourcetext' => 'To şikinay çımey na pele bıvêne u kopya kerê:',
 'protectedinterface' => 'No pel qey software nuştey hezır keno u ın semed ra şuxulyayişê no pel qedexe biyo.',
-'editinginterface' => "'''DİQET:''' Şıma pelê software vurneni.[//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net] bıxebıtne, proceyê MediaWiki bigere diqet.",
+'editinginterface' => "'''Teme:''' Şıma hao jû pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.
+Vurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.
+Seba çarnayışi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
 'sqlhidden' => '(SQL pers kerdışê nımıte)',
 'cascadeprotected' => 'No pel de vurnayiş qedexe biyo, çunke şıma tuşa "kademeyın" aqtif kerdo u no {{PLURAL:$1|pelo|pelo}} pawıteyo de xebıtyeno:
 $2',
 'namespaceprotected' => "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
-'ns-specialprotected' => 'Pelê mêniye nênê vurnayış.',
+'ns-specialprotected' => 'Peley xısusi nênê vurnayış.',
 'titleprotected' => 'Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.
 Sebeb: "\'\'$2\'\'".',
 
@@ -431,7 +433,7 @@ Hesabê şıma biyo a.
 'userlogin' => 'Cı kewe / hesab vıraze',
 'userloginnocreate' => 'Cı kewe',
 'logout' => 'Cı ra veciye',
-'userlogout' => 'Veciye',
+'userlogout' => 'Vıcyayış',
 'notloggedin' => 'Hesab akerde niyo',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
@@ -526,6 +528,18 @@ Bıne vındere u newe ra dest pê bıkere.',
 'passwordreset-capture' => 'neticey e-postay bımocne?',
 'passwordreset-email' => 'Adresa e-postey:',
 'passwordreset-emailtitle' => 'Hesab timarê {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:
+
+$2
+
+{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.
+Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.',
+'passwordreset-emailtext-user' => '$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:
+
+$2
+
+{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.
+Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.',
 'passwordreset-emailelement' => 'Namey karberi: $1
 Parola vêrdiye: $2',
 
@@ -558,9 +572,9 @@ Parola vêrdiye: $2',
 'hr_tip' => 'Çızgiy Horizantoli (use sparingly)',
 
 # Edit pages
-'summary' => 'Mênine:',
+'summary' => 'Xulasa:',
 'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Eno yew vurnayışo qıckeko',
+'minoredit' => 'Vurnayışo qıckeko',
 'watchthis' => 'Ena pele seyr ke',
 'savearticle' => 'Ena pele qeyd ke',
 'preview' => 'Verqayt',
@@ -634,7 +648,9 @@ Kerem ke, tı ke wazenay na pele bafernê/bıvurnê, qontrol ke.',
 'userpage-userdoesnotexist-view' => 'Hesabê karberi "$1" qeyd nêbiyo.',
 'blocked-notice-logextract' => 'No karber/na karbere emanet blokekerdeyo/blokekediya.
 Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
-'clearyourcache' => "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo: '''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi ''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');, '''IE:''' ''Ctrl-F5'', '''Konqueror:''' tena tuşê pelaya newi ra bar kere cı sernê.",
+'clearyourcache' => "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo.
+*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi ''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,
+*'''IE:''' ''Ctrl-F5'', '''Konqueror:''' tena tuşê pelaya newi ra bar kere cı sernê.",
 'usercssyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
 'userjsyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
 'usercsspreview' => "'''şıma tena verqaydê dosyayê CSS vineni.''' '''Dosyayê Karberi CSS hema qayd nebiyo!'''",
@@ -644,7 +660,7 @@ Dosyanê be namey .css u .js'i de herfa werdiye bıgurêne, mesela herında {{ns
 'updated' => '(Biyo rocane)',
 'note' => "'''Not:'''",
 'previewnote' => "Teme! ena teyna verqeyda.'''
-Vurnayışê tu hama qeyd nıbiyo![[#editform|→ timar kerdışi rê dewam ke]]",
+Vurnayışê tu hama qeyd nıbiyo!",
 'previewconflict' => 'No seyrkerdışê verqaydi serê qutiyê nuşte tezim kerdış de yo, eke şıma qayile vurnayişê maddeyi seyino bıvini, no mocneno şıma.',
 'session_fail_preview' => 'Ma ef kere. Vindibiyayişê tayê datay ra a kerdışê hesabê şıma de ma vurnayişê şıma qayd nêkerd. Newe ra tesel (cereb) bıkere. Eke no qayde zi nêbo, [[Special:UserLogout|hesabê xo bıqefelne]] u newera a kere.',
 'session_fail_preview_html' => "'''Ma meluli! Sebayê vindbiyayişê datasistemi ma vurnayişê şıma nêeşkeni qaydker.'''
@@ -655,8 +671,8 @@ Vurnayışê tu hama qeyd nıbiyo![[#editform|→ timar kerdışi rê dewam ke]]
 'token_suffix_mismatch' => "'''Vurnayişê şıma tepeya ameyo çunke qutiyê imla xerıbya.
 Vurnayişê şıma qey nêxerepyayişê peli tepeya geyra a.
 Eke şıma servisê proksi yo anonim şuxulneni sebebê ey noyo.'''",
-'editing' => 'Şımayê kenê "$1" bıvurnê',
-'creating' => "Şımaye kene $1'i vıraze",
+'editing' => 'Pela "$1"\'i bıvurnê',
+'creating' => "Pela $1'i vıraze",
 'editingsection' => '$1 vurneno (qısım)',
 'editingcomment' => '$1 vuryeno (qısmo newe)',
 'editconflict' => 'Vurnayişê ke yewbini nêtepışeni: $1',
@@ -675,8 +691,7 @@ Tı ma ri soz dano ki tı nuşte xo oricinali nuşt, ya zi tı yew dokumantê um
 '''İTİYA DI METARİYALÊ \"COPYRIGHT\"İ NINUSİ!.'''",
 'copyrightwarning2' => 'Ney bızane ke nuşteyê ke şıma ruşneni (şaweni) keyepelê {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niye kes bıvurno, nuşetyanê xo meerze ita. <br />
 Wexta ke şıma nuşte zi erzeni ita; şıma gani taahhud bıde koti ra ardo (qey teferruati referans: $1).',
-'longpageerror' => "'''Xeta: Dergeya nuşte dê şıma nezdi $1 kilobayta, u $2 kilobayt ra vêşiyo.
-Qeyd biyayişê cı nêbeno'''",
+'longpageerror' => "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
 'readonlywarning' => "'''DİQET: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''
 
 Serkar o ke kılit kerdo; no beyanat dayo: $1",
@@ -716,6 +731,7 @@ Hewna kerde aseno.',
 'edit-no-change' => 'Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.',
 'edit-already-exists' => 'Pelo newe nêvıraziyeno.
 Pel ca ra esto.',
+'defaultmessagetext' => 'Normal metnê nuşti',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Hişyari: No pel de fonksiyoni zaf esti.
@@ -752,7 +768,7 @@ Sebebo ke terefê $3 ra diyao ''$2''",
 'revision-info' => 'Teshihkerdışê roca $1ine be terefê $2',
 'previousrevision' => '← Çımraviyarnayışo kıhanêr',
 'nextrevision' => 'Tekrar-diyayışo newêr →',
-'currentrevisionlink' => 'Revizyono peni',
+'currentrevisionlink' => 'Revizyono veror',
 'cur' => 'ferq',
 'next' => 'badên',
 'last' => 'pey',
@@ -1091,7 +1107,7 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena.',
 'prefs-help-email-required' => 'E-mail adrese mecburiya.',
 'prefs-info' => 'Enformasyonê temelî',
-'prefs-i18n' => 'Beynelbinel kerdişî',
+'prefs-i18n' => 'Şaryayış kerdış',
 'prefs-signature' => 'İmza',
 'prefs-dateformat' => 'Formatê tarixi',
 'prefs-timeoffset' => 'Wext offset',
@@ -1105,6 +1121,10 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
 'prefs-diffs' => 'Diffs',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'e-posta adresi raştayo',
+'email-address-validity-invalid' => 'e-postayo raştay defiye de',
+
 # User rights
 'userrights' => 'İdarey heqanê karberan',
 'userrights-lookup-user' => 'Grubanê karberi/karbere idare bıke',
@@ -1251,6 +1271,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-userrights' => 'heqqa karberanê hemî bivurne',
 'action-userrights-interwiki' => 'heqqa karberanê ke wikiyê binî de hemî bivurne',
 'action-siteadmin' => 'database kilit bike ya zi a bike',
+'action-sendemail' => 'e-posta bırşe',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|vurnayış|vurnayışan}}',
@@ -1422,6 +1443,10 @@ Eke problem dewam kerd [[Special:ListUsers/sysop|serkari]] de irtibat kewe.',
 'upload-http-error' => 'Yew ğeletê HTTPî biyo: $1',
 
 # File backend
+'backend-fail-stream' => '$1 nê vırazeyê',
+'backend-fail-backup' => '$1 nê wendeyê',
+'backend-fail-notexists' => '$1 name dı dosya çına.',
+'backend-fail-delete' => '$1 nê besterneyê',
 'backend-fail-store' => '$1 ra $2 berdışo nê wanêno',
 'backend-fail-copy' => '$1 ra $2 kopya kerdışena dosyayo nêbeno',
 'backend-fail-move' => '$1 ra $2 berdışo nê wanêno',
@@ -1507,7 +1532,7 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'filehist-comment' => 'Rexne',
 'filehist-missing' => 'Dosya nieseno',
 'imagelinks' => 'Gurenayışê dosya',
-'linkstoimage' => 'Ena {{PLURAL:$1|pelge şın|$1 pelgayan şın}} ena dosya:',
+'linkstoimage' => 'Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:',
 'linkstoimage-more' => '$1 ra ziyed {{PLURAL:$1|pel|pel}} re gırey dano.
 listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocnena.
 [[Special:WhatLinksHere/$2|pêroyê liste]] mevcud o.',
@@ -1607,6 +1632,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 <del>serê ey nuşteyi</del> safi biye.',
 'double-redirect-fixed-move' => '[[$1]] kırışiya, hıni ray dana [[$2]] no pel',
+'double-redirect-fixed-maintenance' => 'raçarnayışo dıletê [[$1]] ra  pela da [[$2]] timarêno',
 'double-redirect-fixer' => 'Fixerî redirek bike',
 
 'brokenredirects' => 'Redireksiyonî ke hin nixebitiyeno',
@@ -1628,6 +1654,8 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
 'nrevisions' => '$1 {{PLURAL:$1|revizyon|revizyonî}}',
 'nviews' => '$1 {{PLURAL:$1|vînayîş|vînayîşî}}',
+'nimagelinks' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
+'ntransclusions' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
 'specialpage-empty' => 'Ser ena report netice çini yo.',
 'lonelypages' => 'Pelî ke yetim mend',
 'lonelypagestext' => 'Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.',
@@ -1645,7 +1673,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'wantedtemplates' => 'Templateyî ke ganî estî bî.',
 'mostlinked' => 'Pelî ke tewr zafî lînk bîy.',
 'mostlinkedcategories' => 'Kategorî ke tewr zafî lînk bîy.',
-'mostlinkedtemplates' => 'Templateyî ke tewr zafî lînk bîy.',
+'mostlinkedtemplates' => 'Şablonê ke tewr zafî pela re gıre bîye.',
 'mostcategories' => 'Pelan ke tewr zaf kategorî estê.',
 'mostimages' => 'Dosyayan ke tewr zaf link estê.',
 'mostrevisions' => 'Pelan ke tewr zaf revizyonî biyê.',
@@ -1703,7 +1731,7 @@ tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyn
 # Special:AllPages
 'allpages' => 'Pelan hemi',
 'alphaindexline' => '$1 ra $2ine',
-'nextpage' => 'Pela peyêne ($1)',
+'nextpage' => 'Pela badê cû ($1)',
 'prevpage' => 'Pela verêne ($1)',
 'allpagesfrom' => 'Pelanê ke be ena herfe dest pêkenê bımocne',
 'allpagesto' => 'Pelanê ke be ena herfe qediyenê bımocne:',
@@ -1841,7 +1869,7 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
 'watchmethod-list' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
 'watchlistcontains' => 'listeya seyrkerdışê şıma de $1 tene {{PLURAL:$1|peli|peli}} estî.',
 'iteminvalidname' => "pê no '$1' unsuri problem bı, nameyo nemeqbul...",
-'wlnote' => "Bıni dı {{PLURAL:$1|vurnayış|peyniya '''$1'''  dı vurnayışi estê}} {{PLURAL:$2|roci|'''$2''' roci}}, hetani $5, $4 esênê.",
+'wlnote' => "$3 seate u bahde $4 deqa dıma {{PLURAL:$2|ju seate dı|'''$2''' ju seate dı}} {{PLURAL:$1|vurnayışe peyeni|vurnayışe '''$1''' peyeni}} cêrdeyê",
 'wlshowlast' => 'bımoc $1 seat $2 rocan $3',
 'watchlist-options' => 'Tercihanê listey seyrkerdışi',
 
@@ -1947,7 +1975,7 @@ kerem kerê "tepiya" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar
 Qey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê êna .',
 'protectedarticle' => '"[[$1]]" kılit biyo',
 'modifiedarticleprotection' => 'Qe "[[$1]]", seviye kılit kerdişi vurnayi biyo',
-'unprotectedarticle' => 'pawıtış weradiya/wedariya: "[[$1]]"',
+'unprotectedarticle' => 'Starkerdışê "[[$1]]" hewadeya',
 'movedarticleprotection' => 'eyarê pawıtışi no "[[$2]]" peli ra kırışiya no "[[$1]]" peli',
 'protect-title' => 'qey "$1" yew seviyaya pawıtışi bıvıcinê',
 'prot_1movedto2' => 'nameyê [[$1]] peli yo newe: [[$2]]',
@@ -2013,7 +2041,7 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 'undeletepagetext' => '{{PLURAL:$1|pelo|$1 pelo}} cerın hewn a şiyo labele hema zi arşiv de yo u tepiya geriyeno.
 Arşiv daimi pak beno.',
 'undelete-fieldset-title' => 'revizyonan tepiya bar ker',
-'undeleteextrahelp' => "qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê.",
+'undeleteextrahelp' => "Qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê '''''{{int:undeletebtn}}'''''.. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê '''''{{int:undeletebtn}}'''''..",
 'undeleterevisions' => '$1 {{PLURAL:$1|revizyon|revizyon}} arşiw bi',
 'undeletehistory' => 'eke şıma pel tepiya biyari heme revizyonî zi tepiya yeni.
 eke yew pel hewn a biyo u pê nameyê o peli newe ra yew pel bıvıraziyo, revizyonê o pelê verıni zerreyê no pel de aseno.',
@@ -2023,10 +2051,10 @@ eke yew pel hewn a biyo u pê nameyê o peli newe ra yew pel bıvıraziyo, reviz
 'undeleterevision-missing' => 'revizyonê nemeqbul u vindbiyayeyi.
 Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi şaş o.',
 'undelete-nodiff' => 'revizyonê verıni nidiya',
-'undeletebtn' => 'Restore bike',
+'undeletebtn' => 'Timar bike',
 'undeletelink' => 'bıvêne/peyser bia',
 'undeleteviewlink' => 'ra mocın',
-'undeletereset' => 'Sifir bike',
+'undeletereset' => 'Reset kerê',
 'undeleteinvert' => 'vicnayeyi qeldaye açarn',
 'undeletecomment' => 'Sebeb:',
 'undeletedrevisions' => 'pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.',
@@ -2037,6 +2065,7 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
 
 qey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].",
 'undelete-header' => 'qey vinayişê peli yê ke cıwa ver hewn a biyê: [[Special:Log/delete|qeydê hewn a kerdışi]].',
+'undelete-search-title' => 'Bıgeyre pelanê eserıtiyan',
 'undelete-search-box' => 'bıgêr pelê hewn a biyayeyani',
 'undelete-search-prefix' => 'pel ê ke pê ney destpêkenî, ramocın',
 'undelete-search-submit' => 'bigêre',
@@ -2059,7 +2088,7 @@ $1',
 'blanknamespace' => '(Ser)',
 
 # Contributions
-'contributions' => 'İştiraqê karberi',
+'contributions' => 'İştirakê karberi',
 'contributions-title' => '$1 de iştırakê karberi',
 'mycontris' => 'İştırakê mı',
 'contribsub2' => 'Semedê $1 ($2)',
@@ -2088,19 +2117,19 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 
 # What links here
 'whatlinkshere' => 'Çı tiyay rê gırê beno',
-'whatlinkshere-title' => 'Peleyan gre biya "$1"',
+'whatlinkshere-title' => 'Peleye ke  "$1" re gre biyê',
 'whatlinkshere-page' => 'Pele:',
 'linkshere' => "Ena peleyan grey biya '''[[:$1]]''':",
 'nolinkshere' => "Yew pel zi '''[[:$1]]''' rê link nibeno.",
 'nolinkshere-ns' => "Ena cayê nameyî de yew pel zi '''[[:$1]]''' rê link nibeno.",
 'isredirect' => 'pele redireksiyon',
-'istemplate' => 'transklusyon',
+'istemplate' => 'Çarnayışin',
 'isimage' => 'gıreyê dosya',
-'whatlinkshere-prev' => '{{PLURAL:$1|peni|peni $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|veror|veror $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|verni|verni $1}}',
 'whatlinkshere-links' => '← gırey',
-'whatlinkshere-hideredirs' => '$1 redreksiyon',
-'whatlinkshere-hidetrans' => '$1 transklusyons',
+'whatlinkshere-hideredirs' => 'Hetekerdışa $1',
+'whatlinkshere-hidetrans' => 'Açarnayışê $1',
 'whatlinkshere-hidelinks' => '$1 greyan',
 'whatlinkshere-hideimages' => 'gireyê resimî $1',
 'whatlinkshere-filters' => 'Filtreyan',
@@ -2136,6 +2165,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipbhidename' => 'Nameyê karberî listeyan u vurnayîşan ra binumne',
 'ipbwatchuser' => 'Pela miniqaşe u pela ena karberî seyr bike',
 'ipb-change-block' => 'Pê ena ayaran, karberî reyna bloke bike',
+'ipb-confirm' => 'Bloke kerdışi tesdik ke',
 'badipaddress' => 'Adresê IPî raşt niyo',
 'blockipsuccesssub' => 'Blok biyo',
 'blockipsuccesstext' => 'verniyê [[Special:Contributions/$1|$1]] geriya.
@@ -2153,6 +2183,9 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'blocklist' => 'Karberê kılitbiyaey',
 'ipblocklist' => 'Karberê kılitbiyaey',
 'ipblocklist-legend' => 'Yew karberê blok biyaye bivîne',
+'blocklist-addressblocks' => 'Nêverdışanê IP bınımne',
+'blocklist-rangeblocks' => 'Nêverdışanê gırda bınımne',
+'blocklist-timestamp' => 'İmzay demi',
 'blocklist-target' => 'Menzil',
 'blocklist-expiry' => 'Wahdey qedyayışi',
 'blocklist-by' => 'hizmetdarê blokê',
@@ -2255,6 +2288,18 @@ Tı nıeşkeni name yew pele reyna bıvurni.
 '''Teme!'''
 Ena transfer ser peleyanê populari zaf muhumo;
 Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
+'movepagetext-noredirectfixer' => "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.
+Ma nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.
+Tı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.
+Eg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.
+Tı gani qontrol bıki eg gıreyan şıno peleyanê raşti.
+
+Teme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.
+Tı nıeşkeni name yew pele reyna bıvurni.
+
+'''İkaz!'''
+Ena transfer ser peleyanê populari zaf muhumo;
+Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
 'movepagetalktext' => "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''
 *Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi
 *Tı quti check nıkerd.
@@ -2340,7 +2385,7 @@ ma vaci: qey pelê "[[{{MediaWiki:Mainpage}}]]i " [[{{#Special:Export}}/{{MediaW
 'export-pagelinks' => 'behsê xorıniya pelê pêrabesteyani:',
 
 # Namespace 8 related
-'allmessages' => 'Mesajanê sistemi',
+'allmessages' => 'Mesacê sistemi',
 'allmessagesname' => 'Name',
 'allmessagesdefault' => 'nuşteyo orjinal',
 'allmessagescurrent' => 'nuşte yo ke şuxuliyeno',
@@ -2417,6 +2462,9 @@ dosyaya emaneti vindbiyo',
 'import-logentry-interwiki' => '$1 transwiki biyo',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revizyon|revizyonî}} $2 ra',
 
+# JavaScriptTest
+'javascripttest' => 'Cerbnayışê JavaScripti',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Pela ya Qarberi',
 'tooltip-pt-anonuserpage' => 'pelê karberê IPyi',
@@ -2437,7 +2485,7 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 Çımey ena pele bıvin',
 'tooltip-ca-history' => 'Versiyonê verênê ena pele',
 'tooltip-ca-protect' => 'Ena pele kılit ke',
-'tooltip-ca-unprotect' => 'Ena pele a bike',
+'tooltip-ca-unprotect' => 'Starkerdışe ena peler bıvurne',
 'tooltip-ca-delete' => 'Ena pele bıestere',
 'tooltip-ca-undelete' => 'peli biyarê halê ver hewnakerdışi',
 'tooltip-ca-move' => 'Ena pele bere',
@@ -2480,6 +2528,8 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-diff' => 'Vurnayışe mı bımoc',
 'tooltip-compareselectedversions' => 'Ferqê versiyonan bevinin',
 'tooltip-watch' => 'Eno pele listey tıyo seyir-kerdişi ri dek',
+'tooltip-watchlistedit-normal-submit' => 'Sernuşteya hewad',
+'tooltip-watchlistedit-raw-submit' => 'Listeyê seyr kerdişî newen ke',
 'tooltip-recreate' => 'pel hewn a bışiyo zi tepiya biya',
 'tooltip-upload' => 'Bar bike',
 'tooltip-rollback' => '"Peyser biya" be yew tik pela îştirak(an)ê peyên|i(an) peyser ano.',
@@ -2512,11 +2562,17 @@ Tı eşkeno yew sebeb bınus.',
 'spam_blanking' => 'revizyonê hemeyi de ıney $1 re gıreyi estî, deverdiyeno',
 
 # Info page
+'pageinfo-title' => 'Heq tê "$1"\'i',
 'pageinfo-header-edits' => 'Vurnayışi',
 'pageinfo-header-watchlist' => 'Listey temaşi',
 'pageinfo-header-views' => 'Bıvin',
 'pageinfo-subjectpage' => 'Pele',
 'pageinfo-talkpage' => 'Pelay qıse',
+'pageinfo-watchers' => 'Amarina temaşekaran',
+'pageinfo-edits' => 'Amarina vurnayışan',
+'pageinfo-authors' => 'Amarina nuştekaran',
+'pageinfo-views' => 'Amarina mocnayışan',
+'pageinfo-viewsperedit' => 'Vurnayışi sero vurnayışa bımocnêyış',
 
 # Patrolling
 'markaspatrolleddiff' => 'Nişan bike ke devriye biyo',
@@ -2557,9 +2613,12 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pele|peli}}',
 'file-info' => 'ebatê dosyayi: $1, MIME tip: $2',
 'file-info-size' => '$1 × $2 pixelan, ebatê dosya: $3, MIME type: $4',
+'file-info-size-pages' => '$1 × $2 pikse, dergeya dosyay: $3, MIME tipiya cı: $4, $5 {{PLURAL:$5|pela|pela}}',
 'file-nohires' => 'Rovıleşiyayışo berzêr çıniyo.',
 'svg-long-desc' => 'SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3',
 'show-big-image' => 'Resolosyonê temami',
+'show-big-image-preview' => "Verqayd dergiya: $1'i.",
+'show-big-image-other' => 'Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.',
 'show-big-image-size' => '$1 × $2 piksel',
 'file-info-gif-looped' => 'viyariye biyo',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|çerçeve|çerçeveyi}}',
@@ -2594,11 +2653,11 @@ Yew rêze de gırêyo sıfteyın gani gırêyo de dosya xırabıne bo.
 Na rêze de her gırêyo bin zey istisna vêniyeno, yanê pelê ke dosya beno ke sero rêzbiyaye asena.',
 
 # Metadata
-'metadata' => 'Metadata',
+'metadata' => 'Melumato serên',
 'metadata-help' => 'Ena dosya dı zafyer informasyoni esto. Belki ena dosya yew kamareyo dijital ya zi skaner ra vıraziyo.
 Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.',
-'metadata-expand' => 'Extended detayan bımoc',
-'metadata-collapse' => 'extended details bınım',
+'metadata-expand' => 'Detayan bımocne',
+'metadata-collapse' => 'melumati bınımne',
 'metadata-fields' => 'Resımê meydanê metadataê ke na pele de benê lista, pela resımmocnaene de ke tabloê metadata gına waro, gureniyenê.
 Ê bini zey sayekerdoğan nımiyenê.
 * make
@@ -2730,10 +2789,43 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-gpsdifferential' => 'GPS differential correction',
 'exif-jpegfilecomment' => "Vatışê dosyada JPEG'i",
 'exif-keywords' => 'Qesa kelimey',
+'exif-worldregiondest' => 'Wareyo ke mocneyêno',
+'exif-countrydest' => 'Dewleta ke mocneyêna',
+'exif-countrycodedest' => 'Kodê dewleto ke mocneyoêno',
+'exif-provinceorstatedest' => 'Eyalet yana wılayeto ke mocneyêno',
+'exif-citydest' => 'Sûka ke mocneyêna',
+'exif-sublocationdest' => 'Mıntıqeya sûker mocnayış',
+'exif-objectname' => 'Sernuşteyo qıckek',
+'exif-specialinstructions' => 'Talimatê xısusi',
+'exif-headline' => 'Sername',
+'exif-credit' => 'Kredi/Destegdaren',
+'exif-source' => 'Çıme',
+'exif-urgency' => 'Aciliyet',
+'exif-fixtureidentifier' => 'Namey fiksturi',
 'exif-writer' => 'Nuştekar',
 'exif-languagecode' => 'Zuwan',
+'exif-iimversion' => 'Verqaydê IIM',
 'exif-iimcategory' => 'Kategori',
+'exif-datetimeexpires' => 'No peyra mekarênê',
+'exif-datetimereleased' => 'Bıroşe',
+'exif-originaltransmissionref' => 'Oricinal pusula da kodê açarnayışi',
+'exif-identifier' => 'Şınasnayer',
+'exif-lens' => 'Lensê karkerdışi',
+'exif-cameraownername' => 'Wayırê kamera',
 'exif-label' => 'Etiket',
+'exif-rating' => 'Rey dayış (5i sera)',
+'exif-copyrighted' => 'Weziyetê telifi',
+'exif-copyrightowner' => 'Wayırê Telifi',
+'exif-usageterms' => 'Şertê karkerdışi',
+'exif-pngfilecomment' => "Vatışê dosyada PNG'i",
+'exif-disclaimer' => 'Reddê mesuliyeti',
+'exif-contentwarning' => 'İkazê zerreki',
+'exif-giffilecomment' => "vatena dosya da GIF'i",
+'exif-intellectualgenre' => 'Babeta çêki',
+'exif-subjectnewscode' => 'Kodê muhtewa',
+'exif-event' => 'Weqaya ke nameycıyo ravreno',
+'exif-organisationinimage' => 'Organizasyono ke ravêreno',
+'exif-personinimage' => 'Merdumo ke nameycıyo ravêreno',
 
 # EXIF attributes
 'exif-compression-1' => 'têhet nêanciyayo',
@@ -2821,6 +2913,8 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-sensingmethod-7' => 'Sensorê hirê-çizgi',
 'exif-sensingmethod-8' => 'sensora aritmetik a ke rengın his kena',
 
+'exif-filesource-3' => 'Dicital makinay kamera',
+
 'exif-scenetype-1' => 'ca de fotoğraf ker',
 
 'exif-customrendered-0' => 'Prosesê normali',
@@ -2869,6 +2963,10 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-gpslongitude-e' => 'derganiya rocvetış',
 'exif-gpslongitude-w' => 'Derganiya rocawan',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => 'Sewiye de roy ra $1 {{PLURAL:$1|metre|metre}} cordeyo',
+'exif-gpsaltitude-below-sealevel' => 'Sewiye de roy ra $1 {{PLURAL:$1|metre|metre}} cêrdeyo',
+
 'exif-gpsstatus-a' => 'peymawıtış dewam keno',
 'exif-gpsstatus-v' => 'şuxuliyayişê peymawıtışi',
 
@@ -2995,6 +3093,19 @@ eke şıma hesab *a nêkerdo*, qey ibtalê tesdiqkerdışê adresa e-postayi gı
 
 $5
 
+kodê tesdiqi heta ıney tarixi $4 meqbul o.',
+'confirmemail_body_set' => 'Jew ten, muhtemelen şıma no IP-adresi $1 ra,
+keye pelê {{SITENAME}}i de pê no $2 e-postayi hesab kerda.
+
+Eke raşta no e-posta eyê şıma yo şıma gani tesdiq bıkerî,
+qey tesdiq kerdışi gani karê e-postayê keyepeli {{SITENAME}} aktif bıbo, qey aktif kerdışi gıreyê cêrıni bıtıkne:
+
+$3
+
+eke şıma hesab *nêakerdo*, qey ibtalê tesdiq kerdışê adresa e-postayi gıreyê cêrêni bıtıknê:
+
+$5
+
 kodê tesdiqi heta ıney tarixi $4 meqbul o.',
 'confirmemail_invalidated' => 'Konfermasyonê adres ê emaîlî iptal biy',
 'invalidateemail' => 'confirmasyonê e-maili iptal bik',
@@ -3022,8 +3133,8 @@ Ma rica keno konfirme bike ke ti raştî wazeno eno pel bivirazo.",
 'confirm-unwatch-top' => 'Ena pele lista xoya seyirkerdışi ra bıvece?',
 
 # Multipage image navigation
-'imgmultipageprev' => 'peleyê verin',
-'imgmultipagenext' => 'pelo serîn →',
+'imgmultipageprev' => '← peleyê verin',
+'imgmultipagenext' => 'pela badê cû →',
 'imgmultigo' => 'Şı!',
 'imgmultigoto' => 'Şi pel $1',
 
@@ -3109,6 +3220,11 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-license' => 'Lisans',
 'version-poweredby-credits' => "Ena wiki, dezginda '''[//www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
 'version-poweredby-others' => 'Zewmi',
+'version-license-info' => "MediaWiki xoseri jew nuştereno; MediaWiki'yer, weqfê xoseri nuşteren GNU lisansiya merdumi şene ke vıla kerê, bıvurnê u timar kerê.
+
+Nuşterenê MediaWiki merdumi cı ra nahfat bivinê deye êyê mısade danê; feqet ke nêşeno BIROŞO yana XOSERİ VILA KERO qerantiya ney çına. bewni rê lisansta GNU'y.
+
+enê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU] zi şımarê icab keno; narak lisansê şıma çıno se, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA adresi ra yana [//www.gnu.org/licenses/old-licenses/gpl-2.0.html enê lisansi buwane].",
 'version-software' => 'Softwareyê ronayi',
 'version-software-product' => 'Mal',
 'version-software-version' => 'Versiyon',
@@ -3132,7 +3248,7 @@ Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqed
 'fileduplicatesearch-noresults' => 'Ebe namey "$1" ra dosya nêdiyayê.',
 
 # Special:SpecialPages
-'specialpages' => 'Pelê mêniye',
+'specialpages' => 'Peley xısusi',
 'specialpages-note' => '----
 * Xısusi pelaya normal
 * <span class="mw-specialpagerestricted">Xısusi peleyê keı rê ray nê deyaya.</span>
@@ -3208,16 +3324,19 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'htmlform-selectorother-other' => 'Bin',
 
 # New logging system
-'logentry-delete-delete' => "$1'i Pelaya $3'i besternê",
-'logentry-delete-restore' => "$1'i pelaya $3'i peyd grot",
+'logentry-delete-delete' => "Karber $1' pelay $3' besternê",
+'logentry-delete-restore' => "Karber $1' pelay $3' peyser grot",
+'logentry-suppress-delete' => '$1  $3 rê pıloxneyê',
 'revdelete-content-hid' => 'nusno nımte',
 'revdelete-summary-hid' => 'Vurnayışi nımtey niyê',
 'revdelete-uname-hid' => 'Namey karberi nımteyo',
+'revdelete-content-unhid' => 'Zerrek mocneya',
 'revdelete-summary-unhid' => 'Xulusaya vurnayışa mucneyê',
 'revdelete-uname-unhid' => 'Namey karberi ne nımteyo',
 'revdelete-restricted' => 'verger (vergırewtış) ê ke qey xızmkaran biye',
 'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
-'logentry-move-move' => "$1'i pelaya $3'i berd $4",
+'logentry-move-move' => "Karber $1' pelay $3' berd $4",
+'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
 'logentry-newusers-newusers' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create2' => "$1'i $3 rê hesab vıraşt",
@@ -3231,12 +3350,27 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'feedback-adding' => 'Pela rê peyxeberdar defêno...',
 'feedback-error1' => 'Xeta: API ra neticey ne vıcyay',
 'feedback-error2' => 'Xeta: Timar kerdış nebı',
+'feedback-error3' => 'Xeta: API ra cewab çıno',
 'feedback-close' => 'Biya star',
+'feedback-bugnew' => 'Mı qontrol ke. Xetaya newi xeber ke',
 
 # API errors
+'api-error-duplicate' => 'Ena {{PLURAL:$1|ze ke [zey $2]|biya [zey dosya da $2]}} zeq wesiqa biya wendeyê.',
+'api-error-duplicate-archive' => 'Ena {{PLURAL:$1|vurneyaya [$2 zey na dosya]| [zerrey cı zey $2 dosya]}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.',
+'api-error-duplicate-archive-popup-title' => 'Ena {{PLURAL:$1|Dosya besterneyaya|dosya}} xora  besterneyaya.',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|dosyaya|dosyaya}} dılet',
 'api-error-unknown-code' => "$1'dı jew xeta vıciye",
 'api-error-unknown-warning' => "$1'dı ikazo xırab:",
 'api-error-unknownerror' => "$1'dı jew xeta vıciye",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|saniya|saniyey}}',
+'duration-minutes' => '$1 {{PLURAL:$1|deqa|deqey}}',
+'duration-hours' => '($1 {{PLURAL:$1|seate|seati}})',
+'duration-days' => '($1 {{PLURAL:$1|roce|roci}})',
+'duration-weeks' => '$1 {{PLURAL: $1|hefte|heftey}}',
+'duration-years' => '$1 {{PLURAL:$1|serre|serri}}',
+'duration-centuries' => '$1 {{PLURAL:$1|seserre|seserri}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenyum|milenyumi}}',
+
 );
index c93d107..547036c 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Dbc334
  * @author Derbeth
  * @author Dunak
  * @author Dundak
@@ -810,7 +811,8 @@ Nejnowšy zapisk blokěrowańskego protokola pódawa se dołojce ako referenca:'
 'updated' => '(Zaktualizěrowane)',
 'note' => "'''Pokazka:'''",
 'previewnote' => "'''Wobmysli, až to jo jano pśeglěd.'''
-Twóje změny hyšći njejsu składowane! [[#editform|→ Dalej wobźěłaś]]",
+Twóje změny hyšći njejsu składowane!",
+'continue-editing' => 'Dalej wobźěłaś',
 'previewconflict' => 'Toś ten pśeglěd wótbłyšćujo tekst górjejcnego póla. Bok buźo tak wuglědaś, jolic jen něnto składujoš.',
 'session_fail_preview' => "'''Wódaj! Twójo wobźěłanje njejo se mógało składowaś, dokulaž su daty twójogo pósejźenja se zgubili. Pšosym wopytaj hyšći raz. Jolic až to pón pśecej hyšći njejźo, wopytaj se wótzjawiś a zasej pśizjawiś.'''",
 'session_fail_preview_html' => "'''Wódaj! Twójo wobźěłanje njejo se mógało składowaś, dokulaž su daty twójogo pósejźenja se zgubili.'''
@@ -894,6 +896,10 @@ Njesmějo daś wěcej nježli $2 {{PLURAL:$2|wołanja|wołanjowu|wołanjow|woła
 'parser-template-loop-warning' => 'Pśedłogowa šlejfa namakana: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limit rekursijneje dłymi pśedłogi pśekšocony ($1)',
 'language-converter-depth-warning' => 'Limit dłymokosći rěcnego konwertera pśekšocony ($1)',
+'node-count-exceeded-category' => 'Boki, źož licba sukow jo pśekšocona',
+'node-count-exceeded-warning' => 'Bok jo licbu sukow pśekšocył',
+'expansion-depth-exceeded-category' => 'Boki, źož ekspansiska dłymokosć jo pśekšocona',
+'expansion-depth-exceeded-warning' => 'Bok jo ekspansisku dłymokosć pśekšocył',
 
 # "Undo" feature
 'undo-success' => 'Wobźěłanje móžo se wótpóraś. Pšosym pśeglěduj dołojcne pśirownowanje aby se wěsty był, až to wót wěrnosći coš, a pón składuj změny, aby se wobźěłanje doskóńcnje wótpórało.',
@@ -1037,7 +1043,7 @@ Pšosym pśeglědaj protokole.',
 
 # Suppression log
 'suppressionlog' => 'Protokol pódłocowanjow',
-'suppressionlogtext' => 'To jo lisćina wulašowanjow a blokěrowanjow, kótaraž ma wopśimjeśe, kótarež jo wót administratorow schowane. Glědaj  [[Special:BlockList|lisćinu IP-blokěrowanjow]] za lisćinu aktualnych wugnanjow a blokěrowanjow.',
+'suppressionlogtext' => 'To jo lisćina wulašowanjow a blokěrowanjow, kótaraž ma wopśimjeśe, kótarež jo wót administratorow schowane. Glědaj  [[Special:BlockList|lisćinu blokěrowanjow]] za lisćinu aktualnych wugnanjow a blokěrowanjow.',
 
 # History merging
 'mergehistory' => 'Zwězaś stawizny bokow',
@@ -1162,7 +1168,7 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
 'prefs-skin' => 'Šat',
 'skin-preview' => 'Pśeglěd',
 'datedefault' => 'Standard',
-'prefs-beta' => 'Betafunkcije',
+'prefs-beta' => 'Preizkusne funkcije',
 'prefs-datetime' => 'Datum a cas',
 'prefs-labs' => 'Laborowe funkcije',
 'prefs-personal' => 'Wužywarski profil',
@@ -1704,7 +1710,7 @@ Za optimalnu wěstotu img_auth.php jo znjemóžnjony.',
 'upload-curl-error28-text' => 'Bok pśedłujko njejo wótegronił. Kontrolěruj, lic jo bok online, pócakaj wokognuśe a wopytaj pón hyšći raz. Móžo byś zmysłapołne, w drugem casu hyšći raz proběrowaś.',
 
 'license' => 'Licenca:',
-'license-header' => 'Licencowanje',
+'license-header' => 'Licencěrowanje',
 'nolicense' => 'Nic njejo wuzwólone.',
 'license-nopreview' => '(Pśeglěd njejo móžny.)',
 'upload_source_url' => ' (płaśeca, zjawnje pśistupna URL)',
@@ -1967,6 +1973,11 @@ Pšosym glědaj na to, až druge websedła móžu k drugej dataji z direktnym UR
 'allpages-bad-ns' => 'Mjenjowy rum „$1“ w {{SITENAME}} njeeksistěrujo.',
 'allpages-hide-redirects' => 'Dalejpósrědnjenja schowaś',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Woglědujoš se pufrowanu wersiju toś togo boka, kótaraž móžo do $1 stara byś.',
+'cachedspecial-viewing-cached-ts' => 'Woglědujoš se pufrowanu wersiju toś togo boka, kótaraž by mógła njeaktualna byś.',
+'cachedspecial-refresh-now' => 'Aktualnu wersiju se woglědaś.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Slědujuca kategorija wopśimujo|Slědujucej kategoriji wopśimujotej|Slědujuce kategorije wopśimuju|Slědujuce kategorije wopśimuju}} boki abo medije.
@@ -2391,8 +2402,8 @@ Nejnowšy zapisk protokola blokěrowanjow pódawa se dołojce ako referenca:',
 'ipb-confirm' => 'Blokěrowanje wobkšuśiś',
 'badipaddress' => 'IP-adresa jo njekorektna',
 'blockipsuccesssub' => 'Wuspěšnje blokěrowane',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] jo se blokěrował.<br />
-Glědaj do [[Special:BlockList|lisćiny aktiwnych blokěrowanjow]], aby blokěrowanja pśeglědał.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] jo se {{GENDER:$1|blokěrował|blokěrowała}}.<br />
+Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśeglědał.',
 'ipb-blockingself' => 'Coš samogo blokěrowaś! Coš to napšawdu cyniś?',
 'ipb-confirmhideuser' => 'Coš rowno wužywarja z nastajenim "wužywarja schowaś" blokěrowaś. To k tomu dowjeźo, až mě wužywarja pódłocyjo se we wšych lisćinach a protokolowych zapiskach. Coš to napšawdu cyniś?',
 'ipb-edit-dropdown' => 'Pśicyny blokěrowanja wobźěłaś',
@@ -2442,9 +2453,7 @@ Glědaj do [[Special:BlockList|lisćiny aktiwnych blokěrowanjow]], aby blokěro
 'blocklog-showsuppresslog' => 'Toś ten wužywaŕ jo se pjerwjej zablokěrował a schował. Protokol pódtłocowanjow pódawa se dołojce ako referenca:',
 'blocklogentry' => '[[$1]] blokěrujo se na $2 $3',
 'reblock-logentry' => 'jo změnił blokěrowańske nastajenja za [[$1]] z casom spadnjenja $2 $3',
-'blocklogtext' => 'To jo protokol blokěrowanjow a dopušćenjow.
-IP-adresy, ako su awtomatiski se blokěrowali, se njepokažu.
-Na boce [[Special:BlockList|Lisćina blokěrowanych IP-adresow a wužywarskich mjenjow]] jo móžno, akualne blokěrowanja pśeglědowaś.',
+'blocklogtext' => 'To jo protokol blokěrowanja a wótblokěrowanja wužywarjow. Awtomatiski blokěrowane IP-adrese se njenalistuju. Glědaj [[Special:BlockList|lisćinu blokěrowanjow]] za lisćinu tuchylnych wugnanjow a blokěrowanjow.',
 'unblocklogentry' => 'jo $1 zasej dopušćił',
 'block-log-flags-anononly' => 'jano anonymne',
 'block-log-flags-nocreate' => 'stwórjenje konta jo se znjemóžniło',
@@ -3031,7 +3040,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
 'exif-gpsdestdistance' => 'Distanca k celowemu městnu',
 'exif-gpsprocessingmethod' => 'Mě metody pśeźěłanja GPS',
 'exif-gpsareainformation' => 'Mě wobcerka GPS',
-'exif-gpsdatestamp' => 'Datum GPS',
+'exif-gpsdatestamp' => 'GPS-datum',
 'exif-gpsdifferential' => 'Diferencialna korektura GPS',
 'exif-jpegfilecomment' => 'Komentar JPEG-dataje',
 'exif-keywords' => 'Klucowe słowa',
@@ -3507,6 +3516,9 @@ Ty by dejał [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licence GNU General Public
 'version-software' => 'Instalěrowana software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Wersija',
+'version-entrypoints' => 'URL zastupneho dypka',
+'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Datajowa droga',
@@ -3694,4 +3706,15 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'api-error-uploaddisabled' => 'Nagraśa su na toś tom wikiju znjemóžnjone.',
 'api-error-verification-error' => 'Toś ta dataja by mógła wobkškóźona byś abo wopacnu kóńcowku měś.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunźe|sekundy|sekundow}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuśe|minuty|minutow}}',
+'duration-hours' => '$1 {{PLURAL:$1|góźina|góźinje|góźiny|góźinow}}',
+'duration-days' => '$1 {{PLURAL:$1|źeń|dnja|dny|dnjow}}',
+'duration-weeks' => '$1 {{PLURAL: $1|tyźeń|tyźenja|tyźenje|tyźenjow}}',
+'duration-years' => '$1 {{PLURAL: $1|lěto|lěśe|lěta|lět}}',
+'duration-decades' => '$1 {{PLURAL:$1|lětźasetk|lětźasetka|lětźasetki|lětźastkow}}',
+'duration-centuries' => '$1 {{PLURAL:$1|stolěśe|stolěśi|stolěśa|stolěśow}}',
+'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysaca|lěttysace|lěttysacow}}',
+
 );
index 21471f4..9c1a376 100644 (file)
@@ -28,6 +28,7 @@
  * @author MF-Warburg
  * @author Malafaya
  * @author Omnipaedista
+ * @author Protnet
  * @author Reedy
  * @author Remember the dot
  * @author Sinopeus
@@ -385,8 +386,8 @@ $messages = array(
 'tog-showjumplinks' => 'Ενεργοποίησε τους συνδέσμους προσβασιμότητας του τύπου "μετάβαση σε"',
 'tog-uselivepreview' => 'Χρησιμοποίησε άμεση προεπισκόπηση (JavaScript) (Πειραματικό)',
 'tog-forceeditsummary' => 'Ειδοποίησέ με όταν εισάγω μια κενή σύνοψη επεξεργασίας',
-'tog-watchlisthideown' => 'Απόκρυψε τις επεξεργασίες μου απο τη λίστα παρακολούθησης',
-'tog-watchlisthidebots' => 'Απόκρυψε τις επεξεργασίες των bots από τη λίστα παρακολούθησης',
+'tog-watchlisthideown' => 'Απόκρυψε τις επεξεργασίες μου από τη λίστα παρακολούθησης',
+'tog-watchlisthidebots' => 'Απόκρυψε τις επεξεργασίες των bot από τη λίστα παρακολούθησης',
 'tog-watchlisthideminor' => 'Απόκρυψε τις μικρής σημασίας επεξεργασίες από τη λίστα παρακολούθησης',
 'tog-watchlisthideliu' => 'Απόκρυψη επεξεργασιών συνδεδεμένων χρηστών από τη λίστα παρακολούθησης',
 'tog-watchlisthideanons' => 'Απόκρυψη επεξεργασιών ανωνύμων χρηστών από τη λίστα παρακολούθησης',
@@ -732,6 +733,9 @@ $2',
 'ns-specialprotected' => 'Σελίδες στον τομέα {{ns:special}} δεν γίνεται να επεξεργαστούν.',
 'titleprotected' => "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].
 Ο λόγος που δίνεται είναι ''$2''.",
+'filereadonlyerror' => 'Δεν είναι δυνατή η τροποποίηση του αρχείου " $1 " επειδή το αποθετήριο αρχείων " $2 " είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.
+
+Ο διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: " $3 ".',
 
 # Virus scanner
 'virus-badscanner' => "Λάθος ρύθμιση: άγνωστος ανιχνευτής ιών: ''$1''",
@@ -816,6 +820,7 @@ $2',
 'emailconfirmlink' => 'Επαληθεύστε την ηλεκτρονική σας διεύθυνση',
 'invalidemailaddress' => 'Η ηλεκτρονική διεύθυνση δεν μπορεί να γίνει δεκτή γιατί ενδεχομένως δεν έχει έγκυρη μορφή. Παρακαλούμε συμπληρώστε μια σωστά διαμορφωμένη διεύθυνση ή αφήστε το πεδίο κενό.',
 'cannotchangeemail' => "Οι διευθύνσεις ηλεκτρονικού ταχυδρομείου του λογαριασμού δεν μπορούν να αλλάξουν σ' αυτό το wiki.",
+'emaildisabled' => 'Αυτός ο ιστότοπος  δεν μπορεί να στείλει μηνύματα ηλεκτρονικού ταχυδρομείου.',
 'accountcreated' => 'Ο λογαριασμός δημιουργήθηκε',
 'accountcreatedtext' => 'Ο λογαριασμός χρήστη για τον/την $1 έχει δημιουργηθεί.',
 'createaccount-title' => 'Δημιουργία λογαριασμού για {{SITENAME}}',
@@ -1000,7 +1005,9 @@ $2
 'userinvalidcssjstitle' => "'''Προσοχή:''' Δεν υπάρχει skin με τίτλο \"\$1\". Θυμηθείτε οι προσαρμοσμένες σελίδες .css και .js χρησιμοποιούν έναν τίτλο με μικρά γράμματα, π.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Ενημερώθηκε)',
 'note' => "'''Προσοχή: '''",
-'previewnote' => "'''Σας υπενθυμίζουμε ότι βλέπετε μόνον την προεπισκόπηση -δεν έχετε ακόμα αποθηκεύσει τις αλλαγές σας!'''",
+'previewnote' => "'''Να θυμάστε ότι αυτή είναι μόνο μια προεπισκόπηση.'''
+Οι αλλαγές σας δεν έχουν ακόμη αποθηκευτεί!",
+'continue-editing' => 'Συνέχεια επεξεργασίας',
 'previewconflict' => 'Αυτή η προεπισκόπηση απεικονίζει το κείμενο στην επάνω περιοχή επεξεργασίας κειμένου, όπως θα εμφανιστεί εάν επιλέξετε να το αποθηκεύσετε.',
 'session_fail_preview' => "'''Συγγνώμη! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.
 Παρακαλώ προσπαθήστε ξανά. Αν δεν δουλεύει ξανά, δοκιμάστε να αποσυνδεθείτε και να συνδεθείτε πάλι.'''",
@@ -1013,6 +1020,7 @@ $2
 Αυτό μερικές φορές συμβαίνει όταν χρησιμοποιείται ένας ανώνυμος διακομιστής μεσολάβησης διαθέσιμος μέσω του παγκόσμιου ιστού με σφάλματα.'''",
 'edit_form_incomplete' => "'''Ορισμένα τμήματα της φόρμας επεξεργασίας δεν έφθασαν στο διακομιστή. Ελέγξτε ότι οι αλλαγές σας είναι άθικτες και προσπαθήστε ξανά.'''",
 'editing' => 'Επεξεργασία $1',
+'creating' => 'Δημιουργία: $1',
 'editingsection' => 'Επεξεργασία $1 (τμήμα)',
 'editingcomment' => 'Επεξεργασία $1 (νέο τμήμα)',
 'editconflict' => 'Σύγκρουση επεξεργασίας: $1',
@@ -1078,6 +1086,7 @@ $2
 'edit-no-change' => 'Η επεξεργασία σας αγνοήθηκε, επειδή δεν έγινε καμία αλλαγή στο κείμενο.',
 'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουργηθεί η νέα σελίδα.
 Υπάρχει ήδη.',
+'defaultmessagetext' => 'Προεπιλεγμένο κείμενο μηνύματος',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Προειδοποίηση: Αυτή η σελίδα περιέχει πάρα πολύ ακριβό αναλυτή λειτουργικών κλήσεων.
@@ -1234,7 +1243,7 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Κατάλογος διαγραφών',
-'suppressionlogtext' => 'Παρακάτω βρίσκεται μία λίστα με τις διαγραφές και τις φραγές σχετικές με περιεχόμενο που έχει κρυφθεί από τους διαχειριστές.
+'suppressionlogtext' => 'Παρακάτω βρίσκεται μία λίστα με τις διαγραφές και τις φραγές σχετικό  με περιεχόμενο που έχει αποκρυβεί από τους διαχειριστές.
 Δείτε την [[Special:BlockList|λίστα φραγών IP]] για τις τρέχουσες λειτουργικές απαγορεύσεις και φραγές.',
 
 # History merging
@@ -1653,6 +1662,7 @@ $1",
 'newsectionsummary' => '/* $1 */ νέα ενότητα',
 'rc-enhanced-expand' => 'Εμφάνιση λεπτομερειών (απαιτείται JavaScript)',
 'rc-enhanced-hide' => 'Απόκρυψη λεπτομερειών',
+'rc-old-title' => 'αρχικά δημιουργήθηκε ως " $1 "',
 
 # Recent changes linked
 'recentchangeslinked' => 'Σχετικές αλλαγές',
@@ -1807,6 +1817,7 @@ $1',
 'upload-too-many-redirects' => 'Το URL περιείχε πάρα πολλές ανακατευθύνσεις',
 'upload-unknown-size' => 'Άγνωστο μέγεθος',
 'upload-http-error' => 'Εμφανίστηκε κάποιο σφάλμα HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'Δεν υπάρχουν διαθέσιμα ανεβάσματα αντιγράφων από αυτό τον τομέα.',
 
 # File backend
 'backend-fail-stream' => 'Αδύνατη η μετάδοση του αρχείου $1.',
@@ -1934,6 +1945,10 @@ $1',
 Παρακαλούμε δείτε τη [$2 σελίδα περιγραφής του αρχείου] για περισσότερες πληροφορίες.',
 'sharedupload-desc-here' => 'Το αρχείο είναι από το $1 και ενδέχεται να χρησιμοποιείται από άλλα εγχειρήματα.
 Η περιγραφή στη [$2 σελίδα περιγραφής αρχείου] εμφανίζεται παρακάτω.',
+'sharedupload-desc-edit' => 'Αυτό το αρχείο είναι από  $1  και μπορεί να χρησιμοποιείται από άλλα εγχειρήματα.
+Ίσως θέλετε να επεξεργαστείτε την περιγραφή του στην   [$2  σελίδα περιγραφής αρχείου] εκεί.',
+'sharedupload-desc-create' => 'Αυτό το αρχείο είναι από $1 και μπορεί να χρησιμοποιείται από άλλα εγχειρήματα.
+Ίσως θέλετε να επεξεργαστείτε την περιγραφή του στην [$2 σελίδα περιγραφής αρχείου] εκεί.',
 'filepage-nofile' => 'Κανένα αρχείο με αυτό το όνομα δεν υπάρχει',
 'filepage-nofile-link' => 'Δεν υπάρχει τέτοιο αρχείο, αλλἀ μπορείτε να [$1 το επιφορτώσετε].',
 'uploadnewversion-linktext' => 'Φορτώστε μια νέα έκδοση αυτού του αρχείου',
@@ -2065,6 +2080,7 @@ $1',
 'wantedpages-badtitle' => 'Μη εγκυρός τίτλος στο σύνολο αποτελέσματος: $1',
 'wantedfiles' => 'Επιθυμητά αρχεία',
 'wantedfiletext-cat' => 'Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Αρχεία από εξωτερικά αποθετήρια ενδέχεται να παρατίθενται παρότι υπάρχουν. Κάθε τέτοιες λανθασμένες αναφορές θα <del>διαγραμμίζονται</del>. Επιπλέον, σελίδες που ενσωματώνουν αρχεία που δεν υπάρχουν παρατίθενται στο [[:$1]].',
+'wantedfiletext-nocat' => 'Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Πέρα από τα υπάρχοντα ενδέχεται να έχουν καταχωριστεί και αρχεία από εξωτερικές πηγές λογισμικού. Τέτοιες ψευδο-υπαρκτές καταχωρίσεις θα εμφανίζονται <del>διαγραμμισμένες</del>.',
 'wantedtemplates' => 'Επιθυμητά πρότυπα',
 'mostlinked' => 'Οι σελίδες με τις περισσότερες αναφορές',
 'mostlinkedcategories' => 'Περισσότερο χρησιμοποιούμενες κατηγορίες',
@@ -2073,6 +2089,7 @@ $1',
 'mostimages' => 'Περισσότερο χρησιμοποιούμενα αρχεία',
 'mostrevisions' => 'Άρθρα με τις περισσότερες αναθεωρήσεις',
 'prefixindex' => 'Όλες οι σελίδες με πρόθεμα',
+'prefixindex-namespace' => 'Όλες οι σελίδες με πρόθεμα (περιοχής  $1)',
 'shortpages' => 'Σύντομες σελίδες',
 'longpages' => 'Εκτενείς σελίδες',
 'deadendpages' => 'Αδιέξοδες σελίδες',
@@ -2110,6 +2127,7 @@ $1',
 # Book sources
 'booksources' => 'Πηγές βιβλίων',
 'booksources-search-legend' => 'Αναζήτηση για πηγές βιβλίων',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'Πήγαινε',
 'booksources-text' => 'Παρακάτω είναι μια λίστα συνδέσμων σε άλλους ιστοτόπους οι οποίοι πωλούν νέα και μεταχειρισμένα βιβλία, και μπορεί επίσης να έχουν περισσότερες πληροφορίες για βιβλία για τα οποία ψάχνετε:',
 'booksources-invalid-isbn' => 'Το δοσμένο ISBN δεν φαίνεται να είναι έγκυρο· ελέγξτε για λάθη κατά την αντιγραφή από την αρχική πηγή.',
@@ -2139,6 +2157,12 @@ $1',
 'allpagesprefix' => 'Προβολή των σελίδων με πρόθεμα:',
 'allpagesbadtitle' => 'Ο δοσμένος τίτλος σελίδας ήταν άκυρος ή είχε ένα διαγλωσσικό ή δια-wiki πρόθεμα. Μπορεί να περιέχει έναν ή περισσότερους χαρακτήρες οι οποίοι δεν μπορούν να χρησιμοποιοθούν σε τίτλους.',
 'allpages-bad-ns' => 'Το {{SITENAME}} δεν έχει τον τομέα "$1".',
+'allpages-hide-redirects' => 'Απόκρυψη ανακατευθύνσεων',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Βλέπετε μια προσωρινά αποθηκευμένη έκδοση αυτής της σελίδας, που μπορεί να είναι μέχρι και $1 παλιά.',
+'cachedspecial-viewing-cached-ts' => 'Βλέπετε μια προσωρινά αποθηκευμένη έκδοση αυτής της σελίδας, που μπορεί να μην είναι εντελώς πραγματική.',
+'cachedspecial-refresh-now' => 'Προβολή τελευταίας.',
 
 # Special:Categories
 'categories' => 'Κατηγορίες',
@@ -2159,7 +2183,9 @@ $1',
 'linksearch-pat' => 'Μοτίβο αναζήτησης:',
 'linksearch-ns' => 'Περιοχή:',
 'linksearch-ok' => 'Αναζήτηση',
-'linksearch-text' => '',
+'linksearch-text' => 'Χαρακτήρες όπως "*.wikipedia.org" μπορούν να χρησιμοποιηθούν. 
+Χρειάζεται τουλάχιστον ένα domain ανώτατου επιπέδου, για παράδειγμα "*.org".<br />
+Υποστηριζόμενα πρωτόκολλα: <tt> $1 </tt> (μην προσθέτετε οποιαδήποτε από αυτές στην αναζήτησή σας).',
 'linksearch-line' => 'Η $1 συνδεδεμένη από την $2',
 'linksearch-error' => 'Λέξεις-μπαλαντέρ μπορεί να εμφανιστούν μόνο στην αρχή τού ονόματος ιστοτόπου (hostname).',
 
@@ -2380,6 +2406,7 @@ $UNWATCHURL
 'protect-title-notallowed' => 'Εμφάνιση επιπέδου προστασίας για την "$1"',
 'prot_1movedto2' => 'Η [[$1]] μετακινήθηκε στη θέση [[$2]]',
 'protect-badnamespace-title' => 'Μη-προστατευόμενη ομάδα σελίδων',
+'protect-badnamespace-text' => 'Οι  σελίδες σε αυτόν τον ονοματοχώρο δεν μπορούν να κλειδωθούν.',
 'protect-legend' => 'Επιβεβαίωση κλειδώματος',
 'protectcomment' => 'Αιτία:',
 'protectexpiry' => 'Λήξη',
@@ -2577,8 +2604,8 @@ $1',
 'ipb-confirm' => 'Επιβεβαίωση φραγής',
 'badipaddress' => 'Άκυρη διεύθυνση IP.',
 'blockipsuccesssub' => 'Η φραγή ολοκληρώθηκε επιτυχώς.',
-'blockipsuccesstext' => 'Η διεύθυνση [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />
\94είÏ\84ε Ï\84η [[Special:BlockList|λίÏ\83Ï\84α Î´Î¹ÎµÏ\85θÏ\8dνÏ\83εÏ\89ν IP Ï\80οÏ\85 Î­Ï\87οÏ\85ν Ï\85Ï\80οÏ\83Ï\84εί Ï\86Ï\81αγή]] Î³Î¹Î± Î½Î± Ï\84ο ÎµÏ\80ιβεβαιÏ\8eÏ\83εÏ\84ε.',
+'blockipsuccesstext' => '{{GENDER:$1|Ο|Η}} [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />
\94είÏ\84ε Ï\84ον [[Special:BlockList|καÏ\84άλογο Ï\86Ï\81αγÏ\8eν]] Î³Î¹Î± Î½Î± ÎµÏ\80οÏ\80Ï\84εÏ\8dÏ\83εÏ\84ε Ï\84ιÏ\82 Ï\86Ï\81αγέÏ\82.',
 'ipb-blockingself' => 'Είστε έτοιμος να επιβάλετε φραγή στον ευατό σας! Είστε σίγουροι ότι θέλετε να το κάνετε αυτό;',
 'ipb-confirmhideuser' => 'Είστε {{GENDER:|έτοιμος|έτοιμη}} να μπλοκάρετε ένα χρήστη με ενεργοποιημένη την "απόκρυψη χρήστη" . Αυτό θα καταστείλει το όνομα του χρήστη σε όλες τις λίστες και τις καταχωρήσεις ημερολογίου. Είστε {{GENDER:|σίγουρος|σίγουρη}} ότι θέλετε να το κάνετε αυτό;',
 'ipb-edit-dropdown' => 'Επεξεργασία λόγων φραγής',
@@ -2631,8 +2658,8 @@ $1',
 'blocklogentry' => 'O/H [[$1]] φράχθηκε με χρόνο λήξης $2 $3',
 'reblock-logentry' => 'άλλαξε τις ρυθμίσεις φραγής για τον/την [[$1]] με χρόνο λήξης $2 $3',
 'blocklogtext' => 'Αυτό είναι ένα αρχείο καταγραφής των ενεργειών φραγής και κατάργησης φραγής χρηστών.
-Δεν συμπεριλαμβάνονται οι διευθύνσεις IP που υπέστησαν αυτόματα φραγή.
-Δείτε τον [[Special:BlockList|κατάλογο φραγμένων διευθύνσεων IP]] για τη λίστα των τρεχόντων ενεργών αποκλεισμών και φραγών.',
+Δεν συμπεριλαμβάνονται οι διευθύνσεις IP που υπέστησαν φραγή αυτόματα.
+Δείτε τον [[Special:BlockList|κατάλογο φραγών]] για τη λίστα των τρεχόντων ενεργών αποκλεισμών και φραγών.',
 'unblocklogentry' => 'Άρση φραγής του "$1"',
 'block-log-flags-anononly' => 'μόνο ανώνυμοι χρήστες',
 'block-log-flags-nocreate' => 'δημιουργία λογαριασμού απενεργοποιημένη',
@@ -2879,7 +2906,15 @@ $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} από $2',
 
 # JavaScriptTest
+'javascripttest' => 'Δοκιμή JavaScript',
 'javascripttest-disabled' => 'Αυτή η λειτουργία έχει απενεργοποιηθεί.',
+'javascripttest-title' => 'Εκτελούνται  $1  δοκιμές',
+'javascripttest-pagetext-noframework' => 'Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Άγνωστο πλαίσιο δοκιμών " $1 ".',
+'javascripttest-pagetext-frameworks' => 'Παρακαλώ επιλέξτε ένα από τα ακόλουθα πλαίσια δοκιμών: $1',
+'javascripttest-pagetext-skins' => 'Επιλέξτε ένα skin για να εκτελέσετε δοκιμές με αυτό:',
+'javascripttest-qunit-intro' => 'Ανατρέξτε στην ενότητα [ $1 τεκμηρίωση δοκιμών] στο mediawiki.org.',
+'javascripttest-qunit-heading' => 'Σουίτα δοκιμών JavaScript QUnit του MediaWiki',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Η σελίδα χρήστη σας',
@@ -2941,6 +2976,7 @@ $1',
 'tooltip-diff' => 'Προβολή των αλλαγών που κάνατε στο κείμενο.',
 'tooltip-compareselectedversions' => 'Εμφάνιση των διαφορών ανάμεσα στις δύο αναθεωρήσεις της σελίδας που έχετε επιλέξει.',
 'tooltip-watch' => 'Προσθήκη της σελίδας στη λίστα παρακολούθησης',
+'tooltip-watchlistedit-normal-submit' => 'Μετακίνηση τίτλων',
 'tooltip-watchlistedit-raw-submit' => 'Ενημέρωση λίστας παρακολούθησης',
 'tooltip-recreate' => 'Ξαναδημιούργησε τη σελίδα παρόλο που έχει διαγραφεί',
 'tooltip-upload' => 'Έναρξη φόρτωσης',
@@ -3661,6 +3697,9 @@ $5
 'watchlisttools-edit' => 'Δείτε και επεξεργαστείτε τη λίστα παρακολούθησης',
 'watchlisttools-raw' => 'Επεξεργαστείτε την πρωτογενή λίστα παρακολούθησης',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|συζήτηση]])',
+
 # Core parser functions
 'unknown_extension_tag' => 'Άγνωστη ετικέτα επέκτασης "$1"',
 'duplicate-defaultsort' => 'Προσοχή: Το προκαθορισμένο κλειδί ταξινόμησης "$2" υπερκαλύπτει το προηγούμενο "$1".',
@@ -3683,16 +3722,17 @@ $5
 'version-hook-subscribedby' => 'Υπογεγραμμένο από',
 'version-version' => '(Έκδοση $1)',
 'version-license' => 'Άδεια χρήσης',
-'version-poweredby-credits' => "Αυτό το βίκι τροφοδοτείται από '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
+'version-poweredby-credits' => "Αυτό το βίκι λειτουργεί χάρις στο '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
 'version-poweredby-others' => 'άλλοι',
-'version-license-info' => "To Το MediaWiki είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανέμετε ή / και να το τροποποιήσετε υπό τους όρους της GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation.Είτε η δεύτερη έκδοση της άδειας, είτε (κατ' επιλογή σας) οποιδήποτε επόμενη έκδοση.
-Το MediaWiki διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ.Ούτε καν την σιωπηρή εγγύση της  ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή της ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕΝΑ PARTICULAR ΣΚΟΠΟ.Όπως δείτε την GNU General Public License για περισσότερες λεπτομέρειες.
+'version-license-info' => "Το MediaWiki είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό τους όρους της άδειας GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation· είτε της δεύτερης έκδοσης της άδειας, είτε (κατ' επιλογή σας) οποιασδήποτε επόμενης έκδοσης.
 
- Θα πρέπει να έχετε λάβει [((SERVER)) ((SCRIPTPATH)) / COPYING ένα αντίγραφο της GNU General Public License] μαζί με αυτό το πρόγραμμα.Αν όχι, γράψτε προς το Free Software Foundation, Inc, 51 Franklin Street, πέμπτο όροφο , Boston, MA 02110-1301, USA ή [//www.gnu.org/licenses/old-licenses/gpl-2.0.html διαβάστε το online].",
+Το MediaWiki διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ· ούτε καν την σιωπηρή εγγύηση ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕΝΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Βλ. GNU General Public License για περισσότερες λεπτομέρειες.
+
+Θα πρέπει να έχετε λάβει [{{SERVER}}{{SCRIPTPATH}}/COPYING ένα αντίγραφο της GNU General Public License] μαζί με αυτό το πρόγραμμα· αν όχι, στείλτε ένα γράμμα στο Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ή [//www.gnu.org/licenses/old-licenses/gpl-2.0.html διαβάστε το διαδικτυακά].",
 'version-software' => 'Εγκατεστημένο λογισμικό',
 'version-software-product' => 'Προϊόν',
 'version-software-version' => 'Έκδοση',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Διαδρομή αρχείου',
@@ -3795,13 +3835,32 @@ $5
 'sqlite-no-fts' => '$1 χωρίς την υποστήριξη αναζήτησης πλήρους κειμένου',
 
 # New logging system
+'logentry-delete-delete' => 'Ο/η $1 διέγραψε τη σελίδα $3',
+'logentry-delete-restore' => 'Ο/η $1 αποκατέστησε τη σελίδα $3',
+'logentry-delete-event' => '$1 άλλαξε την ορατότητα σε  {{PLURAL:$5|ένα γεγονός καταγραφής|$5 log events}} στο  $3: $4',
+'revdelete-content-hid' => 'το περιεχόμενο αποκρύφθηκε',
+'revdelete-summary-hid' => 'Η σύνοψη επεξεργασίας αποκρύφθηκε',
+'revdelete-uname-hid' => 'Το όνομα χρήστη αποκρύφθηκε',
+'revdelete-content-unhid' => 'το περιεχόμενο έπαψε να είναι κρυφό',
+'revdelete-summary-unhid' => 'η σύνοψη επεξεργασίας έπαψε να είναι κρυφή',
+'revdelete-uname-unhid' => 'το όνομα χρήστη έπαψε να είναι κρυφό',
 'revdelete-restricted' => 'εφάρμοσε περιορισμούς στους sysops',
 'revdelete-unrestricted' => 'αφαίρεσε περιορισμούς στους sysops',
-'logentry-newusers-create' => '$1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-move-move' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4',
+'logentry-move-move-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 χωρίς να αφήσει ανακατεύθυνση',
+'logentry-move-move_redir' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 πάνω από την ανανακατεύθυνση',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση',
+'logentry-patrol-patrol' => '{{GENDER:$1|Ο|Η}} $1 σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-patrol-patrol-auto' => '{{GENDER:$1|Ο|Η}} $1 αυτόματα σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-newusers-newusers' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-newusers-create' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-newusers-create2' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε τον λογαριασμό χρήστη $3',
 'logentry-newusers-autocreate' => 'Ο λογαριασμός $1 δημιουργήθηκε αυτόματα',
 'newuserlog-byemail' => 'ο κωδικός έχει σταλεί μέσω ηλεκτρονικού μηνύματος',
 
 # Feedback
+'feedback-bugornote' => 'Εάν είστε έτοιμοι να περιγράψετε ένα τεχνικό πρόβλημα λεπτομερώς παρακαλώ [ $1  κάντε μια αναφορά σφάλματος].
+Διαφορετικά, μπορείτε να χρησιμοποιήσετε την παρακάτω απλή φόρμα. Το σχόλιό σας θα προστεθεί στη σελίδα "[ $3  $2 ]", μαζί με το όνομα χρήστη σας και ποιο πρόγραμμα περιήγησης χρησιμοποιείτε.',
 'feedback-subject' => 'Θέμα:',
 'feedback-message' => 'Μήνυμα:',
 'feedback-cancel' => 'Ακύρωση',
@@ -3812,6 +3871,8 @@ $5
 'feedback-error3' => 'Σφάλμα: Καμία απάντηση από το API',
 'feedback-thanks' => 'Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα "[$2 $1]".',
 'feedback-close' => 'Ολοκληρώθηκε',
+'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [ $1  γνωστά σφάλματα].',
+'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
 
 # API errors
 'api-error-badaccess-groups' => 'Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.',
@@ -3851,4 +3912,15 @@ $5
 'api-error-uploaddisabled' => 'Η επιφόρτωση είναι απενεργοποιημένη σε αυτό το wiki.',
 'api-error-verification-error' => 'Αυτό το αρχείο μπορεί να είναι κατεστραμμένο, ή να έχει λανθασμένη επέκταση.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}}',
+'duration-minutes' => '$1 {{PLURAL:$1|λεπτό|λεπτά}}',
+'duration-hours' => '$1 {{PLURAL:$1|ώρα|ώρες}}',
+'duration-days' => '$1 {{PLURAL:$1|μέρα|μέρες}}',
+'duration-weeks' => '$1 {{PLURAL:$1|εβδομάδα|εβδομάδες}}',
+'duration-years' => '$1 {{PLURAL:$1|χρόνο|χρόνια}}',
+'duration-decades' => '$1 {{PLURAL:$1|δεκαετία|δεκαετίες}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Αιώνα|αιώνες}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Χιλιετία|Χιλιετίες}}',
+
 );
index 6b07bc6..bb405b6 100644 (file)
@@ -999,9 +999,6 @@ Please report this to an [[Special:ListUsers/sysop|administrator]], making note
 'directorycreateerror' => 'Could not create directory "$1".',
 'filenotfound'         => 'Could not find file "$1".',
 'fileexistserror'      => 'Unable to write to file "$1": File exists.',
-'filereadonlyerror'    => 'Unable to modify the file "$1" because the file repository "$2" is in read-only mode.
-
-The administrator who locked it offered this explanation: "$3".',
 'unexpected'           => 'Unexpected value: "$1"="$2".',
 'formerror'            => 'Error: Could not submit form.',
 'badarticleerror'      => 'This action cannot be performed on this page.',
@@ -1039,6 +1036,11 @@ $2',
 'ns-specialprotected'  => 'Special pages cannot be edited.',
 'titleprotected'       => 'This title has been protected from creation by [[User:$1|$1]].
 The reason given is "\'\'$2\'\'".',
+'filereadonlyerror'    => 'Unable to modify the file "$1" because the file repository "$2" is in read-only mode.
+
+The administrator who locked it offered this explanation: "$3".',
+'invalidtitle-knownnamespace'   => 'Invalid title with namespace "$2" and text "$3"',
+'invalidtitle-unknownnamespace' => 'Invalid title with unknown namespace number $1 and text "$2"',
 
 # Virus scanner
 'virus-badscanner'     => "Bad configuration: Unknown virus scanner: ''$1''",
@@ -1372,7 +1374,8 @@ Custom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css
 'updated'                          => '(Updated)',
 'note'                             => "'''Note:'''",
 'previewnote'                      => "'''Remember that this is only a preview.'''
-Your changes have not yet been saved! [[#editform|→ Continue editing]]",
+Your changes have not yet been saved!",
+'continue-editing'                 => "Continue editing",
 'previewconflict'                  => 'This preview reflects the text in the upper text editing area as it will appear if you choose to save.',
 'session_fail_preview'             => "'''Sorry! We could not process your edit due to a loss of session data.'''
 Please try again.
@@ -1399,7 +1402,7 @@ You will have to merge your changes into the existing text.
 '''Only''' the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
 'yourtext'                         => 'Your text',
 'storedversion'                    => 'Stored revision',
-'nonunicodebrowser'                => "'''Warning: Your browser is not unicode compliant.'''
+'nonunicodebrowser'                => "'''Warning: Your browser is not Unicode compliant.'''
 A workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
 'editingold'                       => "'''Warning: You are editing an out-of-date revision of this page.'''
 If you save it, any changes made since this revision will be lost.",
@@ -1477,6 +1480,12 @@ These arguments have been omitted.",
 'parser-template-loop-warning'            => 'Template loop detected: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Template recursion depth limit exceeded ($1)',
 'language-converter-depth-warning'        => 'Language converter depth limit exceeded ($1)',
+'node-count-exceeded-category'            => 'Pages where node-count is exceeded',
+'node-count-exceeded-warning'             => 'Page exceeded the node-count',
+'expansion-depth-exceeded-category'       => 'Pages where expansion depth is exceeded',
+'expansion-depth-exceeded-warning'        => 'Page exceeded the expansion depth',
+'parser-unstrip-loop-warning'             => 'Unstrip loop detected',
+'parser-unstrip-recursion-limit'          => 'Unstrip recursion limit exceeded ($1)',
 
 # "Undo" feature
 'undo-success' => 'The edit can be undone.
@@ -1626,7 +1635,7 @@ Please check the logs.',
 # Suppression log
 'suppressionlog'     => 'Suppression log',
 'suppressionlogtext' => 'Below is a list of deletions and blocks involving content hidden from administrators.
-See the [[Special:BlockList|IP block list]] for the list of currently operational bans and blocks.',
+See the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.',
 
 # History merging
 'mergehistory'                     => 'Merge page histories',
@@ -2282,7 +2291,6 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'backend-fail-contenttype'   => 'Could not determine the content type of the file to store at "$1".',
 'backend-fail-batchsize'     => 'Storage backend given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
 
-# File journal
 'filejournal-fail-dbconnect' => 'Could not connect to the journal database for storage backend "$1".',
 'filejournal-fail-dbquery'   => 'Could not update the journal database for storage backend "$1".',
 
@@ -2343,6 +2351,7 @@ For optimal security, img_auth.php is disabled.',
 'http-curl-error'       => 'Error fetching URL: $1',
 'http-host-unreachable' => 'Could not reach URL.',
 'http-bad-status'       => 'There was a problem during the HTTP request: $1 $2',
+'http-truncated-body'   => 'The request body was only partially received.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6'       => 'Could not reach URL',
@@ -2508,7 +2517,7 @@ Remember to check for other links to the templates before deleting them.',
 'disambiguationspage'     => 'Template:disambig',
 'disambiguations-text'    => "The following pages link to a '''disambiguation page'''.
 They should link to the appropriate topic instead.<br />
-A page is treated as disambiguation page if it uses a template which is linked from [[MediaWiki:Disambiguationspage]]",
+A page is treated as disambiguation page if it uses a template which is linked from [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects'                   => 'Double redirects',
 'doubleredirects-summary'           => '', # do not translate or duplicate this message to other languages
@@ -2653,25 +2662,30 @@ You can narrow down the view by selecting a log type, the username (case-sensiti
 'log-title-wildcard'   => 'Search titles starting with this text',
 
 # Special:AllPages
-'allpages'          => 'All pages',
-'allpages-summary'  => '', # do not translate or duplicate this message to other languages
-'alphaindexline'    => '$1 to $2',
-'nextpage'          => 'Next page ($1)',
-'prevpage'          => 'Previous page ($1)',
-'allpagesfrom'      => 'Display pages starting at:',
-'allpagesto'        => 'Display pages ending at:',
-'allarticles'       => 'All pages',
-'allinnamespace'    => 'All pages ($1 namespace)',
-'allnotinnamespace' => 'All pages (not in $1 namespace)',
-'allpagesprev'      => 'Previous',
-'allpagesnext'      => 'Next',
-'allpagessubmit'    => 'Go',
-'allpagesprefix'    => 'Display pages with prefix:',
-'allpagesbadtitle'  => 'The given page title was invalid or had an inter-language or inter-wiki prefix.
+'allpages'                => 'All pages',
+'allpages-summary'        => '', # do not translate or duplicate this message to other languages
+'alphaindexline'          => '$1 to $2',
+'nextpage'                => 'Next page ($1)',
+'prevpage'                => 'Previous page ($1)',
+'allpagesfrom'            => 'Display pages starting at:',
+'allpagesto'              => 'Display pages ending at:',
+'allarticles'             => 'All pages',
+'allinnamespace'          => 'All pages ($1 namespace)',
+'allnotinnamespace'       => 'All pages (not in $1 namespace)',
+'allpagesprev'            => 'Previous',
+'allpagesnext'            => 'Next',
+'allpagessubmit'          => 'Go',
+'allpagesprefix'          => 'Display pages with prefix:',
+'allpagesbadtitle'        => 'The given page title was invalid or had an inter-language or inter-wiki prefix.
 It may contain one or more characters which cannot be used in titles.',
-'allpages-bad-ns'   => '{{SITENAME}} does not have namespace "$1".',
+'allpages-bad-ns'         => '{{SITENAME}} does not have namespace "$1".',
 'allpages-hide-redirects' => 'Hide redirects',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'You are viewing a cached version of this page, which can be up to $1 old.',
+'cachedspecial-viewing-cached-ts' => 'You are viewing a cached version of this page, which might not be completely actual.',
+'cachedspecial-refresh-now' => 'View latest.',
+
 # Special:Categories
 'categories'                    => 'Categories',
 'categories-summary'            => '', # do not translate or duplicate this message to other languages
@@ -3137,7 +3151,7 @@ Fill in a specific reason below (for example, citing particular pages that were
 'badipaddress'                    => 'Invalid IP address',
 'blockipsuccesssub'               => 'Block succeeded',
 'blockipsuccesstext'              => '[[Special:Contributions/$1|$1]] has been blocked.<br />
-See [[Special:BlockList|IP block list]] to review blocks.',
+See the [[Special:BlockList|block list]] to review blocks.',
 'ipb-blockingself'                => 'You are about to block yourself!  Are you sure you want to do that?',
 'ipb-confirmhideuser'             => 'You are about to block a user with "hide user" enabled.  This will suppress the user\'s name in all lists and log entries.  Are you sure you want to do that?',
 'ipb-edit-dropdown'               => 'Edit block reasons',
@@ -3175,7 +3189,7 @@ See [[Special:BlockList|IP block list]] to review blocks.',
 'createaccountblock'              => 'account creation blocked',
 'emailblock'                      => 'e-mail blocked',
 'blocklist-nousertalk'            => 'cannot edit own talk page',
-'ipblocklist-empty'               => 'The blocklist is empty.',
+'ipblocklist-empty'               => 'The block list is empty.',
 'ipblocklist-no-results'          => 'The requested IP address or username is not blocked.',
 'blocklink'                       => 'block',
 'unblocklink'                     => 'unblock',
@@ -3193,7 +3207,7 @@ The suppress log is provided below for reference:',
 'reblock-logentry'                => 'changed block settings for [[$1]] with an expiry time of $2 $3',
 'blocklogtext'                    => 'This is a log of user blocking and unblocking actions.
 Automatically blocked IP addresses are not listed.
-See the [[Special:BlockList|IP block list]] for the list of currently operational bans and blocks.',
+See the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.',
 'unblocklogentry'                 => 'unblocked $1',
 'block-log-flags-anononly'        => 'anonymous users only',
 'block-log-flags-nocreate'        => 'account creation disabled',
@@ -4618,6 +4632,14 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'version-software'              => 'Installed software',
 'version-software-product'      => 'Product',
 'version-software-version'      => 'Version',
+'version-entrypoints'           => 'Entry point URLs',
+'version-entrypoints-header-entrypoint' => 'Entry point',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
+'version-entrypoints-index-php' => '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+'version-entrypoints-api-php'   => '[https://www.mediawiki.org/wiki/Manual:api.php api.php]',
+'version-entrypoints-load-php'  => '[https://www.mediawiki.org/wiki/Manual:load.php load.php]',
 
 # Special:FilePath
 'filepath'         => 'File path',
@@ -4832,4 +4854,15 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'api-error-uploaddisabled'                => 'Uploading is disabled on this wiki.',
 'api-error-verification-error'            => 'This file might be corrupt, or have the wrong extension.',
 
+# Durations
+'duration-seconds'   => '$1 {{PLURAL:$1|second|seconds}}',
+'duration-minutes'   => '$1 {{PLURAL:$1|minute|minutes}}',
+'duration-hours'     => '$1 {{PLURAL:$1|hour|hours}}',
+'duration-days'      => '$1 {{PLURAL:$1|day|days}}',
+'duration-weeks'     => '$1 {{PLURAL:$1|week|weeks}}',
+'duration-years'     => '$1 {{PLURAL:$1|year|years}}',
+'duration-decades'   => '$1 {{PLURAL:$1|decade|decades}}',
+'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
 );
index 574a21f..b9550c5 100644 (file)
@@ -24,6 +24,7 @@
  * @author Michawiki
  * @author Mihxil
  * @author MinuteElectron
+ * @author Objectivesea
  * @author Omnipaedista
  * @author Pedroca cerebral
  * @author Petrus Adamus
@@ -298,7 +299,7 @@ $magicWords = array(
        'url_query'               => array( '0', 'INFORMPETO', 'QUERY' ),
 );
 
-$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $datePreferences = false;
 $defaultDateFormat = 'dmy';
@@ -533,12 +534,12 @@ $messages = array(
 'jumpto' => 'Iri al:',
 'jumptonavigation' => 'navigado',
 'jumptosearch' => 'serĉi',
-'view-pool-error' => 'Bedaŭrinde la serviloj estas tro uzata ĉi-momente.
+'view-pool-error' => 'Bedaŭrinde la serviloj estas tro uzataj ĉi-momente.
 Tro da uzantoj provas vidi ĉi tiun paĝon.
-Bonvolu atendi iom antaŭ vi provas atingi ĝin denove.
+Bonvolu atendi iom antaŭ provi atingi ĝin denove.
 
 $1',
-'pool-timeout' => 'Tempolimo atingis atendante ŝlosadon',
+'pool-timeout' => 'Tempolimo atingita dum atendo de ŝlosado',
 'pool-queuefull' => 'Atendovico de servilaro estas plena.',
 'pool-errorunknown' => 'Nekonata eraro',
 
@@ -988,7 +989,8 @@ La lasta protokolero estas jene montrata por via referenco:',
 Rememoru ke individuaj .css-aj kaj .js-aj paĝoj uzas minusklan titolon, ekz. {{ns:user}}:Foo/vector.css kontraŭe al {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Ŝanĝo registrita)',
 'note' => "'''Noto:'''",
-'previewnote' => "'''Memoru, ke ĉi tio estas nur antaŭrigardo kaj ankoraŭ ne konservita!'''",
+'previewnote' => "'''Memoru, ke ĉi tio estas nur antaŭrigardo.''' 
+Viaj ŝanĝoj ne ankoraŭ estas konservitaj!",
 'previewconflict' => 'La jena antaŭrigardo montras la tekston el la supra tekstujo,
 kiel ĝi aperos se vi elektos konservi la paĝon.',
 'session_fail_preview' => "'''Ni ne povas procezi vian redakton pro perdo de seancaj datenoj.
@@ -1005,6 +1007,7 @@ La redakto estis malpermesita por preventi koruptado de la teksto de la paĝo.
 Ĉi tiel malofte okazas kiam vi uzas fuŝan TTT-an anoniman prokurilon.'''",
 'edit_form_incomplete' => "'''Kelkaj partoj de la redaktada formo ne atingis la servilon; rekontrolu ke via redakto estas ĝusta kaj reprovu.'''",
 'editing' => 'Redaktado de $1',
+'creating' => 'Kreado de $1',
 'editingsection' => 'Redaktante $1 (sekcion)',
 'editingcomment' => 'Redaktante $1 (nova sekcio)',
 'editconflict' => 'Redakta konflikto: $1',
@@ -2957,6 +2960,41 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'tooltip-preferences-save' => 'Konservi preferojn',
 'tooltip-summary' => 'Enigu mallongan resumon',
 
+# Stylesheets
+'common.css' => '/* La jena CSS influos la aspekton de ĉiaj temoj. */',
+'standard.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Klasika temo. */',
+'nostalgia.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Nostalgia temo. */',
+'cologneblue.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Kolonja Blua temo. */',
+'monobook.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Libreja temo. */',
+'myskin.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Miŝela temo. */',
+'chick.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Kokida temo. */',
+'simple.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Simpla temo. */',
+'modern.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Moderna temo. */',
+'vector.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Vektora temo. */',
+'print.css' => '/* La jena CSS influos la prezentadon de la presaĵo. */',
+'handheld.css' => '/* La jena CSS influos manpremitajn komputilojn sur bazo de la temo kiu arangiĝis en $wgHandheldStyle. */',
+'noscript.css' => '/* La jena CSS influos uzantojn, kiuj desebligis Ĝavaskripton. */',
+'group-autoconfirmed.css' => '/* La jena CSS sole influos auxtokonfirmatajn uzantojn. */',
+'group-bot.css' => '/* La jena CSS sole influos robotojn. */',
+'group-sysop.css' => '/* La jena CSS sole influos administrantojn. */',
+'group-bureaucrat.css' => '/* La jena CSS sole influos burokratojn. */',
+
+# Scripts
+'common.js' => '/* La jena Ĝavaskripto ŝargiĝos por ĉiaj uzantoj ĉe ĉiu paĝoŝargado. */',
+'standard.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Klasika temo. */',
+'nostalgia.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Nostalgia temo. */',
+'cologneblue.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kolonja Blua temo. */',
+'monobook.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Libreja temo. */',
+'myskin.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Miŝela temo. */',
+'chick.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kokida temo. */',
+'simple.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Simpla temo. */',
+'modern.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Moderna temo. */',
+'vector.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Vektora temo. */',
+'group-autoconfirmed.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por auxtokonfirmataj uzantoj. */',
+'group-bot.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por robotoj. */',
+'group-sysop.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por administrantoj. */',
+'group-bureaucrat.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por burokratoj. */',
+
 # Metadata
 'notacceptable' => 'La viki-servilo ne povas doni datumon en formato kiun via kliento povas legi.',
 
@@ -2995,11 +3033,15 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'pageinfo-viewsperedit' => 'Po rigardoj por redakto',
 
 # Skin names
-'skinname-standard' => 'Klasika',
+'skinname-standard' => 'Klasiko',
 'skinname-nostalgia' => 'Nostalgio',
 'skinname-cologneblue' => 'Kolonja Bluo',
 'skinname-monobook' => 'Librejo',
+'skinname-myskin' => 'Miŝelo',
 'skinname-chick' => 'Kokido',
+'skinname-simple' => 'Simplo',
+'skinname-modern' => 'Moderno',
+'skinname-vector' => 'Vektoro',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marki kiel patrolitan',
index c36f13b..a4bdfdc 100644 (file)
@@ -41,6 +41,7 @@
  * @author Hercule
  * @author Icvav
  * @author Imre
+ * @author Invadinado
  * @author Jatrobat
  * @author Jens Liebenau
  * @author Jurock
@@ -365,15 +366,15 @@ $messages = array(
 'tog-previewontop' => 'Mostrar previsualización antes del cuadro de edición',
 'tog-previewonfirst' => 'Mostrar previsualización en la primera edición',
 'tog-nocache' => 'Desactivar la caché de páginas del navegador',
-'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando una página en mi lista de seguimiento sea modificada',
-'tog-enotifusertalkpages' => 'Enviarme un correo electrónico cuando mi página de discusión sea modificada',
+'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando se modifique una página en mi lista de seguimiento',
+'tog-enotifusertalkpages' => 'Enviarme un correo electrónico cuando se modifique mi página de discusión',
 'tog-enotifminoredits' => 'Notificarme también los cambios menores de páginas',
 'tog-enotifrevealaddr' => 'Revelar mi dirección de correo electrónico en los correos de notificación',
 'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
 'tog-oldsig' => 'Firma actual:',
 'tog-fancysig' => 'Tratar firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos pues necesitas ajustes especiales en tu ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos pues necesitas ajustes especiales en tu ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
+'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
 'tog-showjumplinks' => 'Habilitar enlaces de accesibilidad «saltar a»',
 'tog-uselivepreview' => 'Usar live preview (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Alertar al grabar sin resumen de edición.',
@@ -461,7 +462,7 @@ $messages = array(
 'category-empty' => "''La categoría no contiene actualmente ningún artículo o archivo multimedia.''",
 'hidden-categories' => '{{PLURAL:$1|Categoría escondida|Categorías escondidas}}',
 'hidden-category-category' => 'Categorías ocultas',
-'category-subcat-count' => '{{PLURAL:$2|Esta categoría comprende solamente la siguiente categoría.|Esta categoría incluye {{PLURAL:$1|la siguiente categorías|las siguientes $1 subcategorías}}, de un total de $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Esta categoría solo contiene la siguiente subcategoría.|Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}, de un total de $2.}}',
 'category-subcat-count-limited' => 'Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}.',
 'category-article-count' => '{{PLURAL:$2|Esta categoría incluye solamente la siguiente página.|{{PLURAL:$1|La siguiente página página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría, de un total de $2.}}',
 'category-article-count-limited' => '{{PLURAL:$1|La siguiente página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría.',
@@ -469,12 +470,12 @@ $messages = array(
 'category-file-count-limited' => '{{PLURAL:$1|El siguiente fichero pertenece|Los siguientes $1 ficheros pertenecen}} a esta categoría.',
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
-'noindex-category' => 'Páginas no indizadas',
+'noindex-category' => 'Páginas no indexadas',
 'broken-file-category' => 'Páginas con enlaces rotos a archivos',
 
 'about' => 'Acerca de',
 'article' => 'Artículo',
-'newwindow' => '(Se abre en una ventana nueva)',
+'newwindow' => '(se abre en una ventana nueva)',
 'cancel' => 'Cancelar',
 'moredotdotdot' => 'Más...',
 'mypage' => 'Mi página',
@@ -834,7 +835,7 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
 'login-throttled' => 'Has intentado demasiadas veces iniciar sesión. Por favor espera antes de intentarlo nuevamente.',
 'login-abort-generic' => 'Tu inicio de sesión no fue exitoso - Cancelado',
 'loginlanguagelabel' => 'Idioma: $1',
-'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada debido a que parece que ésta ha sido enviada desde un navegador defectuoso o un proxy caché.',
+'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.',
 
 # E-mail sending
 'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP',
@@ -942,7 +943,7 @@ Contraseña temporal: $2',
 Tu dirección IP se almacenará en el historial de ediciones de la página.",
 'anonpreviewwarning' => "''No has iniciado sesión con una cuenta de usuario. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de la página.''",
 'missingsummary' => "'''Atención:''' No has escrito un resumen de edición. Si haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
-'missingcommenttext' => 'Por favor introduce texto debajo.',
+'missingcommenttext' => 'Por favor, introduce un texto debajo.',
 'missingcommentheader' => "'''Recordatorio:''' No has escrito un título para este comentario. Si haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
 'summary-preview' => 'Previsualización del resumen:',
 'subject-preview' => 'Previsualización del tema/título:',
@@ -1025,7 +1026,8 @@ La última entrada del registro de bloqueos se proporciona debajo para mayor ref
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''¡Recuerda que esto es solo una previsualización.'''
-¡Tus cambios aún no se ha guardado! [[#editform|→ Continuar editando]]",
+¡Tus cambios aún no se ha guardado!",
+'continue-editing' => 'Continuar editando',
 'previewconflict' => 'Esta previsualización refleja el texto en el área de edición superior como aparecerá una vez guardados los cambios.',
 'session_fail_preview' => "'''Lo sentimos, no pudimos procesar la edición debido a una pérdida de los datos de sesión.'''
 Por favor, inténtalo de nuevo.
@@ -1096,7 +1098,7 @@ El registro de borrado y traslados para esta página están provistos aquí por
 El registro de borrados y traslados para la página están provistos debajo como referencia.',
 'log-fulllog' => 'Ver el registro completo',
 'edit-hook-aborted' => 'Edición cancelada por la extensión.
-No dió explicaciones.',
+No se aportaron explicaciones.',
 'edit-gone-missing' => 'No se pudo actualizar la página.
 Parece que ha sido borrada.',
 'edit-conflict' => 'Conflicto de edición.',
@@ -1119,6 +1121,10 @@ Ese o esos parámetros han sido omitidos.',
 'parser-template-loop-warning' => 'Detectado bucle de plantilla: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Se ha excedido el límite de recursión de plantillas ($1)',
 'language-converter-depth-warning' => 'El límite de profundidad del convertidor de idioma ha excedido ($1)',
+'node-count-exceeded-category' => 'Páginas donde se supera el número de nodos',
+'node-count-exceeded-warning' => 'Página que ha superado el número de nodos',
+'expansion-depth-exceeded-category' => 'Páginas donde se supera la profundidad de expansión',
+'expansion-depth-exceeded-warning' => 'Página que ha superado la profundidad de expansión',
 
 # "Undo" feature
 'undo-success' => 'La edición puede deshacerse. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así deshacer la edición.',
@@ -1262,8 +1268,8 @@ No tiene acceso a él.',
 
 # Suppression log
 'suppressionlog' => 'Registro de supresiones',
-'suppressionlogtext' => 'Debajo hay una lista con los borrados y bloqueos recientes cuyo contenido se encuentra oculto para administradores.
-Mire la [[Special:BlockList|lista de bloqueos activos]] para ver la lista de bloqueos actualmente operativos.',
+'suppressionlogtext' => 'A continuación hay una lista con los borrados y bloqueos cuyo contenido se encuentra oculto para los administradores.
+Ver la [[Special:BlockList|lista de bloqueos]] que incluye las prohibiciones y bloqueos actualmente operativos.',
 
 # History merging
 'mergehistory' => 'Fusionar historiales de páginas',
@@ -2191,6 +2197,11 @@ Puedes filtrar la vista seleccionando un tipo de registro, el nombre del usuario
 'allpages-bad-ns' => '{{SITENAME}} no tiene un espacio de nombres llamado «$1».',
 'allpages-hide-redirects' => 'Ocultar redirecciones',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Usted está viendo una versión en caché de esta página, que puede tener hasta  $1 días de antigüedad.',
+'cachedspecial-viewing-cached-ts' => 'Está viendo una versión en caché de esta página, que puede no estar completamente actualizada.',
+'cachedspecial-refresh-now' => 'Ver lo más reciente.',
+
 # Special:Categories
 'categories' => 'Categorías',
 'categoriespagetext' => 'Las siguientes {{PLURAL:$1|categoría contiene|categorías contienen}} páginas o medios.
@@ -2675,9 +2686,9 @@ Véase la [[Special:BlockList|lista de bloqueos]] para revisarlo.',
 'blocklog-showsuppresslog' => 'Este usuario ha sido bloqueado y ocultado. Se provee el registro de supresiones para más detalle:',
 'blocklogentry' => 'bloqueó a [[$1]] $3 durante un plazo de $2',
 'reblock-logentry' => 'cambió el bloqueo para  [[$1]] con una caducidad de $2 $3',
-'blocklogtext' => 'Esto es un registro de bloqueos y desbloqueos de usuarios.
-Las direcciones bloqueadas automáticamente no aparecen aquí.
-Consulte la [[Special:BlockList|lista de direcciones IP bloqueadas]] para ver la lista de bloqueos vigente.',
+'blocklogtext' => 'Esto es un registro de acciones de bloqueo y desbloqueo de usuarios.
+Las direcciones IP bloqueadas automáticamente no aparecen aquí.
+Consulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueos y prohibiciones de operar en vigor.',
 'unblocklogentry' => 'desbloqueó a $1',
 'block-log-flags-anononly' => 'sólo anónimos',
 'block-log-flags-nocreate' => 'desactivada la creación de cuentas',
@@ -3769,6 +3780,11 @@ Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública
 'version-software' => 'Software instalado',
 'version-software-product' => 'Producto',
 'version-software-version' => 'Versión',
+'version-entrypoints' => 'URL del punto de entrada',
+'version-entrypoints-header-entrypoint' => 'Punto de entrada',
+'version-entrypoints-header-url' => 'Dirección URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta del artículo]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]',
 
 # Special:FilePath
 'filepath' => 'Ruta de archivo',
@@ -3959,4 +3975,15 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'api-error-uploaddisabled' => 'Las subidas están desactivadas en este wiki.',
 'api-error-verification-error' => 'Este archivo puede estar dañado, o tiene una extensión incorrecta.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minutos}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|horas}}',
+'duration-days' => '$1 {{PLURAL:$1|día|días}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semana|semanas}}',
+'duration-years' => '$1 {{PLURAL: $1|año|años}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décadas}}',
+'duration-centuries' => '$1 {{PLURAL:$1|siglo|siglos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
+
 );
index 1da6573..80ed167 100644 (file)
@@ -952,7 +952,8 @@ Allpool on toodud viimane blokeerimislogi sissekanne:',
 'updated' => '(Värskendatud)',
 'note' => "'''Meeldetuletus:'''",
 'previewnote' => "'''Ära unusta, et see on kõigest eelvaade!'''
-Sinu muudatused pole veel salvestatud! [[#editform|→ Jätka redigeerimist]]",
+Sinu muudatused pole veel salvestatud!",
+'continue-editing' => 'Jätka redigeerimist',
 'previewconflict' => 'See eelvaade näitab, kuidas ülemises toimetuskastis olev tekst hakkab välja nägema, kui otsustate salvestada.',
 'session_fail_preview' => "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''
 Palun proovi uuesti.
@@ -1187,7 +1188,7 @@ Palun vaata logisid.',
 # Suppression log
 'suppressionlog' => 'Varjamislogi',
 'suppressionlogtext' => 'Allpool on nimekiri kustutamistest ja blokeeringutest, millega kaasneb administraatorite eest sisu varjamine.
-Jõus olevad keelud ja blokeeringud leiad [[Special:BlockList|blokeeritud IP-aadresside loendist]].',
+Jõus olevad keelud ja blokeeringud leiad [[Special:BlockList|blokeerimisnimekirja]].',
 
 # History merging
 'mergehistory' => 'Ühenda lehtede ajalood',
@@ -2111,6 +2112,11 @@ See võib sisaldada üht või enamat märki, mida ei saa pealkirjades kasutada.'
 'allpages-bad-ns' => '{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimeruumi "$1".',
 'allpages-hide-redirects' => 'Peida ümbersuunamised',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Vaata vahemälus olevat lehekülje versiooni, mis võib olla kuni $1 vanune.',
+'cachedspecial-viewing-cached-ts' => 'Vaatad vahemälus olevat lehekülje versiooni, mis ei pruugi olla täiesti ajakohane.',
+'cachedspecial-refresh-now' => 'Vaata uusimat versiooni.',
+
 # Special:Categories
 'categories' => 'Kategooriad',
 'categoriespagetext' => 'Vikis on {{PLURAL:$1|järgmine kategooria|järgmised kategooriad}}.
@@ -2423,7 +2429,7 @@ Sellisel juhul tuleb uusima kustutatud redaktsiooni juurest linnuke eemaldada v
 'undeletehistorynoadmin' => 'See lehekülg on kustutatud.
 Kustutamise põhjus ning selle lehekülje kustutamiseelne redigeerimislugu on näha allolevas kokkuvõttes.
 Lehekülje kustutamiseelsed redaktsioonid on kättesaadavad ainult administraatoritele.',
-'undelete-revision' => 'Lehekülje $1 kustutatud redaktsioonid, mille autor on $3, seisuga $4 kell $5.',
+'undelete-revision' => 'Lehekülje $1 kustutatud redaktsioon, mille autor on $3, seisuga $4, kell $5.',
 'undeleterevision-missing' => 'Vigane või puuduv redaktsioon.
 Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist eemaldatud.',
 'undelete-nodiff' => 'Varasemat redaktsiooni ei leidunud.',
@@ -2551,7 +2557,7 @@ Täida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.',
 'badipaddress' => 'Vigane IP-aadress',
 'blockipsuccesssub' => 'Blokeerimine õnnestus',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] on blokeeritud.<br />
-Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeeringute loendist]].',
+Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeerimisnimekirjast]].',
 'ipb-blockingself' => 'Sa blokeerid iseenda! Kas tahad tõesti seda teha?',
 'ipb-confirmhideuser' => 'Avaldasid soovi kasutaja blokeerida ja peita. Kasutaja nimi peidetakse kõigist loenditest ja logisissekannetest. Kas oled kindel, et soovid seda teha?',
 'ipb-edit-dropdown' => 'Muuda blokeeringu põhjuseid',
@@ -2601,7 +2607,9 @@ Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeeringute loendist]].',
 'blocklog-showsuppresslog' => 'See kasutaja on varem blokeeritud ja peidetud. Allpool on toodud varjamislogi:',
 'blocklogentry' => 'blokeeris kasutaja [[$1]]. Blokeeringu aegumistähtaeg on $2 $3',
 'reblock-logentry' => 'muutis kasutaja või IP-aadressi [[$1]] blokeeringu sätteid. Blokeering aegumistähtaeg: $2. Põhjus: $3',
-'blocklogtext' => 'See on kasutajate blokeerimiste ja blokeeringute eemaldamiste nimekiri. Automaatselt blokeeritud IP aadresse siin ei näidata. Hetkel aktiivsete blokeeringute ja redigeerimiskeeldude nimekirja vaata [[Special:BlockList|IP blokeeringute nimekirja]] leheküljelt.',
+'blocklogtext' => 'See on kasutajate blokeerimiste ja blokeeringute eemaldamiste logi.
+Automaatselt blokeeritud IP-aadresse siin ei näidata.
+Praegu jõus olevad blokeeringud ja redigeerimiskeelud leiad [[Special:BlockList|blokeerimisnimekirjast]].',
 'unblocklogentry' => 'eemaldas kasutaja $1 blokeeringu',
 'block-log-flags-anononly' => 'ainult anonüümsed kasutajad',
 'block-log-flags-nocreate' => 'kontode loomine on blokeeritud',
@@ -3328,11 +3336,11 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-flash-return-0' => 'ei ole välgu peegeldumist tuvastavat funktsiooni',
 'exif-flash-return-2' => 'välgu peegeldust ei tuvastatud',
 'exif-flash-return-3' => 'tuvastati välgu peegeldus',
-'exif-flash-mode-1' => 'sund välk',
+'exif-flash-mode-1' => 'sundvälk',
 'exif-flash-mode-2' => 'välk keelatud',
 'exif-flash-mode-3' => 'automaatne töörežiim',
 'exif-flash-function-1' => 'Välgu funktsiooni ei ole',
-'exif-flash-redeye-1' => 'Punasilmsust vähendav reziim',
+'exif-flash-redeye-1' => 'punasilmsust vähendav režiim',
 
 'exif-focalplaneresolutionunit-2' => 'toll',
 
@@ -3423,6 +3431,9 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-gpsdirection-t' => 'Tegelik suund',
 'exif-gpsdirection-m' => 'Magneetiline suund',
 
+'exif-ycbcrpositioning-1' => 'Keskele asetatud',
+'exif-ycbcrpositioning-2' => 'Kõrvuti asetatud',
+
 'exif-dc-contributor' => 'Asjaosalised',
 'exif-dc-coverage' => 'Teabevahendi ruumiline või ajaline ulatus',
 'exif-dc-date' => 'Kuupäevad',
@@ -3644,6 +3655,9 @@ GNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks
 'version-software' => 'Paigaldatud tarkvara',
 'version-software-product' => 'Toode',
 'version-software-version' => 'Versioon',
+'version-entrypoints' => 'Sisendpunktide internetiaadressid',
+'version-entrypoints-header-entrypoint' => 'Sisendpunkt',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Failitee',
@@ -3832,4 +3846,15 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 'api-error-uploaddisabled' => 'Üleslaadimine on selles vikis keelatud.',
 'api-error-verification-error' => 'See fail võib olla rikutud või vale laiendiga.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekundi}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuti}}',
+'duration-hours' => '$1 {{PLURAL:$1|tunni}}',
+'duration-days' => '$1 {{PLURAL:$1|päeva}}',
+'duration-weeks' => '$1 {{PLURAL:$1|nädala}}',
+'duration-years' => '$1 {{PLURAL:$1|aasta}}',
+'duration-decades' => '$1 {{PLURAL:$1|kümnendi}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sajandi}}',
+'duration-millennia' => '$1 {{PLURAL:$1|aastatuhande}}',
+
 );
index bdba52b..3e8154d 100644 (file)
@@ -444,7 +444,7 @@ $messages = array(
 'tog-editsection' => 'ویرایش بخش‌ها از طریق پیوندهای [ویرایش] فعال باشد',
 'tog-editsectiononrightclick' => 'ویرایش بخش‌ها با کلیک راست روی عناوین قسمت‌ها فعال باشد (نیازمند جاوااسکریپت)',
 'tog-showtoc' => 'فهرست مندرجات نمایش یابد (برای صفحه‌های دارای بیش از ۳ عنوان)',
-'tog-rememberpassword' => 'گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\86 (تا Ø­Ø¯Ø§Ú©Ø«Ø± $1 {{PLURAL:$1|رÙ\88ز|رÙ\88ز}}) در این مرورگر به خاطر سپرده شود',
+'tog-rememberpassword' => 'گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\86 (حداکثر $1 Ø±Ù\88ز) در این مرورگر به خاطر سپرده شود',
 'tog-watchcreations' => 'صفحه‌هایی که می‌سازم به فهرست پی‌گیری‌هایم افزوده شود',
 'tog-watchdefault' => 'صفحه‌هایی که ویرایش می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
 'tog-watchmoves' => 'صفحه‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
@@ -453,10 +453,10 @@ $messages = array(
 'tog-previewontop' => 'پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد',
 'tog-previewonfirst' => 'پیش‌نمایش هنگام اولین ویرایش نمایش یابد',
 'tog-nocache' => 'حافظهٔ نهانی مرورگر از کار انداخته شود',
-'tog-enotifwatchlistpages' => 'اگر صفحه‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من نامه الکترونیکی فرستاده شود',
-'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه الکترونیکی فرستاده شود',
-'tog-enotifminoredits' => 'برای تغییرات جزئی در صفحه‌ها هم به من نامه الکترونیکی فرستاده شود',
-'tog-enotifrevealaddr' => 'نشانی پست الکترونیکی من را در نامه‌های اطلاع‌رسانی نمایش یابد',
+'tog-enotifwatchlistpages' => 'اگر صفحه‌ای از فهرست پی‌گیری‌هایم ویرایش شد برای من نامه‌ای فرستاده شود',
+'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه‌ای فرستاده شود',
+'tog-enotifminoredits' => 'برای تغییرات جزئی در صفحه‌ها هم به من نامه‌ای فرستاده شود',
+'tog-enotifrevealaddr' => 'نشانی رایانامهٔ من را در نامه‌های اطلاع‌رسانی نمایش یابد',
 'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده نمایش یابد',
 'tog-oldsig' => 'امضای کنونی:',
 'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)',
@@ -472,7 +472,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌های من پنهان شود',
 'tog-watchlisthidepatrolled' => 'ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها پنهان شود',
 'tog-nolangconversion' => 'تبدیل گویش‌ها غیرفعال شود',
-'tog-ccmeonemails' => 'رونوشتی از نامه‌های الکترونیکی که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود',
+'tog-ccmeonemails' => 'رونوشتی از نامه‌ای که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود',
 'tog-diffonly' => 'محتوای صفحه، زیر تفاوت نمایش داده نشود',
 'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
 'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
@@ -827,7 +827,7 @@ $2',
 دلیل ارائه‌شده این است: «''$2''».",
 'filereadonlyerror' => "تغییر پرونده «$1» ممکن نیست چون مخزن پرونده «$2» در حالت فقط خواندنی قرار دارد.
 
-دلیل ارائه شده چنین است: «''$3''».",
+مدیری که آن را قفل کرده چنین توضیحی را ذکر کرده:  ''$3''.",
 
 # Virus scanner
 'virus-badscanner' => "پیکربندی بد: پویشگر ویروس ناشناخته: ''$1''",
@@ -863,7 +863,7 @@ $2',
 'gotaccount' => "حساب کاربری دارید؟ '''$1'''.",
 'gotaccountlink' => 'وارد شوید',
 'userlogin-resetlink' => 'جزئیات ورود را فراموش کرده‌اید؟',
-'createaccountmail' => 'با پست الکترونیکی',
+'createaccountmail' => 'با رایانامه',
 'createaccountreason' => 'دلیل:',
 'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
 'userexists' => 'نام کاربری‌ای که وارد کردید قبلاً استفاده شده‌است.
@@ -896,7 +896,7 @@ $2',
 'passwordtooshort' => 'گذرواژه باید دست‌کم {{PLURAL:$1|$1 حرف|$1 حرف}} داشته باشد.',
 'password-name-match' => 'گذرواژهٔ شما باید با نام کاربری شما تفاوت داشته باشد.',
 'password-login-forbidden' => 'استفاده از این نام کاربری و گذرواژه ممنوع است.',
-'mailmypassword' => 'گذرواژهٔ جدید با پست الکترونیکی فرستاده شود',
+'mailmypassword' => 'گذرواژهٔ جدید با رایانامه فرستاده شود',
 'passwordremindertitle' => 'یادآور گذرواژهٔ {{SITENAME}}',
 'passwordremindertext' => 'یک نفر (احتمالاً خود شما، با نشانی آی‌پی $1) گذرواژهٔ جدیدی برای حساب کاربری‌ شما در {{SITENAME}} درخواست کرده‌است ($4). 
 یک گذرواژهٔ موقت برای کاربر «$2» ساخته شده و برابر با «$3» قرار داده شده‌است.
@@ -904,31 +904,31 @@ $2',
 گذرواژهٔ موقت شما ظرف {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.
 
 اگر کس دیگری این درخواست را کرده‌است یا اینکه شما گذرواژهٔ پیشین خود را به یاد آورده‌اید و دیگر تمایلی به تغییر آن ندارید، می‌توانید این پیغام را نادیده بگیرید و همان گذرواژهٔ پیشین را به کار برید.',
-'noemail' => 'هیچ نشانی پست الکترونیکی‌ای برای کاربر «$1» ثبت نشده‌است.',
-'noemailcreate' => 'باید یک نشانی پست الکترونیک معتبر وارد کنید',
-'passwordsent' => 'گذرÙ\88اÚ\98Ù\87â\80\8cاÛ\8c Ø¬Ø¯Û\8cد Ø¨Ù\87 Ù\86شاÙ\86Û\8c Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©Û\8c ثبت‌شده برای «$1» فرستاده شد.
+'noemail' => 'هیچ نشانی رایانامه‌ای برای کاربر «$1» ثبت نشده‌است.',
+'noemailcreate' => 'باید یک نشانی رایانامه معتبر وارد کنید',
+'passwordsent' => 'گذرÙ\88اÚ\98Ù\87â\80\8cاÛ\8c Ø¬Ø¯Û\8cد Ø¨Ù\87 Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87 ثبت‌شده برای «$1» فرستاده شد.
 لطفاً پس از دریافت آن دوباره به سامانه وارد شوید.',
 'blocked-mailpassword' => 'نشانی آی‌پی شما از ویرایش بازداشته شده‌است و از این رو به منظور جلوگیری از سوءاستفاده اجازهٔ بهره‌گیری از قابلیت بازیابی گذرواژه را ندارد.',
-'eauthentsent' => 'یک نامهٔ الکترونیکی برای تأیید نشانی پست الکترونیکی به نشانی موردنظر ارسال شد.
+'eauthentsent' => 'یک نامه برای تأیید نشانی رایانامه به نشانی موردنظر ارسال شد.
 قبل از اینکه نامهٔ دیگری قابل ارسال به این نشانی باشد، باید دستورهایی که در آن نامه آمده است را جهت تأیید این مساله که این نشانی متعلق به شماست، اجرا کنید.',
 'throttled-mailpassword' => 'یک یادآور گذرواژه در $1 {{PLURAL:$1|ساعت|ساعت}} گذشته برای شما فرستاده شده‌است.
 برای جلوگیری از سوءاستفاده هر  $1 ساعت تنها یک یادآوری فرستاده می‌شود.',
-'mailerror' => 'خطا در فرستادن پست الکترونیکی: $1',
+'mailerror' => 'خطا در فرستادن رایانامه: $1',
 'acct_creation_throttle_hit' => 'بازدیدکنندگان این ویکی که از نشانی آی‌پی شما استفاده می‌کنند در روز گذشته {{PLURAL:$1|یک حساب کاربری|$1 حساب کاربری}} ساخته‌اند، که بیشترین تعداد مجاز در آن بازهٔ زمانی است.
 به همین خاطر، بازدیدکنندگانی که از این نشانی آی‌پی استفاده می‌کنند نمی‌توانند در حال حاضر حساب جدیدی بسازند.',
-'emailauthenticated' => 'نشانی پست الکترونیکی شما در $2 ساعت $3 تصدیق شد.',
-'emailnotauthenticated' => 'نشانی پست الکترونیکی شما هنوز تصدیق نشده‌است.
-برای هیچ‌یک از ویژگی‌های زیر نامهٔ الکترونیکی ارسال نخواهد شد.',
-'noemailprefs' => 'برای راه‌اندازی این قابلیت‌ها یک نشانی پست الکترونیکی مشخص کنید.',
-'emailconfirmlink' => 'تأیید نشانی پست الکترونیکی',
-'invalidemailaddress' => 'نشانی واردشدهٔ پست الکترونیک قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است.
+'emailauthenticated' => 'نشانی رایانامه شما در $2 ساعت $3 تصدیق شد.',
+'emailnotauthenticated' => 'نشانی رایانامه شما هنوز تصدیق نشده‌است.
+برای هیچ‌یک از ویژگی‌های زیر رایانامه ارسال نخواهد شد.',
+'noemailprefs' => 'برای راه‌اندازی این قابلیت‌ها یک نشانی رایانامه مشخص کنید.',
+'emailconfirmlink' => 'تأیید نشانی رایانامه',
+'invalidemailaddress' => 'نشانی واردشدهٔ رایانامه قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است.
 لطفاً نشانی‌ای با ساختار صحیح وارد کنید و یا بخش مربوط را خالی بگذارید.',
-'cannotchangeemail' => 'نشانی‌های پست الکترونیکی حساب کاربری در این ویکی قابل تغییر نیست.',
+'cannotchangeemail' => 'نشانی‌های رایانامهٔ حساب کاربری در این ویکی قابل تغییر نیست.',
 'emaildisabled' => 'این وب‌گاه قادر به ارسال رایانامه نیست.',
 'accountcreated' => 'حساب کاربری ایجاد شد',
 'accountcreatedtext' => 'حساب کاربری $1 ایجاد شده‌است.',
 'createaccount-title' => 'ایجاد حساب کاربری در {{SITENAME}}',
-'createaccount-text' => 'یک نفر برای پست الکترونیک شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3
+'createaccount-text' => 'یک نفر برای رایانامه شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3
 شما باید به سامانه وارد شوید تا گذرواژهٔ خود را تغییر بدهید.
 
 اگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.',
@@ -941,7 +941,7 @@ $2',
 
 # E-mail sending
 'php-mail-error-unknown' => 'خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی',
-'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس پست الکترونیک.',
+'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
 
 # Change password dialog
 'resetpass' => 'تغییر گذرواژه',
@@ -971,9 +971,9 @@ $2',
 'passwordreset-pretext' => '{{PLURAL:$1||یکی از قطعه‌های داده را در زیر وارد کنید}}',
 'passwordreset-username' => 'نام کاربری:',
 'passwordreset-domain' => 'دامنه:',
-'passwordreset-capture' => 'پست الکترونیکی نهایی نشان داده شود؟',
-'passwordreset-capture-help' => 'اگر این گزینه را علامت بزنید پست الکترونیکی (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.',
-'passwordreset-email' => 'نشانی پست الکترونیک:',
+'passwordreset-capture' => 'رایانامهٔ نهایی نشان داده شود؟',
+'passwordreset-capture-help' => 'اگر این گزینه را علامت بزنید رایانامهٔ (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.',
+'passwordreset-email' => 'نشانی رایانامه:',
 'passwordreset-emailtitle' => 'جزئیات حساب در {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'شخصی (احتمالاً شما، با نشانی آی‌پی $1) درخواست یادآوری جزئیات حساب کاربریتان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این رایانشانی مرتبط هستند:
 
@@ -991,18 +991,18 @@ $2
 'passwordreset-emailelement' => 'نام کاربری: $1
 گذرواژهٔ موقت: $2',
 'passwordreset-emailsent' => 'یک نامهٔ یادآور فرستاده شده است.',
-'passwordreset-emailsent-capture' => 'پست الکترونیکی یادآور فرستاده شد، که به شرح زیر است.',
-'passwordreset-emailerror-capture' => 'پست الکترونیکی یادآور همانطور که در زیر مشاهده‌ می‌فرمایید ایجاد شد ولی ارسال آن به کاربر موفقیت‌آمیز نبود: $1',
+'passwordreset-emailsent-capture' => 'رایانامهٔ یادآور فرستاده شد، که به شرح زیر است.',
+'passwordreset-emailerror-capture' => 'رایانامهٔ یادآور همانطور که در زیر مشاهده‌ می‌فرمایید ایجاد شد ولی ارسال آن به کاربر موفقیت‌آمیز نبود: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'تغÛ\8cÛ\8cر Ø¢Ø¯Ø±Ø³ Ù¾Ø³Øª Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©',
+'changeemail' => 'تغÛ\8cÛ\8cر Ø¢Ø¯Ø±Ø³ Ù¾Ø³Øª Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87',
 'changeemail-header' => 'تغییر آدرس ایمیل حساب کاربری',
-'changeemail-text' => 'این فرم را تکمیل کنید تا آدرس پست الکترونیکی‌تان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.',
+'changeemail-text' => 'این فرم را تکمیل کنید تا آدرس رایانامه‌تان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.',
 'changeemail-no-info' => 'برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.',
-'changeemail-oldemail' => 'نشانی پست الکترونیکی کنونی:',
-'changeemail-newemail' => 'نشانی پست الکترونیکی جدید:',
+'changeemail-oldemail' => 'نشانی رایانامهٔ کنونی:',
+'changeemail-newemail' => 'نشانی رایانامهٔ جدید:',
 'changeemail-none' => '(هیچ)',
-'changeemail-submit' => 'تغییر پست الکترونیکی',
+'changeemail-submit' => 'تغییر رایانامه',
 'changeemail-cancel' => 'انصراف',
 
 # Edit page toolbar
@@ -1056,7 +1056,7 @@ $2
 * کاربری که قطع دسترسی‌اش مد نظر بوده‌است: $7
 
 شما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
-توجه کنید که شما نمی‌توانید از ویژگی «فرستادن پست الکترونیکی به این کاربر» استفاده کنید مگر آنکه نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات کاربری]]‌تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]]‌تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
 نشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
 لطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
 'autoblockedtext' => "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.
@@ -1070,13 +1070,13 @@ $2
 
 شما می‌توانید با $1 یا یکی دیگر از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرید، تا پیرامون این قطع دسترسی صحبت کنید.
 
-توجه کنید که برای ارسال پست الکترونیکی در ویکی، باید پست الکترونیکی خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
+توجه کنید که برای ارسال رایانامه در ویکی، باید رایانامهٔ خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
 
 نشانی آی‌پی فعلی شما $3 است و شمارهٔ قطع دسترسی $5 است.
 لطفاً این شماره را در هر درخواستی که در این باره مطرح می‌کنید ذکر کنید.",
 'blockednoreason' => 'دلیلی مشخص نشده‌است',
 'whitelistedittext' => 'برای ویرایش مقاله‌ها باید $1.',
-'confirmedittext' => 'شما باید، پیش از ویرایش صفحه‌ها، نشانی پست الکترونیکی خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
+'confirmedittext' => 'شما باید، پیش از ویرایش صفحه‌ها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
 'nosuchsectiontitle' => 'چنین بخشی پیدا نشد',
 'nosuchsectiontext' => 'شما تلاش کرده‌اید یک بخش در صفحه را ویرایش کنید که وجود ندارد.
 ممکن است در مدتی که شما صفحه را مشاهده می‌کردید این بخش جا به جا یا حذف شده باشد.',
@@ -1129,6 +1129,7 @@ $2
 'note' => "'''نکته:'''",
 'previewnote' => "'''به یاد داشته باشید که این فقط پیش‌نمایش است.'''
 تغییرات شما هنوز ذخیره نشده‌است!",
+'continue-editing' => 'ادامهٔ ویرایش',
 'previewconflict' => 'این پیش‌نمایش منعکس‌کنندهٔ متن ناحیهٔ ویرایش متن بالایی است، به شکلی که اگر متن را ذخیره کنید نمایش خواهد یافت.',
 'session_fail_preview' => "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.'''
 لطفاً دوباره سعی کنید.
@@ -1370,7 +1371,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'سیاههٔ فرونشانی',
 'suppressionlogtext' => 'در زیر فهرستی از آخرین حذف‌ها و قطع دسترسی‌هایی که حاوی محتوایی هستند که از مدیران پنهان شده‌اند را می‌بینید.
-برای مشاهدهٔ فهرستی از قطع دسترسی‌های فعال [[Special:BlockList|IP block list]] را ببینید.',
+برای مشاهدهٔ فهرستی از قطع دسترسی‌های فعال [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.',
 
 # History merging
 'mergehistory' => 'ادغام تاریخچه صفحه‌ها',
@@ -1513,9 +1514,9 @@ $1",
 'prefs-watchlist-token' => 'رمز فهرست پی‌گیری:',
 'prefs-misc' => 'تنظیمات متفرقه',
 'prefs-resetpass' => 'تغییر گذرواژه',
-'prefs-changeemail' => 'تغییر پست الکترونیکی',
-'prefs-setemail' => 'تغیین آدرس پست الکترونیکی',
-'prefs-email' => 'گزینه‌های پست الکترونیک',
+'prefs-changeemail' => 'تغییر رایانامه',
+'prefs-setemail' => 'تغیین آدرس رایانامه',
+'prefs-email' => 'گزینه‌های رایانامه',
 'prefs-rendering' => 'نمایش صفحه',
 'saveprefs' => 'ذخیره',
 'resetprefs' => 'صفرکردن ترجیحات',
@@ -1553,7 +1554,7 @@ $1",
 'timezoneregion-europe' => 'اروپا',
 'timezoneregion-indian' => 'اقیانوس هند',
 'timezoneregion-pacific' => 'اقیانوس آرام',
-'allowemail' => 'امکان دریافت پست الکترونیکی از دیگر کاربران',
+'allowemail' => 'امکان دریافت رایانامه از دیگر کاربران',
 'prefs-searchoptions' => 'گزینه‌های جستجو',
 'prefs-namespaces' => 'فضاهای نام',
 'defaultns' => 'در غیر این صورت جستجو در این فضاهای نام:',
@@ -1564,9 +1565,9 @@ $1",
 'prefs-common-css-js' => 'سی‌اس‌اس/جاوااسکریپت مشترک برای تمام پوسته‌ها:',
 'prefs-reset-intro' => 'شما می‌توانید از این صفحه برای بازگرداندن تنظیمات خود به پیش‌فرض تارنما استفاده کنید.
 این کار بازگشت‌ناپذیر است.',
-'prefs-emailconfirm-label' => 'تأیید پست الکترونیکی:',
+'prefs-emailconfirm-label' => 'تأیید رایانامه:',
 'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
-'youremail' => 'پست الکترونیکی:',
+'youremail' => 'رایانامه:',
 'username' => 'نام کاربری:',
 'uid' => 'شمارهٔ کاربری:',
 'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروه‌ها}}:',
@@ -1587,13 +1588,13 @@ $1",
 'gender-female' => 'زن',
 'prefs-help-gender' => 'اختیاری: برای خطاب‌شدن با جنسیت درست توسط نرم‌افزار به کار می‌رود.
 این اطلاعات عمومی خواهد بود.',
-'email' => 'پست الکترونیکی',
+'email' => 'رایانامه',
 'prefs-help-realname' => 'نام واقعی اختیاری است
 اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.',
-'prefs-help-email' => 'نشانی پست الکترونیکی اختیاری‌است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.',
-'prefs-help-email-others' => 'شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما پست الکترونیکی بفرستند.
-نشانی پست الکترونیکی شما زمانی که دیگران با شما تماس بگیرند فاش نمی‌شود.',
-'prefs-help-email-required' => 'نشانی پست الکترونیکی الزامی‌است.',
+'prefs-help-email' => 'نشانی رایانامه اختیاری‌است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.',
+'prefs-help-email-others' => 'شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما رایانامه بفرستند.
+نشانی رایانامه شما زمانی که دیگران با شما تماس بگیرند فاش نمی‌شود.',
+'prefs-help-email-required' => 'نشانی رایانامه الزامی‌است.',
 'prefs-info' => 'اطلاعات اولیه',
 'prefs-i18n' => 'بین‌المللی‌سازی',
 'prefs-signature' => 'امضا',
@@ -1610,8 +1611,8 @@ $1",
 'prefs-diffs' => 'تفاوت‌ها',
 
 # User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'نشانی پست الکترونیکی معتبر به نظر می رسد',
-'email-address-validity-invalid' => 'نشانی پست الکترونیکی معتبر وارد کنید',
+'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می رسد',
+'email-address-validity-invalid' => 'نشانی رایانامهٔ معتبر وارد کنید',
 
 # User rights
 'userrights' => 'مدیریت اختیارات کاربر',
@@ -1692,7 +1693,7 @@ $1",
 'right-suppressrevision' => 'بازبینی و احیای ویرایش‌هایی که از مدیران پنهان شده‌اند',
 'right-suppressionlog' => 'مشاهدهٔ سیاهه‌های خصوصی',
 'right-block' => 'قطع دسترسی ویرایشی دیگر کاربران',
-'right-blockemail' => 'قطع دسترسی دیگر کاربران برای ارسال پست الکترونیکی',
+'right-blockemail' => 'قطع دسترسی دیگر کاربران برای ارسال رایانامه',
 'right-hideuser' => 'قطع دسترسی کاربر و پنهان کردن آن از دید عموم',
 'right-ipblock-exempt' => 'تاثیر نپذیرفتن از قطع دسترسی‌های آی‌پی، خودکار یا فاصله‌ای',
 'right-proxyunbannable' => 'تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها',
@@ -1717,7 +1718,7 @@ $1",
 'right-userrights-interwiki' => 'ویرایش اختیارات کاربرهای ویکی‌های دیگر',
 'right-siteadmin' => 'قفل کردن و باز کردن پایگاه داده',
 'right-override-export-depth' => 'برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵',
-'right-sendemail' => 'ارسال نامه الکترونیکی به دیگر کاربران',
+'right-sendemail' => 'ارسال رایانامه به دیگر کاربران',
 'right-passwordreset' => 'مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه',
 
 # User rights log
@@ -1750,7 +1751,7 @@ $1",
 'action-undelete' => 'احیای این صفحه',
 'action-suppressrevision' => 'مشاهده و احیای ویرایش‌های حذف شده',
 'action-suppressionlog' => 'مشاهدهٔ این سیاههٔ خصوصی',
-'action-block' => 'قطع دسترسی ویرایش این کاربر',
+'action-block' => 'قطع دسترسی این کاربر از ویرایش کردن',
 'action-protect' => 'تغییر سطح محافظت این صفحه',
 'action-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است',
 'action-import' => 'وارد کردن این صفحه از یک ویکی دیگر',
@@ -2314,6 +2315,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'allpages-bad-ns' => '{{SITENAME}} دارای فضای نام «$1» نیست.',
 'allpages-hide-redirects' => 'پنهان‌کردن تغییرمسیرها',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'مشاهده آخرین.',
+
 # Special:Categories
 'categories' => 'رده‌ها',
 'categoriespagetext' => '{{PLURAL:$1|ردهٔ|رده‌های}} زیر دارای صفحه‌ها یا پرونده‌هایی {{PLURAL:$1|است|هستند}}.
@@ -2379,24 +2383,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 
 # E-mail user
 'mailnologin' => 'نشانی‌ای از فرستنده موجود نیست',
-'mailnologintext' => 'برای فرستادن پست الکترونیکی به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
+'mailnologintext' => 'برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
 'emailuser' => 'فرستادن نامه به این کاربر',
-'emailpage' => 'پست الکترونیکی به کاربر',
-'emailpagetext' => 'شما می‌توانید از فرم زیر برای ارسال یک نامه الکترونیکی به این کاربر استفاده کنید.
-نشانی پست الکترونیکی‌ای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
-'usermailererror' => 'پست الکترونیکی دچار خطا شد:',
-'defemailsubject' => 'پست الکترونیکی {{SITENAME}} از طرف کاربر «$1»',
-'usermaildisabled' => 'پست الکترونیکی کاربر غیرقعال است',
-'usermaildisabledtext' => 'شما در این ویکی نمی‌توانید به دیگر کاربران پست الکترونیکی بفرستید',
-'noemailtitle' => 'نشانی پست الکترونیکی موجود نیست',
-'noemailtext' => 'این کاربر نشانی پست الکترونیکی معتبری مشخص نکرده است،',
-'nowikiemailtitle' => 'اجازهٔ ارسال نامهٔ الکترونیکی داده نشده‌است',
-'nowikiemailtext' => 'این کاربر انتخاب کرده که از دیگر کاربران نامهٔ الکترونیکی دریافت نکند.',
+'emailpage' => 'رایانامه به کاربر',
+'emailpagetext' => 'شما می‌توانید از فرم زیر برای ارسال یک رایانامه به این کاربر استفاده کنید.
+نشانی رایانامه‌ای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
+'usermailererror' => 'رایانامه دچار خطا شد:',
+'defemailsubject' => 'رایانامه {{SITENAME}} از طرف کاربر «$1»',
+'usermaildisabled' => 'رایانامهٔ کاربر غیرقعال است',
+'usermaildisabledtext' => 'شما در این ویکی نمی‌توانید به دیگر کاربران رایانامه بفرستید',
+'noemailtitle' => 'نشانی رایانامه موجود نیست',
+'noemailtext' => 'این کاربر نشانی رایانامهٔ معتبری مشخص نکرده است،',
+'nowikiemailtitle' => 'اجازهٔ ارسال رایانامه داده نشده‌است',
+'nowikiemailtext' => 'این کاربر انتخاب کرده که از دیگر کاربران رایانامه دریافت نکند.',
 'emailnotarget' => 'نام کاربری ناموجود یا نامعتبر برای گیرنده.',
 'emailtarget' => 'نام کاربری دریافت‌کننده را وارد کنید',
 'emailusername' => 'نام کاربری:',
 'emailusernamesubmit' => 'ارسال',
-'email-legend' => 'ارسال نامه الکترونیکی به یک کاربر دیگر {{SITENAME}}',
+'email-legend' => 'ارسال یک نامه به کاربر دیگر {{SITENAME}}',
 'emailfrom' => 'از:',
 'emailto' => 'به:',
 'emailsubject' => 'عنوان:',
@@ -2404,9 +2408,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'emailsend' => 'بفرست',
 'emailccme' => 'رونوشت پیغام را برایم بفرست.',
 'emailccsubject' => 'رونوشت پیغام شما به $1: $2',
-'emailsent' => 'پست الکترونیکی فرستاده شد',
-'emailsenttext' => 'پیغام پست الکترونیکی شما فرستاده شد.',
-'emailuserfooter' => 'این نامهٔ الکترونیکی با استفاده از ویژگی «پست الکترونیکی به کاربر» {{SITENAME}} توسط $1 به $2 فرستاده شد.',
+'emailsent' => 'رایانامه فرستاده شد',
+'emailsenttext' => 'پیغام رایانامه شما فرستاده شد.',
+'emailuserfooter' => 'این رایانامه با استفاده از ویژگی «فرستادن نامه به این کاربر» {{SITENAME}} توسط $1 به $2 فرستاده شد.',
 
 # User Messenger
 'usermessage-summary' => 'گذاشتن پیغام سامانه.',
@@ -2433,13 +2437,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'notvisiblerev' => 'آخرین نسخه توسط کاربری دیگر حذف شده‌است',
 'watchnochange' => 'هیچ یک از موارد در حال پی‌گیری شما در دورهٔ زمانی نمایش‌یافته ویرایش نشده است.',
 'watchlist-details' => 'بدون احتساب صفحه‌های بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.',
-'wlheader-enotif' => '*اطلاع‌رسانی از طریق پست الکترونیکی امکان‌پذیر است.',
+'wlheader-enotif' => '*اطلاع‌رسانی از طریق رایانامه امکان‌پذیر است.',
 'wlheader-showupdated' => "*صفحه‌هایی که پس از آخرین سرزدنتان به آنها تغییر کرده‌اند '''پررنگ''' نشان داده شده‌اند.",
 'watchmethod-recent' => 'بررسی ویرایش‌های اخیر برای صفحه‌های مورد پی‌گیری',
 'watchmethod-list' => 'بررسی صفحه‌های مورد پی‌گیری برای ویرایش‌های اخیر',
 'watchlistcontains' => 'فهرست پی‌گیری‌های شما حاوی $1 {{PLURAL:$1|صفحه|صفحه}} است.',
 'iteminvalidname' => 'مشکل با مورد «$1»، نام نامعتبر است...',
-'wlnote' => "در زیر {{PLURAL:$1|تغییری|'''$1''' تغییری}} که در {{PLURAL:$2|ساعت|'''$2''' ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
+'wlnote' => 'در زیر {{PLURAL:$1|تغییری|$1 تغییری}} که در {{PLURAL:$2|ساعت|$2 ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4',
 'wlshowlast' => 'نمایش آخرین $1 ساعت $2 روز $3',
 'watchlist-options' => 'گزینه‌های پیگیری',
 
@@ -2448,7 +2452,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'unwatching' => 'توقف پی‌گیری...',
 'watcherrortext' => 'ایرادی در هنگام عوض کردن تنظیمات فهرست پیگیرتان برای «$1» رخ داد.',
 
-'enotif_mailer' => 'پست الکترونیکی اطلاع‌رسانی {{SITENAME}}',
+'enotif_mailer' => 'رایانامهٔ اطلاع‌رسانی {{SITENAME}}',
 'enotif_reset' => 'علامت‌گذاری همهٔ صفحه‌ها به عنوان بازدید شده',
 'enotif_newpagetext' => 'این یک صفحهٔ تازه‌است.',
 'enotif_impersonal_salutation' => 'کاربر {{SITENAME}}',
@@ -2744,7 +2748,7 @@ $1',
 **نام کاربری نامناسب',
 'ipb-hardblock' => 'جلوگیری از ویرایش کردن کاربران ثبت نام کرده از طریق این نشانی آی‌پی',
 'ipbcreateaccount' => 'جلوگیری از ایجاد حساب',
-'ipbemailban' => 'جلوگیری از ارسال پست الکترونیکی',
+'ipbemailban' => 'جلوگیری از ارسال رایانامه',
 'ipbenableautoblock' => 'بستن  خودکار آخرین نشانی آی‌پی استفاده شده توسط کاربر و نشانی‌های دیگری که از آن‌ها برای ویرایش تلاش می‌کند',
 'ipbsubmit' => 'این کاربر بسته شود',
 'ipbother' => 'زمانی دیگر',
@@ -2759,7 +2763,7 @@ $1',
 'badipaddress' => 'نشانی آی‌‍ی غیر مجاز',
 'blockipsuccesssub' => 'بستن با موفقیت انجام شد',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بسته شد.<br />
-براÛ\8c Ø¨Ø±Ø±Ø³Û\8c Ø¨Ø³ØªÙ\87â\80\8cشدÙ\86â\80\8cÙ\87ا [[Special:BlockList|Ù\81Ù\87رست Ù\86شاÙ\86Û\8câ\80\8cÙ\87اÛ\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø¨Ø³ØªÙ\87â\80\8cشدÙ\87]] را ببینید.',
+براÛ\8c Ø¨Ø±Ø±Ø³Û\8c Ø¨Ø³ØªÙ\87â\80\8cشدÙ\87â\80\8cÙ\87ا [[Special:BlockList|Ù\81Ù\87رست Ø¨Ø³ØªÙ\87â\80\8cشدÙ\87â\80\8cÙ\87ا]] را ببینید.',
 'ipb-blockingself' => 'شما در حال بستن خودتان هستید!  آیا مطمئن هستید که می‌خواهید چنین کاری انجام دهید؟',
 'ipb-confirmhideuser' => 'شما در حال بستن یک کاربر هستید که «پنهان‌سازی کاربر» برایش فعال شد‌ه‌است. این کار نام کاربر را از همهٔ فهرست‌ها و سیاهه‌ها مخفی می‌کند. آیا مطمئن هستید که می‌خواهید آن را انجام دهید؟',
 'ipb-edit-dropdown' => 'ویرایش دلایل قطع‌دسترسی',
@@ -2794,7 +2798,7 @@ $1',
 'anononlyblock' => 'فقط کاربران گمنام',
 'noautoblockblock' => 'بستن خودکار غیرفعال است',
 'createaccountblock' => 'امکان ایجاد حساب مسدود است',
-'emailblock' => 'پست الکترونیکی مسدود شد',
+'emailblock' => 'رایانامه مسدود شد',
 'blocklist-nousertalk' => 'نمی تواند صفحهٔ بحث خود را ویرایش کند',
 'ipblocklist-empty' => 'فهرست بسته‌شدن‌ها خالی‌است.',
 'ipblocklist-no-results' => 'دسترسی حساب کاربری یا نشانی آی‌پی مورد نظر قطع نیست.',
@@ -2802,7 +2806,7 @@ $1',
 'unblocklink' => 'باز شود',
 'change-blocklink' => 'تغییر قطع دسترسی',
 'contribslink' => 'مشارکت‌ها',
-'emaillink' => 'ارسال پست الکترونیکی',
+'emaillink' => 'ارسال رایانامه',
 'autoblocker' => 'به طور خودکار بسته شد چون آی‌پی شما به تازگی توسط کاربر «[[User:$1|$1]]» استفاده شده‌است.
 دلیل قطع دسترسی $1 چنین است: «$2»',
 'blocklogpage' => 'سیاههٔ بسته‌شدن‌ها',
@@ -2812,14 +2816,14 @@ $1',
 سیاههٔ قطع دسترسی در زیر نمایش یافته است:',
 'blocklogentry' => '«[[$1]]» را تا $2 بست $3',
 'reblock-logentry' => 'تنظیمات قطع دسترسی [[$1]] را تغییر داد به پایان قطع دسترسی در $2 $3',
-'blocklogtext' => 'اÛ\8cÙ\86 Ø³Û\8cاÙ\87Ù\87â\80\8cاÛ\8c Ø§Ø² Ø§Ø¹Ù\85اÙ\84 Ø¨Ø³ØªÙ\86 Ù\88 Ø¨Ø§Ø² Ú©Ø±Ø¯Ù\86 Ú©Ø§Ø±Ø¨Ø±Ù\87ا Ø§Ø³Øª.
+'blocklogtext' => 'این سیاهه‌ای از بستن و باز کردن کاربرها است.
 نشانی‌های آی‌پی که به طور خودکار بسته شده‌اند فهرست نشده‌اند.
-برای فهرست محرومیت‌ها و بسته‌شدن‌های فعال در لحظهٔ حاضر، به [[Special:BlockList|فهرست آی‌پی‌های بسته]] مراجعه کنید.',
+برای فهرست محرومیت‌ها و بسته‌شدن‌های حال حاضر به [[Special:BlockList|فهرست بسته‌شده‌ها]] مراجعه کنید.',
 'unblocklogentry' => '$1 را باز کرد',
 'block-log-flags-anononly' => 'فقط کاربران گمنام',
 'block-log-flags-nocreate' => 'قابلیت ایجاد حساب غیرفعال شد',
 'block-log-flags-noautoblock' => 'قطع دسترسی خودکار غیرفعال شد',
-'block-log-flags-noemail' => 'پست الکترونیکی مسدود شد',
+'block-log-flags-noemail' => 'رایانامه مسدود شد',
 'block-log-flags-nousertalk' => 'صفحهٔ بحث خود را نمی‌تواند ویرایش کند',
 'block-log-flags-angry-autoblock' => 'قطع دسترسی خودکار پیشرفته فعال شد',
 'block-log-flags-hiddenname' => 'نام کاربری پنهان',
@@ -3096,7 +3100,7 @@ $1',
 'tooltip-pt-login' => 'توصیه می‌شود که به سامانه وارد شوید، گرچه اجباری نیست',
 'tooltip-pt-anonlogin' => 'توصیه می‌شود که به سامانه وارد شوید، لیکن اجباری نیست',
 'tooltip-pt-logout' => 'خروج از سامانه',
-'tooltip-ca-talk' => 'گفتگو پیرامون صفحهٔ محتوا',
+'tooltip-ca-talk' => 'گفتگو پیرامون محتوای صفحه',
 'tooltip-ca-edit' => 'شما می‌توانید این صفحه را ویرایش کنید. لطفاً پیش از ذخیره از دکمهٔ پیش‌نمایش استفاده کنید.',
 'tooltip-ca-addsection' => 'بخشی جدید ایجاد کنید',
 'tooltip-ca-viewsource' => 'این صفحه محافظت‌شده‌است.
@@ -3125,7 +3129,7 @@ $1',
 'tooltip-feed-rss' => 'خبرنامه آراس‌اس برای این صفحه',
 'tooltip-feed-atom' => 'خبرنامهٔ اتم برای این صفحه',
 'tooltip-t-contributions' => 'فهرست مشارکت‌های این کاربر',
-'tooltip-t-emailuser' => 'فرستادن پست الکترونیکی به این کاربر',
+'tooltip-t-emailuser' => 'فرستادن رایانامه به این کاربر',
 'tooltip-t-upload' => 'بارگذاری تصاویر و پرونده‌های دیگر',
 'tooltip-t-specialpages' => 'فهرستی از همهٔ صفحه‌های ویژه',
 'tooltip-t-print' => 'نسخهٔ قابل چاپ این صفحه',
@@ -3710,63 +3714,63 @@ $1',
 'limitall' => 'همه',
 
 # E-mail address confirmation
-'confirmemail' => 'تأیید نشانی پست الکترونیکی',
-'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی پست الکترونیکی معتبری وارد نکرده‌اید.',
-'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار پست الکترونیکی خود، پیش از استفاده از خدمات پست الکترونیکی در اینجا می‌کند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی پست الکترونیکی شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی پست الکترونیکی شما مسجل شود.',
-'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت الکترونیکی فرستاده شده‌است. اگر همین اواخر حساب خود را باز کرده‌اید شاید بد نباشد که پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
+'confirmemail' => 'تأیید نشانی رایانامه',
+'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی رایانامه معتبری وارد نکرده‌اید.',
+'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار رایانامه خود، پیش از استفاده از خدمات رایانامه در اینجا می‌کند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی رایانامهٔ شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی رایانامهٔ شما تایید شود.',
+'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت نامه فرستاده شده‌است. اگر همین اواخر حساب خود را باز کرده‌اید شاید بد نباشد که پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
 'confirmemail_send' => 'پُست‌کردن یک کد تأیید',
-'confirmemail_sent' => 'نامهٔ الکترونیکی تأییدی فرستاده شد.',
-'confirmemail_oncreate' => 'یک کد تأییدی به نشانی پست الکترونیکی شما فرستاده شد.
-برای واردشدن به سامانه نیازی به این کد نیست، ولی برای راه‌اندازی امکانات وابسته به پست الکترونیکی در این ویکی به آن نیاز خواهید داشت.',
-'confirmemail_sendfailed' => 'فرستادن پست الکترونیکی تأییدی ممکن نشد.
-نشانی پست الکترونیکی را از نظر وجود نویسه‌های نامعتبر بررسی کنید.
+'confirmemail_sent' => 'یک نامهٔ تأییدی فرستاده شد.',
+'confirmemail_oncreate' => 'یک کد تأییدی به نشانی رایانامهٔ شما فرستاده شد.
+برای واردشدن به سامانه نیازی به این کد نیست، ولی برای راه‌اندازی امکانات وابسته به رایانامه در این ویکی به آن نیاز خواهید داشت.',
+'confirmemail_sendfailed' => 'فرستادن رایانامهٔ تأییدی ممکن نشد.
+نشانی رایانامه را از نظر وجود نویسه‌های نامعتبر بررسی کنید.
 
-پاسخ سامانه ارسال پست الکترونیکی: $1',
+پاسخ سامانه ارسال رایانامه: $1',
 'confirmemail_invalid' => 'کد تأیید نامعتبر است. ممکن است که منقضی شده باشد.',
-'confirmemail_needlogin' => 'برای تأیید نشانی پست الکترونیکی‌تان نیاز به $1 دارید.',
-'confirmemail_success' => 'نشانی پست الکترونیکی شما تأیید شده‌است.
+'confirmemail_needlogin' => 'برای تأیید نشانی رایانامه‌تان نیاز به $1 دارید.',
+'confirmemail_success' => 'نشانی رایانامهٔ شما تأیید شده‌است.
 
-اینک می‌توانید [[Special:UserLogin|به سامانه وارد شوید]] و از ویکی لذت ببرید.',
-'confirmemail_loggedin' => 'نشانی پست الکترونیکی شما تأیید شد.',
+هم‌اینک می‌توانید [[Special:UserLogin|به سامانه وارد شوید]] و از ویکی لذت ببرید.',
+'confirmemail_loggedin' => 'نشانی رایانامهٔ شما تأیید شد.',
 'confirmemail_error' => 'هنگام ذخیرهٔ تأیید شما به مشکلی برخورده شد.',
-'confirmemail_subject' => 'تأیید نشانی پست الکترونیکی شما {{SITENAME}}',
-'confirmemail_body' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 حساب کاربری‌ای با نام «$2» و این نشانی پست الکترونیکی در {{SITENAME}} ایجاد کرده‌است.
+'confirmemail_subject' => 'تأیید نشانی رایانامهٔ شما {{SITENAME}}',
+'confirmemail_body' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 حساب کاربری‌ای با نام «$2» و این نشانی رایانامه در {{SITENAME}} ایجاد کرده‌است.
 
-برای تأیید این که این حساب واقعاً متعلق به شماست و نیز برای فعال‌سازی امکانات پست الکترونیک {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:
+برای تأیید این که این حساب واقعاً متعلق به شماست و نیز برای فعال‌سازی امکانات رایانامه {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:
 
 $3
 
 اگر شما این حساب کاربری را ثبت *نکرده‌اید*، لطفاً پیوند زیر را
-دنبال کنید تا تأیید نشانی پست الکترونیکی لغو شود:
+دنبال کنید تا تأیید نشانی رایانامه لغو شود:
 
 $5
 
 این کدِ تأیید در تاریخ $4 منقضی خواهد شد.
 </div>',
-'confirmemail_body_changed' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی پست الکترونیکی حساب «$2» در {{SITENAME}} را تغییر داده‌است.
+'confirmemail_body_changed' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی رایانامه حساب «$2» در {{SITENAME}} را تغییر داده‌است.
 
-برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی پست الکترونیک در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
+برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی رایانامه در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
 
 $3
 
-اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر پست الکترونیکی را لغو کنید:
+اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر رایانامه را لغو کنید:
 
 $5
 
 این تأییدیه در $4 منقضی می‌گردد.',
-'confirmemail_body_set' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی پست الکترونیکی حساب «$2» در {{SITENAME}} را به این نشانی تغییر داده‌است.
+'confirmemail_body_set' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی رایانامه حساب «$2» در {{SITENAME}} را به این نشانی تغییر داده‌است.
 
-برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی پست الکترونیک در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
+برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی رایانامه در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
 
 $3
 
-اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر پست الکترونیکی را لغو کنید:
+اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر رایانامه را لغو کنید:
 
 $5
 
 این تأییدیه در $4 منقضی می‌گردد.',
-'confirmemail_invalidated' => 'تأیید نشانی پست الکترونیکی لغو شد',
-'invalidateemail' => 'لغو کردن تأیید نشانی پست الکترونیکی',
+'confirmemail_invalidated' => 'تأیید نشانی رایانامه لغو شد',
+'invalidateemail' => 'لغو کردن تأیید نشانی رایانامه',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[تراگنجانش بین‌ویکیانه فعال نیست]',
@@ -3956,6 +3960,11 @@ $5
 'version-software' => 'نسخهٔ نصب‌شده',
 'version-software-product' => 'محصول',
 'version-software-version' => 'نسخه',
+'version-entrypoints' => 'نشانی اینترنتی محل ورود',
+'version-entrypoints-header-entrypoint' => 'نقطه ورود',
+'version-entrypoints-header-url' => 'نشانی اینترنتی',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسیر مقاله]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسیر اسکریپت]',
 
 # Special:FilePath
 'filepath' => 'مسیر پرونده',
@@ -4086,8 +4095,8 @@ $5
 'logentry-newusers-newusers' => '$1 یک حساب کاربری ایجاد کرد',
 'logentry-newusers-create' => '$1 یک حساب کاربری ایجاد کرد',
 'logentry-newusers-create2' => '$1 یک حساب کاربری ایجاد کرد $3',
-'logentry-newusers-autocreate' => 'کاروری حساب $1  بساتن به شکل خودکار',
-'newuserlog-byemail' => 'گذرواژه با پست الکترونیکی ارسال شد',
+'logentry-newusers-autocreate' => 'حساب $1  به شکل خودکار ساخته شد',
+'newuserlog-byemail' => 'گذرواژه بوسیله رایانامه ارسال شد',
 
 # Feedback
 'feedback-bugornote' => 'اگر آماده‌اید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$2 $3]» افزوده خواهد شد.',
@@ -4142,4 +4151,15 @@ $5
 'api-error-uploaddisabled' => 'بارگذاری در این ویکی غیرفعال است.',
 'api-error-verification-error' => 'ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.',
 
+# Durations
+'duration-seconds' => '$1 ثانیه',
+'duration-minutes' => '$1 دقیقه',
+'duration-hours' => '$1 ساعت',
+'duration-days' => '$1 روز',
+'duration-weeks' => '$1 هفته',
+'duration-years' => '$1 سال',
+'duration-decades' => '$1 دهه',
+'duration-centuries' => '$1 قرن',
+'duration-millennia' => '{{PLURAL:$1|هزار سال |$1 هزار سال}}',
+
 );
index e67a909..91008bc 100644 (file)
@@ -16,6 +16,7 @@
  * @author Jack Phoenix
  * @author Jafeluv
  * @author Kaganer
+ * @author Kulmalukko
  * @author Mobe
  * @author Nedergard
  * @author Nike
@@ -688,6 +689,9 @@ $2',
 'customjsprotected' => 'Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
 'ns-specialprotected' => 'Toimintosivuja ei voi muokata.',
 'titleprotected' => "Käyttäjä [[User:$1|$1]] on asettanut tämän sivun luontikieltoon: ''$2''.",
+'filereadonlyerror' => 'Tiedostoa "$1" ei voi muuttaa, koska jaettu mediavarasto "$2" on "vain luku" -tilassa.
+
+Lukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Virheellinen asetus: Tuntematon virustutka: ''$1''",
@@ -764,6 +768,7 @@ Tästä johtuen tästä IP-osoitteesta ei voi tällä hetkellä luoda uusia tunn
 'emailconfirmlink' => 'Varmenna sähköpostiosoite',
 'invalidemailaddress' => 'Sähköpostiosoitetta ei voida hyväksyä, koska se ei ole oikeassa muodossa. Ole hyvä ja anna oikea sähköpostiosoite tai jätä kenttä tyhjäksi.',
 'cannotchangeemail' => 'Tunnuksien sähköpostiosoitteita ei voi muuttaa tässä wikissä.',
+'emaildisabled' => 'Tältä sivustolta ei voi lähettää sähköpostia.',
 'accountcreated' => 'Käyttäjätunnus luotiin',
 'accountcreatedtext' => 'Käyttäjän $1 käyttäjätunnus luotiin.',
 'createaccount-title' => 'Tunnuksen luominen {{GRAMMAR:illative|{{SITENAME}}}}',
@@ -960,7 +965,8 @@ Alla on viimeisin estolokin tapahtuma:',
 'userinvalidcssjstitle' => "'''Varoitus:''' Tyyliä nimeltä ”$1” ei ole olemassa. Muista, että käyttäjän määrittelemät .css- ja .js-sivut alkavat pienellä alkukirjaimella, esim. {{ns:user}}:Matti Meikäläinen/vector.css eikä {{ns:user}}:Matti Meikäläinen/Vector.css.",
 'updated' => '(Päivitetty)',
 'note' => "'''Huomautus:'''",
-'previewnote' => "'''Tämä on vasta sivun esikatselu. Sivua ei ole vielä tallennettu!'''",
+'previewnote' => "'''Tämä on vasta sivun esikatselu. Tekemiäsi muokkauksia ei ole vielä tallennettu!'''",
+'continue-editing' => 'Jatka muokkaamista',
 'previewconflict' => 'Tämä esikatselu näyttää miltä muokkausalueella oleva teksti näyttää tallennettuna.',
 'session_fail_preview' => "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.''' Yritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään.",
 'session_fail_preview_html' => "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.'''
@@ -971,6 +977,7 @@ Yritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ul
 'token_suffix_mismatch' => "'''Muokkauksesi on hylätty, koska asiakasohjelmasi ei osaa käsitellä välimerkkejä muokkaustarkisteessa. Syynä voi olla viallinen välityspalvelin.'''",
 'edit_form_incomplete' => "'''Osa muokkauslomakkeesta ei saavuttanut palvelinta. Tarkista, että muokkauksesi ovat vahingoittumattomia ja yritä uudelleen.'''",
 'editing' => 'Muokataan sivua $1',
+'creating' => 'Luodaan sivu $1',
 'editingsection' => 'Muokataan osiota sivusta $1',
 'editingcomment' => 'Muokataan uutta osiota sivulla $1',
 'editconflict' => 'Päällekkäinen muokkaus: $1',
@@ -986,7 +993,7 @@ Sinun täytyy yhdistää muutoksesi olemassa olevaan tekstiin.
 'yourdiff' => 'Eroavaisuudet',
 'copyrightwarning' => "'''Muutoksesi astuvat voimaan välittömästi.''' Kaikki {{GRAMMAR:illative|{{SITENAME}}}} tehtävät tuotokset katsotaan julkaistuksi $2 -lisenssin mukaisesti ($1). Jos et halua, että kirjoitustasi muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi. Tallentamalla muutoksesi lupaat, että kirjoitit tekstisi itse, tai kopioit sen jostain vapaasta lähteestä. '''ÄLÄ KÄYTÄ TEKIJÄNOIKEUDEN ALAISTA MATERIAALIA ILMAN LUPAA!'''",
 'copyrightwarning2' => "Huomaa, että kuka tahansa voi muokata, muuttaa ja poistaa kaikkia sivustolle tekemiäsi lisäyksiä ja muutoksia. Muokkaamalla sivustoa luovutat sivuston käyttäjille tämän oikeuden ja takaat, että lisäämäsi aineisto on joko itse kirjoittamaasi tai peräisin jostain vapaasta lähteestä. Lisätietoja sivulla $1. '''TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!'''",
-'longpageerror' => "'''Sivun koko on $1 binäärikilotavua. Sivua ei voida tallentaa, koska enimmäiskoko on $2 binäärikilotavua.'''",
+'longpageerror' => "'''Virhe: Lähettämäsi tekstin pituus on {{PLURAL:$1|kilotavu|$1 kilotavua}}. Tekstiä ei voida tallentaa, koska se on pitempi kuin sallittu enimmäispituus {{PLURAL:$2|yksi kilotavu|$2 kilotavua}}.'''",
 'readonlywarning' => "'''Varoitus: Tietokanta on lukittu huoltoa varten, joten et pysty tallentamaan muokkauksiasi juuri nyt.'''
 Saattaa olla paras leikata ja liimata tekstisi omaan tekstitiedostoosi ja tallentaa se tänne myöhemmin.
 
@@ -1025,6 +1032,7 @@ Se on ilmeisesti poistettu.',
 'edit-no-change' => 'Muokkauksesi sivuutettiin, koska tekstiin ei tehty mitään muutoksia.',
 'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
 Se on jo olemassa.',
+'defaultmessagetext' => 'Viestin oletusteksti',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.
@@ -1176,8 +1184,8 @@ Sinulla ei ole oikeutta siihen.',
 
 # Suppression log
 'suppressionlog' => 'Häivytysloki',
-'suppressionlogtext' => 'Alla on lista uusimmista poistoista ja muokkausestoista, jotka sisältävät ylläpitäjiltä piilotettua materiaalia.
-[[Special:BlockList|Muokkausestolistassa]] on tämänhetkiset muokkausestot.',
+'suppressionlogtext' => 'Alla on luettelo poistoista ja muokkausestoista, jotka sisältävät ylläpitäjiltä piilotettua materiaalia.
+[[Special:BlockList|Estolistassa]] on lueteltu voimassa olevat muokkauskiellot ja muokkausestot.',
 
 # History merging
 'mergehistory' => 'Yhdistä muutoshistoriat',
@@ -1239,7 +1247,7 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 
 $1 {{int:pipe-separator}} $2',
 'searchmenu-legend' => 'Hakuasetukset',
-'searchmenu-exists' => "'''Sivu [[:$1]] löytyy tästä wikistä.'''",
+'searchmenu-exists' => "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
 'searchmenu-new' => "'''Luo sivu ''[[:$1]]'' tähän wikiin.'''",
 'searchhelp-url' => 'Help:Sisällys',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Selaa sivuja tällä etuliitteellä]]',
@@ -1597,6 +1605,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'newsectionsummary' => '/* $1 */ uusi osio',
 'rc-enhanced-expand' => 'Näytä yksityiskohdat (JavaScript)',
 'rc-enhanced-hide' => 'Piilota yksityiskohdat',
+'rc-old-title' => 'alun perin luotu nimellä "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Linkitettyjen sivujen muutokset',
@@ -1761,6 +1770,7 @@ $1',
 'backend-fail-closetemp' => 'Väliaikaista tiedostoa ei voitu sulkea.',
 'backend-fail-read' => 'Tiedostoa $1 ei voitu lukea.',
 'backend-fail-create' => 'Tiedostoa $1 ei voitu luoda.',
+'backend-fail-connect' => 'Varastojärjestelmään "$1" ei saada yhteyttä.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kohteen $1 lukitusta ei voitu poistaa, koska se ei ole lukittu.',
@@ -1878,6 +1888,10 @@ Seuraava lista näyttää {{PLURAL:$1|ensimmäisen linkittävän sivun|$1 ensimm
 Katso [$2 tiedoston kuvaussivulta] lisätietoja.',
 'sharedupload-desc-here' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä.
 Tiedot [$2 tiedoston kuvaussivulta] näkyvät alla.',
+'sharedupload-desc-edit' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä. 
+Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
+'sharedupload-desc-create' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä. 
+Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
 'filepage-nofile' => 'Tämän nimistä tiedostoa ei ole olemassa.',
 'filepage-nofile-link' => 'Tämän nimistä tiedostoa ei ole olemassa, mutta voit [$1 tallentaa sen].',
 'uploadnewversion-linktext' => 'Tallenna uusi versio tästä tiedostosta',
@@ -2007,6 +2021,8 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'wantedpages' => 'Halutut sivut',
 'wantedpages-badtitle' => 'Virheellinen otsikko tuloksissa: $1',
 'wantedfiles' => 'Halutut tiedostot',
+'wantedfiletext-cat' => 'Seuraavia tiedostoja käytetään, mutta niitä ei ole olemassa. Ulkopuolissa mediavarastoissa olevat tiedostot voivat näkyä tällä listalla, vaikka ne ovat olemassa. Tällaiset väärät merkinnät on <del>yliviivattu</del>. Lisäksi sellaiset sivut, joihin on sisällytetty tiedostoja, jotka eivät ole olemassa, on luetteloitu [[:$1|täällä]].',
+'wantedfiletext-nocat' => 'Seuraavia tiedostoja käytetään, mutta niitä ei ole olemassa. Ulkopuolissa mediavarastoissa olevat tiedostot voivat näkyä tällä listalla, vaikka ne ovat olemassa. Tällaiset väärät merkinnät on <del>yliviivattu</del.>',
 'wantedtemplates' => 'Halutut mallineet',
 'mostlinked' => 'Viitatuimmat sivut',
 'mostlinkedcategories' => 'Viitatuimmat luokat',
@@ -2084,6 +2100,12 @@ Voit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muut
 'allpagesprefix' => 'Katkaisuhaku',
 'allpagesbadtitle' => 'Annettu otsikko oli kelvoton tai siinä oli wikien välinen etuliite.',
 'allpages-bad-ns' => '{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimiavaruutta ”$1”.',
+'allpages-hide-redirects' => 'Piilota ohjaussivut',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Katselet arkistoitua versiota tästä sivusta, joka voi olla jopa $1 vanha.',
+'cachedspecial-viewing-cached-ts' => 'Katselet arkistoitua versiota tästä sivusta, joka ei välttämättä ole sivun viimeisin versio.',
+'cachedspecial-refresh-now' => 'Näytä uusin versio.',
 
 # Special:Categories
 'categories' => 'Luokat',
@@ -2203,7 +2225,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 'watchnochange' => 'Valittuna ajanjaksona yhtäkään tarkkailemistasi sivuista ei muokattu.',
 'watchlist-details' => 'Tarkkailulistalla on {{PLURAL:$1|$1 sivu|$1 sivua}} keskustelusivuja mukaan laskematta.',
 'wlheader-enotif' => '* Sähköposti-ilmoitukset ovat käytössä.',
-'wlheader-showupdated' => "* Sivut, joita on muokattu viimeisen käyntisi jälkeen on '''lihavoitu'''.",
+'wlheader-showupdated' => "* Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
 'watchmethod-recent' => 'tarkistetaan tuoreimpia muutoksia tarkkailluille sivuille',
 'watchmethod-list' => 'tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset',
 'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
@@ -2218,7 +2240,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 'watcherrortext' => 'Sivun ”$1” tarkkailulista-asetusten muutoksissa tapahtui virhe.',
 
 'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} sivu on muuttunut -ilmoitus',
-'enotif_reset' => 'Merkitse kaikki sivut katsotuiksi',
+'enotif_reset' => 'Merkitse kaikki sivut kerralla nähdyiksi',
 'enotif_newpagetext' => 'Tämä on uusi sivu.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-käyttäjä',
 'changed' => 'muuttanut sivua',
@@ -2391,7 +2413,7 @@ Voit palauttaa versiota valikoivasti valitsemalla vain niiden versioiden valinta
 'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin',
 'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin',
 'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin',
-'cannotundelete' => 'Palauttaminen epäonnistui.',
+'cannotundelete' => 'Palauttaminen epäonnistui; joku muu on voinut jo palauttaa sivun.',
 'undeletedpage' => "'''$1 on palautettu.'''
 
 [[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
@@ -2504,7 +2526,7 @@ Alla on viimeisin estolokin tapahtuma:',
 'badipaddress' => 'IP-osoite on väärin muotoiltu.',
 'blockipsuccesssub' => 'Esto onnistui',
 'blockipsuccesstext' => 'Käyttäjä tai IP-osoite [[Special:Contributions/$1|$1]] on estetty.<br />
-Nykyiset estot löytyvät [[Special:BlockList|estolistalta]].',
+Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
 'ipb-blockingself' => 'Olet estämässä itseäsi. Oletko varma, että haluat tehdä niin?',
 'ipb-confirmhideuser' => 'Olet estämässä käyttäjää ”piilota käyttäjä” -toiminnon kanssa.  Tämä piilottaa käyttäjän nimen kaikissa luetteloissa ja lokitapahtumissa.  Oletko varma, että haluat tehdä näin?',
 'ipb-edit-dropdown' => 'Muokkaa estosyitä',
@@ -2557,7 +2579,7 @@ Alla on ote estolokista.',
 Alla on ote häivytyslokista.',
 'blocklogentry' => 'esti käyttäjän tai IP-osoitteen [[$1]]. Eston kesto $2 $3',
 'reblock-logentry' => 'muutti käyttäjän tai IP-osoitteen [[$1]] eston asetuksia. Eston kesto $2 $3',
-'blocklogtext' => 'Tämä on loki muokkausestoista ja niiden purkamisista. Automaattisesti estettyjä IP-osoitteita ei kirjata. Tutustu [[Special:BlockList|estolistaan]] nähdäksesi listan tällä hetkellä voimassa olevista estoista.',
+'blocklogtext' => 'Tämä on loki muokkausestoista ja niiden purkamisista. Automaattisesti estettyjä IP-osoitteita ei kirjata. Tutustu [[Special:BlockList|estolistaan]] nähdäksesi luettelon tällä hetkellä voimassa olevista estoista.',
 'unblocklogentry' => 'poisti käyttäjältä $1 muokkauseston',
 'block-log-flags-anononly' => 'vain kirjautumattomat käyttäjät estetty',
 'block-log-flags-nocreate' => 'tunnusten luonti estetty',
@@ -2796,7 +2818,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScriptin testaus',
-'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä.',
+'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä tässä wikissä.',
 'javascripttest-title' => 'Suoritetaan $1-testejä.',
 'javascripttest-pagetext-noframework' => 'Tämä sivu on varattu JavaScript-testien suorittamiseen.',
 'javascripttest-pagetext-unknownframework' => 'Tuntematon testausalusta $1.',
@@ -2865,6 +2887,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'tooltip-diff' => 'Näytä tehdyt muutokset',
 'tooltip-compareselectedversions' => 'Vertaile valittuja versioita',
 'tooltip-watch' => 'Lisää tämä sivu tarkkailulistaan',
+'tooltip-watchlistedit-normal-submit' => 'Poista sivut',
 'tooltip-watchlistedit-raw-submit' => 'Päivitä tarkkailulista',
 'tooltip-recreate' => 'Luo sivu uudelleen',
 'tooltip-upload' => 'Aloita tallennus',
@@ -3635,6 +3658,9 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'version-software' => 'Asennettu ohjelmisto',
 'version-software-product' => 'Tuote',
 'version-software-version' => 'Versio',
+'version-entrypoints' => 'Aloituskohtien URL-osoitteet',
+'version-entrypoints-header-entrypoint' => 'Aloituskohta',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Tiedoston osoite',
@@ -3793,6 +3819,7 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'api-error-duplicate-archive-popup-title' => 'Tiedostolla on {{PLURAL:$1|poistettu kaksoiskappale|poistettuja kaksoiskappaleita}}',
 'api-error-duplicate-popup-title' => 'Tiedoston {{PLURAL:$1|kaksoiskappale|kaksoiskappaleet}}',
 'api-error-empty-file' => 'Määrittämäsi tiedosto on tyhjä.',
+'api-error-emptypage' => 'Ei ole sallittua luoda uutta, tyhjää sivua.',
 'api-error-fetchfileerror' => 'Sisäinen virhe: jotakin meni pieleen tiedoston haussa.',
 'api-error-file-too-large' => 'Määrittämäsi tiedosto on liian iso.',
 'api-error-filename-tooshort' => 'Tiedoston nimi on liian lyhyt.',
@@ -3821,4 +3848,15 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'api-error-uploaddisabled' => 'Tiedostojen tallentaminen ei ole käytössä.',
 'api-error-verification-error' => 'Tiedosto voi olla vioittunut, tai sillä saattaa olla väärä tiedostopääte.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuutti|minuuttia}}',
+'duration-hours' => '$1 {{PLURAL:$1|tunti|tuntia}}',
+'duration-days' => '$1 {{PLURAL:$1|päivä|päivää}}',
+'duration-weeks' => '$1 {{PLURAL:$1|viikko|viikkoa}}',
+'duration-years' => '$1 {{PLURAL:$1|vuosi|vuotta}}',
+'duration-decades' => '$1 {{PLURAL:$1|vuosikymmen|vuosikymmentä}}',
+'duration-centuries' => '$1 {{PLURAL:$1|vuosisata|vuosisataa}}',
+'duration-millennia' => '$1 {{PLURAL:$1|vuosituhat|vuosituhatta}}',
+
 );
index 6c85fa8..f866e4f 100644 (file)
@@ -384,18 +384,18 @@ $messages = array(
 'tog-previewontop' => 'Afficher la prévisualisation au-dessus de la zone de modification',
 'tog-previewonfirst' => 'Afficher la prévisualisation lors de la première modification',
 'tog-nocache' => 'Désactiver le cache des pages par le navigateur',
-'tog-enotifwatchlistpages' => "M'avertir par courriel lorsqu'une page de ma liste de suivi est modifiée",
-'tog-enotifusertalkpages' => "M'avertir par courriel si ma page de discussion est modifiée",
+'tog-enotifwatchlistpages' => 'M’avertir par courriel lorsqu’une page de ma liste de suivi est modifiée',
+'tog-enotifusertalkpages' => 'M’avertir par courriel si ma page de discussion est modifiée',
 'tog-enotifminoredits' => "M'avertir par courriel même en cas de modifications mineures des pages",
 'tog-enotifrevealaddr' => 'Afficher mon adresse de courriel dans les courriels de notification',
-'tog-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent cette page",
+'tog-shownumberswatching' => 'Afficher le nombre d’utilisateurs qui suivent cette page',
 'tog-oldsig' => 'Signature existante :',
 'tog-fancysig' => 'Traiter la signature comme du wikitexte (sans lien automatique)',
-'tog-externaleditor' => "Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
-'tog-externaldiff' => "Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
+'tog-externaleditor' => 'Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d’informations]).',
+'tog-externaldiff' => 'Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d’informations]).',
 'tog-showjumplinks' => 'Activer les liens « navigation » et « recherche » en haut de page',
-'tog-uselivepreview' => "Utiliser l'aperçu rapide (nécessite JavaScript) (expérimental)",
-'tog-forceeditsummary' => "M'avertir lorsque je n'ai pas spécifié de résumé de modification",
+'tog-uselivepreview' => 'Utiliser l’aperçu rapide (nécessite JavaScript) (expérimental)',
+'tog-forceeditsummary' => 'M’avertir lorsque je n’ai pas spécifié de résumé de modification',
 'tog-watchlisthideown' => 'Masquer mes propres modifications dans la liste de suivi',
 'tog-watchlisthidebots' => 'Masquer les modifications faites par des robots dans la liste de suivi',
 'tog-watchlisthideminor' => 'Masquer les modifications mineures dans la liste de suivi',
@@ -403,18 +403,18 @@ $messages = array(
 'tog-watchlisthideanons' => 'Masquer les modifications anonymes dans la liste de suivi',
 'tog-watchlisthidepatrolled' => 'Masquer les modifications surveillées dans la liste de suivi',
 'tog-nolangconversion' => 'Désactiver la conversion des variantes linguistiques',
-'tog-ccmeonemails' => "M'envoyer une copie des courriels que j'envoie aux autres utilisateurs",
+'tog-ccmeonemails' => 'M’envoyer une copie des courriels que j’envoie aux autres utilisateurs',
 'tog-diffonly' => 'Ne pas afficher le contenu des pages sous les diffs',
 'tog-showhiddencats' => 'Afficher les catégories cachées',
 'tog-noconvertlink' => 'Désactiver la conversion des titres',
-'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
+'tog-norollbackdiff' => 'Ne pas afficher le diff lors d’une révocation',
 
 'underline-always' => 'Toujours',
 'underline-never' => 'Jamais',
 'underline-default' => 'Valeur par défaut du navigateur',
 
 # Font style option in Special:Preferences
-'editfont-style' => "Style de police de la zone d'édition :",
+'editfont-style' => 'Style de police de la zone d’édition :',
 'editfont-default' => 'Celui par défaut du navigateur',
 'editfont-monospace' => 'Police de chasse fixe',
 'editfont-sansserif' => 'Police sans empattement',
@@ -523,7 +523,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Activer les suggestions de recherche améliorées (seulement pour Vector)',
 'vector-view-create' => 'Créer',
 'vector-view-edit' => 'Modifier',
-'vector-view-history' => "Afficher l'historique",
+'vector-view-history' => 'Afficher l’historique',
 'vector-view-view' => 'Lire',
 'vector-view-viewsource' => 'Voir la source',
 'actions' => 'Actions',
@@ -573,7 +573,7 @@ $messages = array(
 'imagepage' => 'Voir la page du fichier',
 'mediawikipage' => 'Voir la page du message',
 'templatepage' => 'Voir la page du modèle',
-'viewhelppage' => "Voir la page d'aide",
+'viewhelppage' => 'Voir la page d’aide',
 'categorypage' => 'Voir la page de catégorie',
 'viewtalkpage' => 'Page de discussion',
 'otherlanguages' => 'Autres langues',
@@ -585,12 +585,12 @@ $messages = array(
 'jumpto' => 'Aller à :',
 'jumptonavigation' => 'Navigation',
 'jumptosearch' => 'rechercher',
-'view-pool-error' => "Désolé, les serveurs sont surchargés en ce moment.
-Trop d'utilisateurs cherchent à consulter cette page.
-Veuillez attendre un moment avant de retenter l'accès à cette page.
+'view-pool-error' => 'Désolé, les serveurs sont surchargés en ce moment.
+Trop dutilisateurs cherchent à consulter cette page.
+Veuillez attendre un moment avant de retenter laccès à cette page.
 
-$1",
-'pool-timeout' => "Délai dépassé durant l'attente du verrou",
+$1',
+'pool-timeout' => 'Délai dépassé durant l’attente du verrou',
 'pool-queuefull' => 'La file de travail est pleine',
 'pool-errorunknown' => 'Erreur inconnue',
 
@@ -615,8 +615,8 @@ $1",
 'privacypage' => 'Project:Confidentialité',
 
 'badaccess' => 'Erreur de permission',
-'badaccess-group0' => "Vous n'avez pas les droits suffisants pour réaliser l'action demandée.",
-'badaccess-groups' => "L'action que vous essayez de réaliser n'est accessible qu'aux utilisateurs {{PLURAL:$2|du groupe|des groupes}} : $1.",
+'badaccess-group0' => 'Vous n’avez pas les droits suffisants pour réaliser l’action demandée.',
+'badaccess-groups' => 'L’action que vous essayez de réaliser n’est accessible qu’aux utilisateurs {{PLURAL:$2|du groupe|des groupes}} : $1.',
 
 'versionrequired' => 'Version $1 de MediaWiki nécessaire',
 'versionrequiredtext' => 'La version $1 de MediaWiki est nécessaire pour utiliser cette page. Consultez [[Special:Version|la page des versions]]',
@@ -666,61 +666,61 @@ $1",
 
 # Main script and global functions
 'nosuchaction' => 'Action inconnue',
-'nosuchactiontext' => "L'action spécifiée dans l'URL est invalide.
-Vous avez peut-être mal entré l'URL ou suivi un lien erroné.
-Il peut également s'agir d'un bogue dans le logiciel utilisé par {{SITENAME}}.",
+'nosuchactiontext' => 'L’action spécifiée dans l’URL est invalide.
+Vous avez peut-être mal entré lURL ou suivi un lien erroné.
+Il peut également s’agir d’un bogue dans le logiciel utilisé par {{SITENAME}}.',
 'nosuchspecialpage' => 'Page spéciale inexistante',
-'nospecialpagetext' => "<strong>Vous avez demandé une page spéciale qui n'existe pas.</strong>
+'nospecialpagetext' => '<strong>Vous avez demandé une page spéciale qui n’existe pas.</strong>
 
-Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{int:specialpages}}]].",
+Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Erreur',
 'databaseerror' => 'Erreur de la base de données',
-'dberrortext' => "Une erreur de syntaxe de la requête dans la base de données est survenue.
+'dberrortext' => 'Une erreur de syntaxe de la requête dans la base de données est survenue.
 Ceci peut indiquer un bogue dans le logiciel.
 La dernière requête traitée par la base de données était :
 <blockquote><tt>$1</tt></blockquote>
 depuis la fonction « <tt>$2</tt> ».
-La base de données a renvoyé l'erreur « <tt>$3 : $4</tt> ».",
-'dberrortextcl' => "Une requête dans la base de données comporte une erreur de syntaxe.
+La base de données a renvoyé l’erreur « <tt>$3 : $4</tt> ».',
+'dberrortextcl' => 'Une requête dans la base de données comporte une erreur de syntaxe.
 La dernière requête émise était :
 « $1 »
 dans la fonction « $2 ».
-La base de données a renvoyé l'erreur « $3 : $4 ».",
+La base de données a renvoyé l’erreur « $3 : $4 ».',
 'laggedslavemode' => 'Attention, cette page peut ne pas contenir les toutes dernières modifications effectuées',
 'readonly' => 'Base de données verrouillée',
-'enterlockreason' => "Indiquez la raison du verrouillage ainsi qu'une estimation de sa durée",
-'readonlytext' => "Les ajouts et mises à jour de la base de données sont actuellement bloqués, probablement pour permettre la maintenance de la base, après quoi, tout rentrera dans l'ordre.
+'enterlockreason' => 'Indiquez la raison du verrouillage ainsi qu’une estimation de sa durée',
+'readonlytext' => 'Les ajouts et mises à jour de la base de données sont actuellement bloqués, probablement pour permettre la maintenance de la base, après quoi, tout rentrera dans l’ordre.
 
-L'administrateur ayant verrouillé la base de données a fourni l'explication suivante :<br />$1",
-'missing-article' => "La base de données n'a pas trouvé le texte d'une page qu'elle aurait dû trouver, intitulée « $1 » $2.
+L’administrateur ayant verrouillé la base de données a fourni l’explication suivante :<br />$1',
+'missing-article' => "La base de données n’a pas trouvé le texte d'une page qu’elle aurait dû trouver, intitulée « $1 » $2.
 
-Généralement, cela survient en suivant un lien vers un diff périmé ou vers l'historique d'une page supprimée.
+Généralement, cela survient en suivant un lien vers un diff périmé ou vers lhistorique d'une page supprimée.
 
-Si ce n'est pas le cas, il peut s'agir d'un bogue dans le programme.
-Veuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer l'URL du lien.",
+Si ce n’est pas le cas, il peut s’agir d'un bogue dans le programme.
+Veuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer lURL du lien.",
 'missingarticle-rev' => '(numéro de version : $1)',
 'missingarticle-diff' => '(diff : $1, $2)',
 'readonly_lag' => 'La base de données a été automatiquement verrouillée pendant que les serveurs secondaires rattrapent leur retard sur le serveur principal.',
 'internalerror' => 'Erreur interne',
 'internalerror_info' => 'Erreur interne : $1',
-'fileappenderrorread' => "Impossible de lire « $1 » lors de l'insertion",
-'fileappenderror' => "Impossible d'ajouter « $1 » à « $2 ».",
+'fileappenderrorread' => 'Impossible de lire « $1 » lors de l’insertion',
+'fileappenderror' => 'Impossible d’ajouter « $1 » à « $2 ».',
 'filecopyerror' => 'Impossible de copier le fichier « $1 » vers « $2 ».',
 'filerenameerror' => 'Impossible de renommer le fichier « $1 » en « $2 ».',
 'filedeleteerror' => 'Impossible de supprimer le fichier « $1 ».',
 'directorycreateerror' => 'Impossible de créer le dossier « $1 ».',
 'filenotfound' => 'Impossible de trouver le fichier « $1 ».',
-'fileexistserror' => "Impossible d'écrire dans le dossier « $1 » : le fichier existe",
+'fileexistserror' => 'Impossible d’écrire dans le dossier « $1 » : le fichier existe',
 'unexpected' => 'Valeur inattendue : « $1 » = « $2 ».',
 'formerror' => 'Erreur : Impossible de soumettre le formulaire',
 'badarticleerror' => 'Cette action ne peut pas être effectuée sur cette page.',
-'cannotdelete' => "Impossible de supprimer la page ou le fichier « $1 ».
-La suppression a peut-être déjà été effectuée par quelqu'un d'autre.",
+'cannotdelete' => 'Impossible de supprimer la page ou le fichier « $1 ».
+La suppression a peut-être déjà été effectuée par quelqu’un d’autre.',
 'cannotdelete-title' => 'Impossible de supprimer la page « $1 »',
 'badtitle' => 'Mauvais titre',
-'badtitletext' => "Le titre de la page demandée est invalide, vide, ou il s'agit d'un titre inter-langue ou inter-projet mal lié. Il contient peut-être un ou plusieurs caractères qui ne peuvent pas être utilisés dans les titres.",
+'badtitletext' => 'Le titre de la page demandée est invalide, vide, ou il s’agit d’un titre inter-langue ou inter-projet mal lié. Il contient peut-être un ou plusieurs caractères qui ne peuvent pas être utilisés dans les titres.',
 'perfcached' => 'Les données suivantes sont en cache et peuvent ne pas être à jour. Un maximum de {{PLURAL:$1|un résultat|$1 résultats}} est disponible dans le cache.',
 'perfcachedts' => 'Les données suivantes sont en cache et ont été mises à jour pour la dernière fois à $1. Un maximum de {{PLURAL:$4|un résultat|$4 résultats}} est disponible dans le cache.',
 'querypage-no-updates' => 'Les mises à jour pour cette page sont actuellement désactivées. Les données ci-dessous ne sont pas mises à jour.',
@@ -730,25 +730,25 @@ Requête : $2',
 'viewsource' => 'Voir le texte source',
 'viewsource-title' => 'Voir la source de $1',
 'actionthrottled' => 'Action limitée',
-'actionthrottledtext' => "Pour lutter contre les pourriels, l'utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s'avère que vous avez dépassé cette limite.
-Essayez à nouveau dans quelques minutes.",
+'actionthrottledtext' => 'Pour lutter contre les pourriels, l’utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s’avère que vous avez dépassé cette limite.
+Essayez à nouveau dans quelques minutes.',
 'protectedpagetext' => 'Cette page a été protégée pour empêcher sa modification.',
 'viewsourcetext' => 'Vous pouvez voir et copier le contenu de la page :',
 'viewyourtext' => "Vous pouvez voir et copier le contenu de '''vos modifications''' à cette page :",
-'protectedinterface' => "Cette page fournit du texte d'interface pour le logiciel et est protégée pour éviter les abus.",
-'editinginterface' => "'''Attention :''' vous êtes en train de modifier une page utilisée pour créer le texte de l'interface du logiciel. Les changements se répercuteront, selon le contexte, sur toutes ou certaines pages visibles par les autres utilisateurs. Pour les traductions, nous vous invitons à utiliser le projet MediaWiki d'internationalisation des messages [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
+'protectedinterface' => 'Cette page fournit du texte d’interface pour le logiciel et est protégée pour éviter les abus.',
+'editinginterface' => "'''Attention :''' vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel. Les changements se répercuteront, selon le contexte, sur toutes ou certaines pages visibles par les autres utilisateurs. Pour les traductions, nous vous invitons à utiliser le projet MediaWiki d’internationalisation des messages [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
 'sqlhidden' => '(Requête SQL cachée)',
-'cascadeprotected' => "Cette page est protégée car elle est incluse 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 :
-$2",
-'namespaceprotected' => "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
-'customcssprotected' => "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.",
-'customjsprotected' => "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur.",
+'cascadeprotected' => 'Cette page est protégée car elle est incluse 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 :
+$2',
+'namespaceprotected' => "Vous n’avez pas la permission de modifier les pages de l’espace de noms « '''$1''' ».",
+'customcssprotected' => 'Vous n’avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d’un autre utilisateur.',
+'customjsprotected' => 'Vous n’avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d’un autre utilisateur.',
 'ns-specialprotected' => 'Les pages dans l’espace de noms « {{ns:special}} » ne peuvent pas être modifiées.',
 'titleprotected' => "Ce titre a été protégé à la création par [[User:$1|$1]].
 Le motif avancé est « ''$2'' ».",
-'filereadonlyerror' => 'Impossible de modifier le fichier "$1" parce que le répertoire de fichiers "$2" est en lecture seule.
+'filereadonlyerror' => 'Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.
 
-L\'administrateur qui l\'a verrouillé a fourni ce motif: "$3".',
+L’administrateur qui l’a verrouillé a fourni ce motif: « $3 ».',
 
 # Virus scanner
 'virus-badscanner' => "Mauvaise configuration : scanneur de virus inconnu : ''$1''",
@@ -760,17 +760,17 @@ L\'administrateur qui l\'a verrouillé a fourni ce motif: "$3".',
 
 Vous pouvez continuer à utiliser {{SITENAME}} de façon anonyme, [[Special:UserLogin|vous reconnecter]] sous le même nom ou un autre.
 Notez que certaines pages peuvent être encore affichées comme si vous étiez toujours connecté(e), jusqu’à ce que vous effaciez le cache de votre navigateur.",
-'welcomecreation' => "== Bienvenue, $1 ! ==
+'welcomecreation' => '== Bienvenue, $1 ! ==
 
 Votre compte a été créé.
-N'oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SITENAME}}]].",
-'yourname' => "Nom d'utilisateur :",
+N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SITENAME}}]].',
+'yourname' => 'Nom d’utilisateur :',
 'yourpassword' => 'Mot de passe :',
 'yourpasswordagain' => 'Confirmez le mot de passe :',
 'remembermypassword' => 'Me reconnecter automatiquement aux prochaines visites avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
 'securelogin-stick-https' => 'Rester connecté en HTTPS après la connexion',
 'yourdomainname' => 'Votre domaine',
-'externaldberror' => "Une erreur s'est produite avec la base de données d'authentification externe, ou bien vous n'êtes pas autorisé{{GENDER:||e|(e)}} à mettre à jour votre compte externe.",
+'externaldberror' => 'Une erreur s’est produite avec la base de données d’authentification externe, ou bien vous n’êtes pas autorisé{{GENDER:||e|(e)}} à mettre à jour votre compte externe.',
 'login' => 'Connexion',
 'nav-login-createaccount' => 'Créer un compte ou se connecter',
 'loginprompt' => "Vous devez activer les témoins (''cookies'') pour vous connecter à {{SITENAME}}.",
@@ -779,7 +779,7 @@ N'oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SIT
 'logout' => 'Se déconnecter',
 'userlogout' => 'Déconnexion',
 'notloggedin' => 'Non connecté',
-'nologin' => "Vous n'êtes pas encore inscrit ? $1.",
+'nologin' => 'Vous n’êtes pas encore inscrit ? $1.',
 'nologinlink' => 'Créer un compte',
 'createaccount' => 'Créer un compte',
 'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
@@ -788,46 +788,46 @@ N'oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SIT
 'createaccountmail' => 'par courriel',
 'createaccountreason' => 'Motif :',
 'badretype' => 'Les mots de passe que vous avez saisis ne correspondent pas.',
-'userexists' => "Nom d'utilisateur entré déjà utilisé.
-Veuillez choisir un nom différent.",
+'userexists' => 'Nom d’utilisateur entré déjà utilisé.
+Veuillez choisir un nom différent.',
 'loginerror' => 'Erreur de connexion',
 'createaccounterror' => 'Impossible de créer le compte : $1',
-'nocookiesnew' => "Le compte utilisateur a été créé, mais vous n'êtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des témoins (''cookies'') pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
+'nocookiesnew' => "Le compte utilisateur a été créé, mais vous nêtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des témoins (''cookies'') pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
 'nocookieslogin' => "{{SITENAME}} utilise des témoins (''cookies'') pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.",
-'nocookiesfornew' => "Le compte utilisateur n'a pas été créé, car nous n'avons pas pu identifier son origine.
-Vérifiez que vous avez activé les cookies, rechargez la page et rééssayez.",
-'noname' => "Vous n'avez pas saisi un nom d'utilisateur valide.",
+'nocookiesfornew' => 'Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.
+Vérifiez que vous avez activé les cookies, rechargez la page et réessayez.',
+'noname' => 'Vous n’avez pas saisi un nom d’utilisateur valide.',
 'loginsuccesstitle' => 'Connexion réussie',
 'loginsuccess' => 'Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».',
-'nosuchuser' => "L'utilisateur « $1 » n'existe pas.
-Les noms d'utilisateurs sont sensibles à la casse.
-Vérifiez l'orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].",
-'nosuchusershort' => "Il n'y a pas de contributeur avec le nom « $1 ». Veuillez vérifier l'orthographe.",
-'nouserspecified' => "Vous devez saisir un nom d'utilisateur.",
+'nosuchuser' => 'L’utilisateur « $1 » n’existe pas.
+Les noms dutilisateurs sont sensibles à la casse.
+Vérifiez l’orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].',
+'nosuchusershort' => 'Il n’y a pas de contributeur avec le nom « $1 ». Veuillez vérifier l’orthographe.',
+'nouserspecified' => 'Vous devez saisir un nom d’utilisateur.',
 'login-userblocked' => 'Cet utilisateur est bloqué. Connexion non autorisée.',
 'wrongpassword' => 'Le mot de passe est incorrect. Veuillez essayer à nouveau.',
-'wrongpasswordempty' => "Vous n'avez pas entré de mot de passe. Veuillez essayer à nouveau.",
+'wrongpasswordempty' => 'Vous n’avez pas entré de mot de passe. Veuillez essayer à nouveau.',
 'passwordtooshort' => 'Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.',
-'password-name-match' => "Votre mot de passe doit être différent de votre nom d'utilisateur.",
-'password-login-forbidden' => "L'utilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
+'password-name-match' => 'Votre mot de passe doit être différent de votre nom d’utilisateur.',
+'password-login-forbidden' => "Lutilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
 'mailmypassword' => 'Recevoir un nouveau mot de passe par courriel',
 'passwordremindertitle' => 'Nouveau mot de passe temporaire pour {{SITENAME}}',
-'passwordremindertext' => "Quelqu'un (probablement vous, ayant l'adresse IP $1) a demandé un nouveau mot de
+'passwordremindertext' => 'Quelqu’un (probablement vous, ayant l’adresse IP $1) a demandé un nouveau mot de
 passe pour {{SITENAME}} ($4 ). Un mot de passe temporaire a été créé pour
-l'utilisateur « $2 » et est « $3 ». Si cela était votre intention, vous devrez
+lutilisateur « $2 » et est « $3 ». Si cela était votre intention, vous devrez
 vous connecter et choisir un nouveau mot de passe.
 Votre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.
 
-Si vous n'êtes pas l'auteur de cette demande, ou si vous vous souvenez à présent
+Si vous n’êtes pas l’auteur de cette demande, ou si vous vous souvenez à présent
 de votre ancien mot de passe et que vous ne souhaitez plus en changer, vous
-pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
-'noemail' => "Aucune adresse de courriel n'a été enregistrée pour l'utilisateur « $1 ».",
+pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
+'noemail' => "Aucune adresse de courriel na été enregistrée pour l'utilisateur « $1 ».",
 'noemailcreate' => 'Vous devez fournir une adresse de courriel valide',
-'passwordsent' => "Un nouveau mot de passe a été envoyé à l'adresse de courriel de l'utilisateur « $1 ». Veuillez vous reconnecter après l'avoir reçu.",
+'passwordsent' => 'Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisateur « $1 ». Veuillez vous reconnecter après l’avoir reçu.',
 'blocked-mailpassword' => 'Votre adresse IP est bloquée en écriture, la fonction de rappel du mot de passe est donc désactivée pour éviter les abus.',
-'eauthentsent' => "Un courriel de confirmation a été envoyé à l'adresse indiquée.
-Avant qu'un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.",
-'throttled-mailpassword' => "Un courriel de rappel de votre mot de passe a déjà été envoyé durant {{PLURAL:$1|la dernière heure|les $1 dernières heures}}. Afin d'éviter les abus, un seul courriel de rappel sera envoyé par {{PLURAL:$1|heure|intervalle de $1 heures}}.",
+'eauthentsent' => 'Un courriel de confirmation a été envoyé à l’adresse indiquée.
+Avant qu’un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.',
+'throttled-mailpassword' => 'Un courriel de rappel de votre mot de passe a déjà été envoyé durant {{PLURAL:$1|la dernière heure|les $1 dernières heures}}. Afin d’éviter les abus, un seul courriel de rappel sera envoyé par {{PLURAL:$1|heure|intervalle de $1 heures}}.',
 'mailerror' => 'Erreur lors de l’envoi du courriel : $1',
 'acct_creation_throttle_hit' => 'Quelqu’un utilisant votre adresse IP a créé {{PLURAL:$1|un compte|$1 comptes}} au cours des dernières 24 heures, ce qui constitue la limite autorisée dans cet intervalle de temps.
 Par conséquent, la création de compte a été temporairement désactivée pour cette adresse IP.',
@@ -1029,8 +1029,9 @@ La dernière entrée du registre des blocages est indiquée ci-dessous à titre
 'userinvalidcssjstitle' => "'''Attention :''' il n’existe pas d’habillage « $1 ». Rappelez-vous que les pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Mis à jour)',
 'note' => "'''Note :'''",
-'previewnote' => "'''Rappelez-vous que ce n'est qu'une prévisualisation.'''
-Vos modifications n'ont pas encore été enregistrées! [[#editform|→ Continuer la modification]]",
+'previewnote' => "'''Rappelez-vous que ce n’est qu’une prévisualisation.'''
+Vos modifications n’ont pas encore été enregistrées !",
+'continue-editing' => 'Continuer la modification',
 'previewconflict' => 'Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu’il apparaîtra si vous choisissez de le publier.',
 'session_fail_preview' => "'''Nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.'''
 Veuillez réessayer.
@@ -1044,7 +1045,7 @@ Si cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis recon
 'token_suffix_mismatch' => "'''Votre modification n’a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l’identifiant de modification.'''
 Ce rejet est nécessaire pour empêcher la corruption du texte de la page.
 Ce problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
-'edit_form_incomplete' => "'''Certaines parties du formulaire de modification n'ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
+'edit_form_incomplete' => "'''Certaines parties du formulaire de modification nont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
 'editing' => 'Modification de $1',
 'creating' => 'Création de $1',
 'editingsection' => 'Modification de $1 (section)',
@@ -1121,6 +1122,10 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maint
 'parser-template-loop-warning' => 'Modèle en boucle détecté : [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limite de profondeur des appels de modèles dépassée ($1)',
 'language-converter-depth-warning' => 'Limite de profondeur du convertisseur de langue dépassée ($1)',
+'node-count-exceeded-category' => 'Pages où nombre de nœuds est dépassé',
+'node-count-exceeded-warning' => 'Page dépassant le nombre de nœuds',
+'expansion-depth-exceeded-category' => "Pages où la profondeur d'expansion est dépassée",
+'expansion-depth-exceeded-warning' => "Page dépassant la profondeur d'expansion",
 
 # "Undo" feature
 'undo-success' => 'Cette modification va être défaite. Veuillez vérifier les modifications ci-dessous, puis publier si c’est bien ce que vous voulez faire.',
@@ -1166,7 +1171,7 @@ Elle a peut-être été effacée ou renommée.
 Essayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.',
 
 # Revision deletion
-'rev-deleted-comment' => "(résumé d'édition enlevé)",
+'rev-deleted-comment' => '(résumé d’édition enlevé)',
 'rev-deleted-user' => '(nom d’utilisateur supprimé)',
 'rev-deleted-event' => '(entrée supprimée)',
 'rev-deleted-user-contribs' => '[nom d’utilisateur ou adresse IP supprimée - modification cachée sur les contributions]',
@@ -1263,7 +1268,7 @@ Vérifiez les journaux.',
 # Suppression log
 'suppressionlog' => 'Journal des suppressions',
 'suppressionlogtext' => 'Voici la liste des suppressions et des blocages qui portent sur du contenu caché aux administrateurs.
-Voir la [[Special:BlockList|liste des adresses IP et utilisateurs bloqués]] pour la liste des bannissements et des blocages actuellement opérationnels.',
+Voir la [[Special:BlockList|liste des blocages]] pour la liste des bannissements et des blocages actuellement opérationnels.',
 
 # History merging
 'mergehistory' => 'Fusionner les historiques des pages',
@@ -1303,7 +1308,7 @@ Assurez-vous que cette opération conservera la continuité de l’historique de
 'showhideselectedversions' => 'Afficher/masquer les versions sélectionnées',
 'editundo' => 'défaire',
 'diff-multi' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par {{PLURAL:$2|un utilisateur|$2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})',
-'diff-multi-manyusers' => "({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par plus {{PLURAL:$2|d'un utilisateur|de $2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})",
+'diff-multi-manyusers' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par plus {{PLURAL:$2|d’un utilisateur|de $2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})',
 
 # Search results
 'searchresults' => 'Résultats de la recherche',
@@ -1328,7 +1333,7 @@ Assurez-vous que cette opération conservera la continuité de l’historique de
 'searchhelp-url' => 'Help:Accueil',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rechercher les pages commençant par ce préfixe]]',
 'searchprofile-articles' => 'Pages de contenu',
-'searchprofile-project' => 'Pages d’aide et du projet',
+'searchprofile-project' => 'Pages d’aide et de projet',
 'searchprofile-images' => 'Multimédia',
 'searchprofile-everything' => 'Tout',
 'searchprofile-advanced' => 'Recherche avancée',
@@ -1698,18 +1703,18 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 # Upload
 'upload' => 'Importer un fichier',
 'uploadbtn' => 'Importer le fichier',
-'reuploaddesc' => "Annuler et retourner au formulaire d'import",
+'reuploaddesc' => 'Annuler et retourner au formulaire d’import',
 'upload-tryagain' => 'Envoyer la description du fichier modifiée',
 'uploadnologin' => 'Non connecté(e)',
 'uploadnologintext' => 'Vous devez être [[Special:UserLogin|connecté(e)]] pour importer des fichiers sur le serveur.',
-'upload_directory_missing' => "Le répertoire d'import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.",
-'upload_directory_read_only' => "Le répertoire d'import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.",
-'uploaderror' => "Erreur lors de l'import",
+'upload_directory_missing' => 'Le répertoire d’import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.',
+'upload_directory_read_only' => 'Le répertoire d’import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.',
+'uploaderror' => 'Erreur lors de l’import',
 'upload-recreate-warning' => "'''Attention : Un fichier portant ce nom a été supprimé ou déplacé.'''
 
 Le journal des suppressions et celui des déplacements de cette page sont affichés ici pour informations :",
 'uploadtext' => "Utilisez ce formulaire pour importer des fichiers sur le serveur.
-Pour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. L'import est aussi enregistrés dans le [[Special:Log/upload|journal d'import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].
+Pour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. Limport est aussi enregistrés dans le [[Special:Log/upload|journal d'import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].
 
 Pour inclure un fichier dans une page, utilisez un lien de la forme :
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas d’une image) ;
@@ -1718,7 +1723,7 @@ Pour inclure un fichier dans une page, utilisez un lien de la forme :
 'upload-permitted' => 'Formats de fichiers autorisés : $1.',
 'upload-preferred' => 'Formats de fichiers préférés : $1.',
 'upload-prohibited' => 'Formats de fichiers interdits : $1.',
-'uploadlog' => "Journal d'import de fichiers",
+'uploadlog' => 'Journal d’import de fichiers',
 'uploadlogpage' => "Journal d'import de fichiers",
 'uploadlogpagetext' => 'Voici la liste des derniers fichiers importés sur le serveur.
 Voyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentation plus visuelle.',
@@ -1923,13 +1928,14 @@ Pour une sécurité optimale, img_auth.php est désactivé.',
 
 # HTTP errors
 'http-invalid-url' => 'URL incorrecte : $1',
-'http-invalid-scheme' => 'Les URLs avec le schéma « $1 » ne sont pas supportées',
+'http-invalid-scheme' => 'Les URL avec le schéma « $1 » ne sont pas supportées.',
 'http-request-error' => 'Erreur inconnue lors de l’envoi de la requête.',
 'http-read-error' => 'Erreur de lecture HTTP.',
 'http-timed-out' => 'La requête HTTP a expiré.',
 'http-curl-error' => 'Erreur lors de la récupération de l’URL : $1',
 'http-host-unreachable' => 'Impossible d’atteindre l’URL.',
 'http-bad-status' => 'Il y a eu un problème lors de la requête HTTP : $1 $2',
+'http-truncated-body' => 'Le corps de la requête n’a été reçu que partiellement.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL injoignable',
@@ -1999,6 +2005,7 @@ Vous voulez peut-être modifier la description sur sa [$2 page de description].'
 'shared-repo-from' => 'de : $1',
 'shared-repo' => 'un dépôt partagé',
 'shared-repo-name-wikimediacommons' => 'Wikimédia Commons',
+'filepage.css' => '/* Les styles CSS placés ici sont inclus dans la page de description du fichier, également incluse sur les clients wikis étrangers */',
 
 # File reversion
 'filerevert' => 'Rétablir $1',
@@ -2208,6 +2215,11 @@ Vous pouvez personnaliser l’affichage en sélectionnant le type de journal, le
 'allpages-bad-ns' => '{{SITENAME}} n’a pas d’espace de noms « $1 ».',
 'allpages-hide-redirects' => 'Masquer les redirections',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Vous visualisez une version de cette page mise en cache, qui peut être dater d'au plus $1.",
+'cachedspecial-viewing-cached-ts' => 'Vous visualisez une version de cette page mise en cache, qui pourrait ne pas être complètement à jour.',
+'cachedspecial-refresh-now' => 'Voir le plus récent.',
+
 # Special:Categories
 'categories' => 'Liste des catégories',
 'categoriespagetext' => '{{PLURAL:$1|La catégorie suivante est utilisée|Les catégories suivantes sont utilisées}} par des pages ou fichiers.
@@ -2567,8 +2579,8 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => "Contributions de l'utilisateur",
-'contributions-title' => "Liste des contributions de l'utilisateur $1",
+'contributions' => 'Contributions de l’utilisateur',
+'contributions-title' => 'Liste des contributions de l’utilisateur $1',
 'mycontris' => 'Contributions',
 'contribsub2' => 'Pour $1 ($2)',
 'nocontribs' => 'Aucune modification correspondant à ces critères n’a été trouvée.',
@@ -2651,7 +2663,7 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 'badipaddress' => 'Adresse IP incorrecte',
 'blockipsuccesssub' => 'Blocage réussi',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e|}}.<br />
-Consultez la [[Special:BlockList|liste des adresses IP et comptes bloqués]] pour revoir les blocages.',
+Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.',
 'ipb-blockingself' => 'Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain de vouloir faire cela ?',
 'ipb-confirmhideuser' => 'Vous êtes sur le point de bloquer un utilisateur avec « cacher l’utilisateur » activé. Cela supprime le nom de l’utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr de vouloir le faire ?',
 'ipb-edit-dropdown' => 'Modifier les motifs de blocage par défaut',
@@ -2704,7 +2716,7 @@ Le motif fourni pour le blocage de $1 est : « $2 ».',
 'reblock-logentry' => 'a modifié les paramètres du blocage de [[$1]] avec une expiration au $2 $3',
 'blocklogtext' => 'Ceci est le journal des actions de blocages et déblocages d’utilisateurs.
 Les adresses IP automatiquement bloquées ne sont pas listées.
-Consultez la [[Special:BlockList|liste des IP bloquées]] pour voir les bannissements et blocages effectivement en cours.',
+Consultez la [[Special:BlockList|liste des blocages]] pour voir les bannissements et blocages effectivement en cours.',
 'unblocklogentry' => 'a débloqué $1',
 'block-log-flags-anononly' => 'utilisateurs anonymes seulement',
 'block-log-flags-nocreate' => 'création de compte interdite',
@@ -3048,9 +3060,14 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'chick.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Chick. */',
 'simple.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Simple. */',
 'modern.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Modern. */',
+'vector.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */',
 'print.css' => '/* Le CSS placé ici affectera les impressions */',
 'handheld.css' => '/* Le CSS placé ici affectera les appareils mobiles en fonction de l\'habillage configuré $wgHandheldStyle */',
+'noscript.css' => '/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */',
+'group-autoconfirmed.css' => '/* Le CSS placé ici affectera les utilisateurs auto-confirmés seulement. */',
+'group-bot.css' => '/* Le CSS placé ici affectera les robots seulement. */',
 'group-sysop.css' => '/* Le CSS inclus ici n’affectera que les administrateurs */',
+'group-bureaucrat.css' => '/* Le CSS inclus ici n’affectera que les bureaucrates */',
 
 # Scripts
 'common.js' => '/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */',
@@ -3821,6 +3838,11 @@ Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licen
 'version-software' => 'Logiciels installés',
 'version-software-product' => 'Produit',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'URL de point d’entrée',
+'version-entrypoints-header-entrypoint' => "Point d'entrée",
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d\'article]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Chemin de script]',
 
 # Special:FilePath
 'filepath' => 'Chemin d’accès du fichier',
@@ -3845,7 +3867,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'specialpages-note' => '----
 * Pages spéciales normales.
 * <span class="mw-specialpagerestricted">Pages spéciales restreintes.</span>
-* <span class="mw-specialpagecached">Pages spéciales seulement en cache (pourraient être obsolètes).</span>',
+* <span class="mw-specialpagecached">Pages spéciales seulement en cache (pourraient être désuètes).</span>',
 'specialpages-group-maintenance' => 'Rapports de maintenance',
 'specialpages-group-other' => 'Autres pages spéciales',
 'specialpages-group-login' => 'S’identifier / s’inscrire',
@@ -3866,7 +3888,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 # External image whitelist
 'external_image_whitelist' => ' #Laisser cette ligne exactement telle quelle.<pre>
 #Indiquer les fragments d’expressions rationnelles (juste la partie indiquée entre les //) ci-dessous.
-#Ils correspondront avec les URLs des images externes.
+#Ils correspondront avec les URL des images externes.
 #Celles qui correspondent s’afficheront comme des images, sinon seul un lien vers l’image sera affiché.
 #Les lignes commençant par un # seront considérées comme des commentaires.
 #Cette liste n’est pas sensible à la casse.
@@ -4009,4 +4031,15 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'api-error-uploaddisabled' => 'Le versement est désactivé sur ce wiki.',
 'api-error-verification-error' => 'Ce fichier peut être corrompu, ou son extension est incorrecte.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|seconde|secondes}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minute|minutes}}',
+'duration-hours' => '$1 {{PLURAL:$1|heure|heures}}',
+'duration-days' => '$1 {{PLURAL:$1|jour|jours}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semaine|semaines}}',
+'duration-years' => '$1 {{PLURAL:$1|année|années}}',
+'duration-decades' => '$1 {{PLURAL:$1|décennie|décennies}}',
+'duration-centuries' => '$1 {{PLURAL:$1|siècle|siècles}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millénaire|millénaires}}',
+
 );
index 50f7cd2..4253e5a 100644 (file)
@@ -599,7 +599,7 @@ no [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a dheasachadh]</spa
 no <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span>.',
 'updated' => '(Air ùrachadh)',
 'previewnote' => "'''Cuimhnich nach eil ann ach ro-shealladh.'''
-Cha deach na mùthaidhean agad a shàbhaladh fhathast! [[#editform|→ Lean ort a' deasachadh]]",
+Cha deach na mùthaidhean agad a shàbhaladh fhathast!",
 'editing' => "A' deasachadh $1",
 'editingsection' => "A' deasachadh $1 (earrann)",
 'editconflict' => 'Còmhstri deasachaidh: $1',
index 69a717b..106df85 100644 (file)
@@ -914,7 +914,8 @@ Velaquí está a última entrada do rexistro de bloqueos, por se quere consultal
 Lembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo {{ns:user}}:Foo/vector.css no canto de {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!''' [[#editform|→ Continuar editando]]",
+'previewnote' => "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
+'continue-editing' => 'Continuar editando',
 'previewconflict' => 'Esta vista previa mostra o texto na área superior tal e como aparecerá se escolle gardar.',
 'session_fail_preview' => "'''O sistema non pode procesar a súa edición porque se perderon os datos de inicio da sesión.
 Por favor, inténteo de novo.
@@ -1012,6 +1013,10 @@ Estes argumentos foron omitidos.",
 'parser-template-loop-warning' => 'Detectouse un modelo en bucle: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Excedeuse o límite da profundidade do recurso do modelo ($1)',
 'language-converter-depth-warning' => 'Excedeuse o límite de profundidade do convertedor de lingua ($1)',
+'node-count-exceeded-category' => 'Páxinas nas que se supera o número de nodos',
+'node-count-exceeded-warning' => 'Páxina que supera o número de nodos',
+'expansion-depth-exceeded-category' => 'Páxinas nas que se supera a profundidade de expansión',
+'expansion-depth-exceeded-warning' => 'Páxina que supera a profundidade de expansión',
 
 # "Undo" feature
 'undo-success' => 'A edición pódese desfacer.
@@ -1156,7 +1161,7 @@ Por favor, comprobe os rexistros.',
 # Suppression log
 'suppressionlog' => 'Rexistro de supresións',
 'suppressionlogtext' => 'A continuación móstrase unha lista coas eliminacións e cos bloqueos recentes, que inclúen contido oculto dos administradores.
-Vexa a [[Special:BlockList|lista de enderezos IP bloqueados]] para comprobar as prohibicións e os bloqueos vixentes.',
+Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixentes.',
 
 # History merging
 'mergehistory' => 'Fusionar os historiais das páxinas',
@@ -1926,7 +1931,7 @@ Poida que queira editar a descrición da [$2 páxina de descrición do ficheiro]
 'filedelete-otherreason' => 'Outro motivo:',
 'filedelete-reason-otherlist' => 'Outro motivo',
 'filedelete-reason-dropdown' => '*Motivos frecuentes para borrar
-** Violación dos dereitos de autor
+** Violación dos dereitos de autoría
 ** Ficheiro duplicado',
 'filedelete-edit-reasonlist' => 'Editar os motivos de borrado',
 'filedelete-maintenance' => 'Os borrados e restauracións de ficheiros están desactivados temporalmente durante o mantemento.',
@@ -2109,6 +2114,11 @@ Pode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario
 'allpages-bad-ns' => '{{SITENAME}} carece do espazo de nomes "$1".',
 'allpages-hide-redirects' => 'Agochar as redireccións',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Está a ver unha versión da páxina gardada na caché, que pode ser de hai $1.',
+'cachedspecial-viewing-cached-ts' => 'Está a ver unha versión da páxina gardada na caché, que pode non estar completamente actualizada.',
+'cachedspecial-refresh-now' => 'Ir á versión máis recente.',
+
 # Special:Categories
 'categories' => 'Categorías',
 'categoriespagetext' => '{{PLURAL:$1|A seguinte categoría contén|As seguintes categorías conteñen}} páxinas ou contidos multimedia.
@@ -2309,8 +2319,8 @@ No $2 pode ver unha lista cos borrados máis recentes.',
 'deleteotherreason' => 'Outro motivo:',
 'deletereasonotherlist' => 'Outro motivo',
 'deletereason-dropdown' => '*Motivos frecuentes para borrar
-** Solicitado polo autor
-** Violación dos dereitos de autor
+** Solicitado pola persoa que o creou
+** Violación dos dereitos de autoría
 ** Vandalismo',
 'delete-edit-reasonlist' => 'Editar os motivos de borrado',
 'delete-toobig' => 'Esta páxina conta cun historial longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.
@@ -2551,8 +2561,8 @@ Explique a razón específica do bloqueo (por exemplo, citando as páxinas concr
 'ipb-confirm' => 'Confirmar o bloqueo',
 'badipaddress' => 'O enderezo IP non é válido',
 'blockipsuccesssub' => 'Bloqueo exitoso',
-'blockipsuccesstext' => 'O enderezo IP [[Special:Contributions/$1|$1]] foi bloqueado.<br />
-Olle a [[Special:BlockList|lista de enderezos IP e usuarios bloqueados]] para revisalo.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />
+Olle a [[Special:BlockList|lista de bloqueos]] para revisalo.',
 'ipb-blockingself' => 'Está a piques de se bloquear! Está seguro de querer facelo?',
 'ipb-confirmhideuser' => 'Está a piques de bloquear un usuario coa opción "agochar o usuario" activada. Isto suprime o nome de usuario de todas as listas e entradas de rexistro. Está seguro de querer facelo?',
 'ipb-edit-dropdown' => 'Editar os motivos de bloqueo',
@@ -2605,7 +2615,7 @@ O motivo do bloqueo de $1 é: "$2"',
 'reblock-logentry' => 'cambiou as configuracións do bloqueo de "[[$1]]" cunha caducidade de $2 $3',
 'blocklogtext' => 'Este é o rexistro das accións de bloqueo e desbloqueo de usuarios.
 Non se listan os enderezos IP bloqueados automaticamente.
-Olle a [[Special:BlockList|lista de enderezos IP e usuarios bloqueados]] se quere comprobar a lista cos bloqueos vixentes.',
+Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixentes.',
 'unblocklogentry' => 'desbloqueou a "$1"',
 'block-log-flags-anononly' => 'só os usuarios anónimos',
 'block-log-flags-nocreate' => 'desactivada a creación de contas',
@@ -3715,6 +3725,11 @@ Debería recibir [{{SERVER}}{{SCRIPTPATH}}/COPYING unha copia da licenza públic
 'version-software' => 'Software instalado',
 'version-software-product' => 'Produto',
 'version-software-version' => 'Versión',
+'version-entrypoints' => 'Enderezos URL de punto de entrada',
+'version-entrypoints-header-entrypoint' => 'Punto de entrada',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta do artigo]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta da escritura]',
 
 # Special:FilePath
 'filepath' => 'Ruta do ficheiro',
@@ -3902,4 +3917,15 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 'api-error-uploaddisabled' => 'As cargas están desactivadas neste wiki.',
 'api-error-verification-error' => 'Este ficheiro podería estar corrupto ou ter unha extensión incorrecta.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minutos}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|horas}}',
+'duration-days' => '$1 {{PLURAL:$1|día|días}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semana|semanas}}',
+'duration-years' => '$1 {{PLURAL:$1|ano|anos}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décadas}}',
+'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
+
 );
index c47031a..194b9c6 100644 (file)
@@ -252,7 +252,7 @@ $messages = array(
 'noindex-category' => 'Syte wu nit verzeichnet sin',
 'broken-file-category' => 'Syte mit kaputtige Dateilink',
 
-'about' => 'Über',
+'about' => 'Iber',
 'article' => 'Inhaltssyte',
 'newwindow' => '(imene nöie Fänschter)',
 'cancel' => 'Abbräche',
@@ -310,7 +310,7 @@ $messages = array(
 'create' => 'Erstelle',
 'editthispage' => 'Syte bearbeite',
 'create-this-page' => 'Die Syte afange',
-'delete' => 'Lösche',
+'delete' => 'Lesche',
 'deletethispage' => 'Syte lösche',
 'undelete_short' => '{{PLURAL:$1|1 Version|$1 Versione}} widerherstelle',
 'viewdeleted_short' => '{{PLURAL:$1|ei gleschti Änderig|$1 gleschti Ändrige}} aaluege',
@@ -468,7 +468,7 @@ Wänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäl
 'internalerror_info' => 'Interne Fähler: $1',
 'fileappenderrorread' => '„$1“ het nit chenne gläse wäre bim Aahänke.',
 'fileappenderror' => 'Het „$1“ nit an „$2“ chenne anhänke.',
-'filecopyerror' => 'Datei "$1" het nit noch "$2" kopiert werre kinne.',
+'filecopyerror' => 'D Datei $1 het nit no $2 chenne kopiert wäre.',
 'filerenameerror' => 'D Datei "$1" het nit in "$2" umgnennt werre kinne.',
 'filedeleteerror' => 'Datei "$1" het nit glöscht werre kinne.',
 'directorycreateerror' => 'S Verzeichnis „$1“ het nit chenne aaglait wäre.',
@@ -478,20 +478,22 @@ Wänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäl
 'formerror' => 'Fähler: Ds Formular het nid chönne verarbeitet wärde',
 'badarticleerror' => 'D Aktion konn uf denne Artikel nit ongwendet werre.',
 'cannotdelete' => 'D Syte oder d Datei „$1“ cha nit glescht wäre. Si isch villicht scho vu eber anderem glescht wore.',
+'cannotdelete-title' => 'Syte „$1“ cha nit glescht wäre',
 'badtitle' => 'Ugültiger Titel',
 'badtitletext' => 'Dr Titel vu dr agforderte Syte isch nit giltig gsi, leer, oder e nit giltig Sprochgleich vun eme andre Wiki.',
-'perfcached' => 'Die Informatione chömme us em Zwüschespeicher un sin derwiil villicht nid aktuell. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.
-----',
-'perfcachedts' => 'Die Date stamme us em Cache un sin am $1 s letscht Mol aktualisiert wore. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Die Informatione chemme us em Zwischespycher un sin derwyl villicht nit aktuäll. Maximal {{PLURAL:$1|ei Ergebnis isch|$1 Ergebnis sin}} im Cache verfiegbar.',
+'perfcachedts' => 'Die Date stamme us em Zwischespycher un sin am $1 s letscht Mol aktualisiert wore. Maximal {{PLURAL:$4|ei Ergebnis isch|$4 Ergebnis sin}} im Zwischespycher verfiegbar.',
 'querypage-no-updates' => "'''D Aktualisierigsfunktion fir die Syte isch im Momänt deaktiviert. D Date wäre vorerscht nit ernejert.'''",
 'wrong_wfQuery_params' => 'Falschi Parameter fir wfQuery()<br />
 Funktion: $1<br />
 Abfrog: $2',
 'viewsource' => 'Quelltext aaluege',
+'viewsource-title' => 'Quälltext vu $1 aaluege',
 'actionthrottled' => 'Aktionsaazahl limitiert',
 'actionthrottledtext' => 'As Schutz vor Spam cha die Aktion im e churze Zytabstand nume begränzt durgfiert wäre. Du bisch ebe an die Gränz cho. Bitte versuech s in e paar Minute non emol.',
 'protectedpagetext' => 'Die Syte isch fir s Bearbeite gsperrt.',
 'viewsourcetext' => 'Quelltext vo dere Syte:',
+'viewyourtext' => "Du chasch dr Quälltext vu '''Dyre Bearbeitig''' vu däre Syte aaluege un kopiere:",
 'protectedinterface' => 'In däre Syte het s Text fir s Sproch-Interface vu dr Software un si isch gsperrt, zum Missbruch z verhindre.',
 'editinginterface' => "'''Obacht:''' Du bisch e Syten am Verändere, wu zum User.Interface ghert. Wänn Du die Syte veränderesch, no änderet sich s User-Interface au fir di andere Benutzer. Fir Ibersetzige lueg bitte, eb Du doodefir s [//translatewiki.net/wiki/Main_Page?setlang=gsw Translatewiki] witt bruuche, s MediaWiki-Lokalisierigsprojäkt.",
 'sqlhidden' => '(SQL-Abfrog verschteckt)',
@@ -503,6 +505,9 @@ $2',
 'ns-specialprotected' => 'Spezialsyte chenne nid bearbeitet wäre.',
 'titleprotected' => "E Syte mit däm Name cha nid aaglait wäre.
 Die Sperri isch dur [[User:$1|$1]] yygrichtet wore mit dr Begrindig ''„$2“''.",
+'filereadonlyerror' => 'D Datei „$1“ cha nit gänderet wäre, wel uf s Dateirepositorium „$2“ nume Läsezuegriff megli isch.
+
+Dr Administrator, wu dr Schrybzuegriff gsperrt het, het dää Grund aagee: „$3“.',
 
 # Virus scanner
 'virus-badscanner' => "Fählerhafti Konfiguration: Virescanner, wu nid bekannt isch: ''$1''",
@@ -597,6 +602,7 @@ Fir d Bstätigung muesch em Link nogoh, wu Dir gschickt woren isch. Du chasch au
 'invalidemailaddress' => 'Diä E-Mail-Adress isch nit akzeptiert worre, wil s ä ugültigs Format ghet het.
 Bitte gib ä neiji Adress in nem gültige Format ii, odr tue s Feld leere.',
 'cannotchangeemail' => 'E-Mail-Adrässe chönne in däm Wiki nit gänderet werde.',
+'emaildisabled' => 'Iber die Websyte chenne kei E-Mail verschickt wäre.',
 'accountcreated' => 'S Benutzerkonto isch aagleit wore.',
 'accountcreatedtext' => 'S Benutzerkonto $1 isch aagleit wore.',
 'createaccount-title' => 'Aalege vum e Benutzerkonto fir {{SITENAME}}',
@@ -723,27 +729,21 @@ Du chasch $1 oder e andere [[{{MediaWiki:Grouppage-sysop}}|Ammann]] kontaktiere
 Du chasch d „E-Mail an dää Benutzer“-Funktion nit bruche, solang kei giltigi E-Mail-Adräss in Dyyne [[Special:Preferences|Benutzerkonto-Yystellige]] yydrait isch, oder solang die Funktion fir Di gsperrt isch.
 Dyy aktuälli IP-Adräss isch $3, un d Sperr-ID isch #$5.
 Bitte fieg in jedi Aafrog, wu du stellsch, alli Information yy.",
-'autoblockedtext' => 'Dyyni IP-Adräss isch automatisch gsperrt wore, wel si vu me andere Benutzer brucht woren isch, wu dur $1 gsperrt woren isch.
+'autoblockedtext' => "Dyyni IP-Adräss isch automatisch gsperrt wore, wel si vu me andere Benutzer brucht woren isch, wu dur $1 gsperrt woren isch.
 As Grund isch aagee wore:
 
-:\'\'$2\'\' (<span class="plainlinks">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 Logbucheintrag]</span>)
+:''$2''
 
-<p style="border-style: solid; border-color: red; border-width: 1px; padding:5px;"><b>E Zuegriff zum Läse isch alno megli,</b>
-nume d Bearbeitig un s Aalege vu Syte in {{SITENAME}} isch gsperrt wore.
-Wänn die Nochricht aazeigt wird, au wänn Du nume zum Läse zuegriffe hesch, bisch eme (rote) Link uf e Syte noogange, wu s nonig git.</p>
+* Aafang vu dr Sperri: $8
+* Änd vu dr Sperri: $6
+* Sperre betrifft: $7
 
 Du chasch $1 oder ein vu dr andre [[{{MediaWiki:Grouppage-sysop}}|Ammanne]] kontaktiere, zum iber die Sperri z diskutiere.
 
-<div style="border-style: solid; border-color: red; border-width: 1px; padding:5px;">
-\'\'\'Bitte gib in jedere Aafrog die Date aa:\'\'\'
-*Ammann, wu gsperrt het: $1
-*Sperrgrund: $2
-*Aafang vu dr Sperri: $8
-*Sperr-Änd: $6
-*IP-Adräss: $3
-*Sperri betrifft: $7
-*Sperr-ID: #$5
-</div>',
+Du chasch d „E-Mail an dää Benutzer“-Funktion nit nutze, solange kei giltigi E-Mail-Adräss in Dyne  [[Special:Preferences|Benutzerkonto-Yystellige]] yytrait isch oder die Funktion fir di gsperrt woren isch.
+
+Dyy aktuäll IP-Adräss isch $3, un d Sperr-ID isch $5.
+Bitte fieg alli Informatione jedere Aafrog zue, wu Du stellsch.",
 'blockednoreason' => 'kei Begrindig aagee',
 'whitelistedittext' => 'Du muesch Di $1 zum Artikel bearbeite.',
 'confirmedittext' => 'Si mien Ihri E-Mail-Adräss zerscht bstätige, voreb Si Syte chenne ändere. Bitte setze Si in [[Special:Preferences|Ihre Iistellige]] Ihri E-Mail-Adräss yy un len Si si priefe.',
@@ -792,7 +792,8 @@ As Information chunnt do ne aktuälle Uuszug us em Benutzersperr-Logbuech:',
 'userinvalidcssjstitle' => "'''Achtig:''' D Skin „$1“ git s nid. Dänk dra, ass benutzerspezifischi .css- und .js-Syte mit eme Chleibuechstabe mien aafange, also z B. ''{{ns:user}}:Mustermann/vector.css'' statt ''{{ns:user}}:Mustermann/Vector.css''.",
 'updated' => '(Gänderet)',
 'note' => "'''Obacht: '''",
-'previewnote' => "'''Das isch numen e Vorschau und nonig gspycheret!'''",
+'previewnote' => "'''Das isch numen e Vorschau und nonig gspycheret!'''
+Die Syte isch nonig gspycheret wore!",
 'previewconflict' => 'Die Vorschau zeigt dr Inhalt vum obere Täxtfäld. Eso siht dr Artikel us, wän Du jetz uf Spychere drucksch.',
 'session_fail_preview' => "'''Dyyni Bearbeitig het nid chenne gspycheret wäre, wel Sitzigsdate verlore gange sin.
 Bitte versuech s nomol. Derzue drucksch unter däre Täxtvorschau nomol uf „Syte spychere“.
@@ -808,6 +809,7 @@ Wänn s Problem blybt, [[Special:UserLogout|mäld Di ab]] un derno wider aa.'''"
 S Spichere cha dr Inhalt vu dr Syte hii mache. Des git s e mänkmol, wänn eber e anonyme Proxy-Dienscht brucht, wu Fähler macht.'''",
 'edit_form_incomplete' => "'''Dr Inhalt vum Bearbeitigsformular isch nit vollständig zum Server chuu. Bitte prief Dyy Bearbeitigen uf Vollständigkeit un versuech s nomol.'''",
 'editing' => 'Bearbeite vo «$1»',
+'creating' => 'Am Aalege vu „$1“',
 'editingsection' => 'Bearbeite vo «$1» (Absatz)',
 'editingcomment' => 'Bearbeite vu $1 (Neje Abschnitt)',
 'editconflict' => 'Bearbeitigs-Konflikt: «$1»',
@@ -828,7 +830,7 @@ Hiemit gisch du zue, das du dä Tekscht '''sälber gschribe''' hesch, das der Te
 'copyrightwarning2' => "Dängge Si dra, dass alli Änderige {{GRAMMAR:dativ {{SITENAME}}}} vo andere Benutzer wider gänderet oder glöscht chönne wärde. Wenn Si nit wänn, dass ander Lüt an Ihrem Tekscht ummedoktere denn schicke Si ihn jetz nit ab.<br />
 Si verspräche uns usserdäm, dass Si des alles selber gschribe oder vo nere Quälle kopiert hen, wo Public Domain odr sunscht frei isch (lueg $1 für Details).
 '''SETZE SI DO OHNI ERLAUBNIS KEINI URHEBERRÄCHTLICH GSCHÜTZTI WÄRK INE!'''",
-'longpageerror' => "'''Fähler: Dä Täxt, wu Du spichere wit, isch $1 KB gross. Des isch gresser wie s erlaubt Maximum vu $2 KB – s Spichere isch nid megli.'''",
+'longpageerror' => "'''Fähler: Dä Täxt, wu Du spychere wit, isch {{PLURAL:$1|ei Kilobyte|$1 Kilobyte}} groß. Des isch greßer wie s erlaubt Maximum vu {{PLURAL:$2|eim Kilobyte|$2 Kilobyte}}.''' S Spychere isch nit megli.",
 'readonlywarning' => "'''Achtung: Die Datebank isch fir Wartigsarbete gesperrt. Wäge däm chenne Dyyni Änderige im Momänt nid gspicheret wäre.
 Sichere de Täxt bitte lokal uf Dyynem Computer un versuech speter nomol, d Änderige z ibertrage.'''
 
@@ -869,6 +871,7 @@ Si isch schyns glescht wore.',
 'edit-conflict' => 'Bearbeitigskonflikt.',
 'edit-no-change' => 'Dyyni Bearbeitig isch ignoriert wore, wel kei Änderig am Täxt gmacht woren isch.',
 'edit-already-exists' => 'Di nej Syte het nid chenne aaglait wäre, wel s si scho git.',
+'defaultmessagetext' => 'Standardtext',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Achtig: In däre Syte het s z vyyl Ufruef vu ufwändige Parserfunktione.
@@ -1155,7 +1158,7 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
 'prefs-rc' => 'Letschti Änderige',
 'prefs-watchlist' => 'Beobachtigslischte',
 'prefs-watchlist-days' => 'Aazahl vu dr Täg, wu d Beobchtigslischt standardmässig soll umfasse:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Maximal {{PLURAL:$1|ei Tag|$1 Täg}}',
 'prefs-watchlist-edits' => 'Maximali Zahl vu dr Yyträg:',
 'prefs-watchlist-edits-max' => 'Maximali Aazahl: 1000',
 'prefs-watchlist-token' => 'Beobachtigslischte-Chännzeiche:',
@@ -1394,6 +1397,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'action-suppressionlog' => 's privat Logbuech aazluege',
 'action-block' => 'dä Benutzer z sperre',
 'action-protect' => 'dr Schutzstatus vu Syte z ändere',
+'action-rollback' => 'd Änderige vum letschte Bearbeiter vun ere bstimmte Syte schnäll zruckzsetze',
 'action-import' => 'Syte us eme andere Wiki z importiere',
 'action-importupload' => 'Syte z importiere iber s Uffelade vun ere Datei',
 'action-patrol' => 'd Bearbeitige vu andere Benutzer as kontrolliert z markiere',
@@ -1403,6 +1407,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'action-userrights' => 'Benutzerrächt z ändere',
 'action-userrights-interwiki' => 'd Rächt vu Benutzer in andere Wiki z ändere',
 'action-siteadmin' => 'd Datebank z sperre oder frejzgee',
+'action-sendemail' => 'E-Mail z schicke',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Änderig|Änderige}}',
@@ -1434,9 +1439,11 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|Benutzer, wu beobachtet|Benutzer, wu beobachte}}]',
 'rc_categories' => 'Nume Syten us dr Kategorie (trennt mit „|“):',
 'rc_categories_any' => 'Alli',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Byte}} no dr Änderig',
 'newsectionsummary' => 'Neje Abschnitt /* $1 */',
 'rc-enhanced-expand' => 'Detail aazeige (brucht JavaScript)',
 'rc-enhanced-hide' => 'Detail verstecke',
+'rc-old-title' => 'urspringlig aaglait as „$1“',
 
 # Recent changes linked
 'recentchangeslinked' => 'Verlinktes prüefe',
@@ -1506,7 +1513,7 @@ Lueg au d [[Special:NewFiles|Galerii vu neije Dateie]] fir e visuälle Iberblick
 'illegal-filename' => 'Dr Dateiname isch nit erlaubt.',
 'overwrite' => 'S Iberschryybe vun ere Datei, wu s scho git, isch nit erlaubt.',
 'unknown-error' => 'S het e nit bekannte Fähler gee.',
-'tmp-create-error' => 'E tämporäri Datei het nit chenne aagleit.',
+'tmp-create-error' => 'E tämporäri Datei het nit chenne aagleit wäre.',
 'tmp-write-error' => 'Fähler bim Schryybe vu dr tämporäre Datei',
 'large-file' => 'D Dateigressi sott, wänn s goht, nit gresser syy wie $1. Die Datei isch $2 gross.',
 'largefileserver' => 'Die Datei isch gresser wie die vum Server yygstellti Maximalgressi.',
@@ -1581,6 +1588,47 @@ Wänn s Problem alno uftritt, informier e [[Special:ListUsers/sysop|Ammann]].',
 'upload-too-many-redirects' => 'In dr URL het s zvyl Wyterleitige',
 'upload-unknown-size' => 'Nit bekannti Greßi',
 'upload-http-error' => 'E HTTP-Fähler isch ufträtte: $1',
+'upload-copy-upload-invalid-domain' => 'As Kopi uffeladbari Dateie sin iber die Domain nit verfiegbar.',
+
+# File backend
+'backend-fail-stream' => 'D Datei $1 het nit chenne ibertrait wäre.',
+'backend-fail-backup' => 'D Datei $1 het nit chenne gsicheret wäre.',
+'backend-fail-notexists' => 'D Datei $1 git s nit.',
+'backend-fail-hashes' => 'D Streiwärt vu dr Datei hän nit zum Verglych chenne abgruefe wäre.',
+'backend-fail-notsame' => 'S git scho ne Datei $1, wu nit idäntisch isch.',
+'backend-fail-invalidpath' => '$1 isch kei giltige Pfad zum Spychere.',
+'backend-fail-delete' => 'D Datei $1 het nit glöscht werre kinne.',
+'backend-fail-alreadyexists' => 'D Datei „$1“ git s scho.',
+'backend-fail-store' => 'D Datei $1 het nit chenne unter em Name $2 gspycheret wäre.',
+'backend-fail-copy' => 'D Datei $1 het nit no $2 chenne kopiert wäre.',
+'backend-fail-move' => 'D Datei $1 het nit no $2 chenne verschobe wäre.',
+'backend-fail-opentemp' => 'Di temporär Datei het nit chenne ufgmacht wäre.',
+'backend-fail-writetemp' => 'Di temporär Datei het nit chenne gschribe wäre.',
+'backend-fail-closetemp' => 'Di temporär Datei het nit chenne zuegmacht wäre.',
+'backend-fail-read' => 'D Datei $1 het nit chenne gläse wäre.',
+'backend-fail-create' => 'D Datei $1 het nit chenne aagleit wäre.',
+'backend-fail-maxsize' => 'D Datei $1 het nit chenne aalgeit wäre, wel si greßer isch wie {{PLURAL:$2|ei Byte|$2 Byte}}.',
+'backend-fail-readonly' => 'S Spycher-Backend „$1“ isch zurzyt im Läsemodus. Dr Grund, wu aagee isch, isch: „$2“',
+'backend-fail-synced' => 'D Datei „$1“ isch im intärne Spycher-Backend in eme inkonsischtänte Zuestand.',
+'backend-fail-connect' => 'S het kei Verbindig chenne härgstellt wäre zum Spycher-Backend „$1“.',
+'backend-fail-internal' => 'Im Spycher-Backend „$1“ isch e nit bekannte Fähler ufträtte.',
+'backend-fail-contenttype' => 'Dr Inhaltstyp vu dr Datei, wu im Pfad „$1“ gspycheret soll wäre, het nit chenne bstimmt wäre.',
+'backend-fail-batchsize' => 'E Bygiverarbeitigsdatei, wu s {{PLURAL:$1|ei Operation|$1 Operatione}} din het, isch an s Spycher-Backend gschickt wore. D Gränz lyt aber bi {{PLURAL:$2|eire Operation|$2 Operatione}}.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'S het kei Verbindig chenne härgstellt würe zue dr Journaldatebank vum Spycher-Backend „$1“.',
+'filejournal-fail-dbquery' => 'D Journaldatebank vum Spycher-Backend „$1“ het nit chenne aktualisiert wäre.',
+
+# Lock manager
+'lockmanager-notlocked' => '„$1“ het nit chenne entsperrt wäre, wel s kei Sperrig git.',
+'lockmanager-fail-closelock' => 'D Sperrdatei fir „$1“ het nit chenne zuegmacht wäre.',
+'lockmanager-fail-deletelock' => 'D Sperrdatei fir „$1“ het nit chenne glescht wäre.',
+'lockmanager-fail-acquirelock' => 'D Sperri fir „$1“ het nit chenne abgruefe wäre.',
+'lockmanager-fail-openlock' => 'D Sperrdatei fir „$1“ het nit chenne ufgmacht wäre.',
+'lockmanager-fail-releaselock' => 'D Sperri fir „$1“ het nit chenne frejgee wäre.',
+'lockmanager-fail-db-bucket' => 'Mit em Sammelabruef $1 hän nit gnue Verbindige zue Sperrdatebanke chenne härgstellt wäre.',
+'lockmanager-fail-db-release' => 'D Sperrine uf dr Datebank $1 hän nit chenne frejgee wäre.',
+'lockmanager-fail-svr-release' => 'D Sperrine uf em Server $1 hän nit chenne frejgee wäre.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'S het e Fähler gee bim Ufmache vu dr Datei fir d ZIP-Iberpriefig.',
@@ -1598,6 +1646,7 @@ Si cha wäge däm nit richtig iberprieft wäre.',
 'uploadstash-badtoken' => 'S Uuseneh vu dr vorab gspycherete Dateien isch fählgschlaa, villicht wel d Sitzigsdaten abglofe sin. Bitte versuech s nomol.',
 'uploadstash-errclear' => 'S Uuseneh vu dr vorab gspycherete Dateie isch fählgschlaa.',
 'uploadstash-refresh' => 'Lischt vu dr Dateie aktualisiere',
+'invalid-chunk-offset' => 'Nit giltige Startpunkt',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Zuegriff verweigeret',
@@ -1683,6 +1732,10 @@ E [[Special:WhatLinksHere/$2|vollständigi Lischt]] isch verfiegbar.',
 'sharedupload' => 'Die Datei isch vu $1. S cha syy, ass si vu andere Projekt brucht wird.',
 'sharedupload-desc-there' => 'Die Datei isch vu $1 un derf vu andere Projäkt bruucht wäre. Lueg uf dr [$2 Dateibschryybigssyte] no wytere Informatione.',
 'sharedupload-desc-here' => 'Die Datei isch vu $1 un derf vu andere Projäkt bruucht wäre. D Bschryybig vu dr [$2 Dateibschryybigssyte] wird unten aazeigt.',
+'sharedupload-desc-edit' => 'Die Datei stammt us $1 un cha uf andere Projäkt brucht wäre.
+Villicht witt d Bschryybig uf dr dertige [$2 Dateibschryybigssyte] bearbeite.',
+'sharedupload-desc-create' => 'Die Datei stammt us $1 un cha uf andere Projäkt brucht wäre.
+Villicht witt d Bschryybig uf dr dertige [$2 Dateibschryybigssyte] bearbeite.',
 'filepage-nofile' => 'S git kei Datei mit däm Name.',
 'filepage-nofile-link' => 'S git no kei Datei mit däm Name, aber Du chasch [$1 si ufelade].',
 'uploadnewversion-linktext' => 'E nöui Version vo dere Datei ufelade',
@@ -1717,6 +1770,7 @@ E [[Special:WhatLinksHere/$2|vollständigi Lischt]] isch verfiegbar.',
 ** Duplikat',
 'filedelete-edit-reasonlist' => 'Leschgrind bearbeite',
 'filedelete-maintenance' => 'S Leschen un Widerhärstelle vu Dateie isch wäge Wartigsarbete e Zytlang deaktiviert.',
+'filedelete-maintenance-title' => 'D Datei cha nit glescht wäre.',
 
 # MIME search
 'mimesearch' => 'MIME-Suechi',
@@ -1765,7 +1819,7 @@ Iberprief anderi Link zue dr Vorlage, voreb Du die leschesch.',
 'statistics-users-active-desc' => 'Benutzer mit Bearbeitige {{PLURAL:$1|in dr letschte 24 Stund|in dr letschte $1 Täg}}',
 'statistics-mostpopular' => 'Am meischte aagluegti Syte',
 
-'disambiguations' => 'Begriffsklärigssytene',
+'disambiguations' => 'Syte, wu uf Begriffsklärigssyte verlinke',
 'disambiguationspage' => 'Template:Begriffsklärig',
 'disambiguations-text' => 'Die Syte verwyyse uf e Begriffsklärigs-Syte. Sie sotte aber besser uf d Syte verwyyse, wu eigetli gmeint sin.<br />E Syte wird as Begriffsklärigs-Syte behandlet, wänn [[MediaWiki:Disambiguationspage]] uf si verwyyst.<br />Link us Namensryym wäre do nit ufglischtet.',
 
@@ -1812,6 +1866,8 @@ In jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu
 'wantedpages' => 'Artikel, wo fähle',
 'wantedpages-badtitle' => 'Nit giltige Titel im Ergebnis: $1',
 'wantedfiles' => 'Dateie, wu fähle',
+'wantedfiletext-cat' => 'Die Dateie wäre brucht, s git si aber nit. Dateie us främde Repositorie chenne einewäg do ufglischtet syy un wäre <del>durgstriche</del> dargstellt. Zuesätzli wäre Syte, wu s die nit vorhande Datei dinne het, in d [[:$1]] yygordnet.',
+'wantedfiletext-nocat' => 'Die Dateie wäre brucht, s git si aber nit. Vorhandeni Dateie us främde Repositorie chenne dp einewäg ufglischtet syy un wäre <del>durgstriche</del> dargstellt.',
 'wantedtemplates' => 'Vorlage, wu fähle',
 'mostlinked' => 'Syte, wo am meischte druff verwyyse wird',
 'mostlinkedcategories' => 'Am meischte verlinkti Kategorië',
@@ -1820,6 +1876,7 @@ In jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu
 'mostimages' => 'Am meischte verlinkti Dateie',
 'mostrevisions' => 'Syte mit de meischte Bearbeitige',
 'prefixindex' => 'Alli Syte (mit Präfix)',
+'prefixindex-namespace' => 'Alli Syte mit Präfix (Nameruum $1)',
 'shortpages' => 'Churzi Artikel',
 'longpages' => 'Langi Artikel',
 'deadendpages' => 'Artikel ohni Links («Sackgasse»)',
@@ -1862,8 +1919,8 @@ Bitte gib Acht, ass anderi Netzsyte die Datei mit ere diräkte URL chenne verlin
 'booksources-invalid-isbn' => 'D ISBN isch schyyns falsch. Lueg no Fähler in dr Kopii.',
 
 # Special:Log
-'specialloguserlabel' => 'Benutzer:',
-'speciallogtitlelabel' => 'Titel:',
+'specialloguserlabel' => 'Benutzer, wu des gmacht het:',
+'speciallogtitlelabel' => 'Ziil (Titel oder Benutzer):',
 'log' => 'Logbiecher',
 'all-logs-page' => 'Alli effetligi Logbüecher',
 'alllogstext' => 'Kombinierti Aasicht vu alle in {{SITENAME}} gfierte Protokoll.
@@ -1887,6 +1944,12 @@ D Aazeig cha dur d Uuswahl vun eme Protokoll, eme Benutzername oder eme Sytename
 'allpagesprefix' => 'Alli Sytene mit em Präfix:',
 'allpagesbadtitle' => 'Dr Sytename, wu yygee hesch, isch nit giltig: Er het entwäder e vorgstellt Sproch-, e Interwiki-Chirzel oder s het ei oder meh Zeiche din, wu in eme Sytename nit derfe brucht wäre.',
 'allpages-bad-ns' => 'Dr Namensruum „$1“ isch in {{SITENAME}} nit vorhande.',
+'allpages-hide-redirects' => 'Wyterleitige uusblände',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du siisch d Zwischespycher-Version vu däre Syte, wu bis zue $1 cha alt syy.',
+'cachedspecial-viewing-cached-ts' => 'Du siisch d Zwischespycher-Version vu däre Syte, wu villicht nit aktuäll isch.',
+'cachedspecial-refresh-now' => 'Aktuälli Version aaluege.',
 
 # Special:Categories
 'categories' => 'Kategorie',
@@ -1903,11 +1966,11 @@ Lueg au d Lischt vu dr [[Special:WantedCategories|gwinschte Kategorie]].',
 'sp-deletedcontributions-contribs' => 'Byyträg',
 
 # Special:LinkSearch
-'linksearch' => 'Netzgleicher',
+'linksearch' => 'Weblinksuechi',
 'linksearch-pat' => 'Suechmuschter:',
 'linksearch-ns' => 'Namensruum:',
 'linksearch-ok' => 'Sueche',
-'linksearch-text' => 'S chönne Platzhalter wie "*.wikipedia.org" benutzt werre.<br />Unterschtützti Protokoll: <tt>$1</tt>',
+'linksearch-text' => 'Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <tt>*.byschpel.de</tt> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />Unterstitzti Protokoll: <tt>$1</tt> (Die bitte nit bi dr Suechaafrog aagee.)',
 'linksearch-line' => '$1 isch vo $2 verknüpft',
 'linksearch-error' => 'Platzhalter chönne numme am Aafang verwändet werre.',
 
@@ -2013,7 +2076,7 @@ Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf 
 'watchmethod-list' => 'Iberpriefe vu dr Beobachtigslischt no letschte Bearbeitige',
 'watchlistcontains' => 'In Dyynere Beobachtigslischt het s $1 {{PLURAL:$1|Syte|Syte}}.',
 'iteminvalidname' => 'Probläm mit em Yytrag „$1“, uugiltige Name.',
-'wlnote' => "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}.",
+'wlnote' => "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}. Stand: $3, $4 Uhr.",
 'wlshowlast' => 'Zeig di letschte $1 Stunde $2 Tage $3',
 'watchlist-options' => 'Aazeigoptione',
 
@@ -2119,7 +2182,10 @@ Lueg d [[Special:ProtectedPages|Lischt vu dr gschitzte Syte]] fir alli zurzyt gs
 'unprotectedarticle' => 'het dr Schutz vu „[[$1]]“ ufghebt',
 'movedarticleprotection' => 'het dr Syteschutz vu „[[$2]]“ uf „[[$1]]“ ibertrait',
 'protect-title' => 'Schutz vu „$1“ ändere',
+'protect-title-notallowed' => 'Schutz aaluege vu „$1“',
 'prot_1movedto2' => '[[$1]] isch uf [[$2]] verschobe worde.',
+'protect-badnamespace-title' => 'Nit-schitzbare Namensruum',
+'protect-badnamespace-text' => 'Syte in däm Namensruum chenne nit gschitzt wäre.',
 'protect-legend' => 'Syteschutzstatus ändere',
 'protectcomment' => 'Grund:',
 'protectexpiry' => 'Gsperrt bis:',
@@ -2204,6 +2270,7 @@ In däm Fall darf di neijscht Version nit markiert wäre oder ihre Status muess
 
 Im [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.",
 'undelete-header' => 'Lueg im [[Special:Log/delete|Lesch-Logbuech]] no Syte, wu in dr letschte Zyt glescht wore sin.',
+'undelete-search-title' => 'Gleschti Syte sueche',
 'undelete-search-box' => 'Suech no gleschte Syte',
 'undelete-search-prefix' => 'Zeig d Syte aa, wu aafange mit:',
 'undelete-search-submit' => 'Sueche',
@@ -2212,6 +2279,7 @@ Im [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un w
 'undelete-bad-store-key' => 'D Dateiversion mit em Zytstämpfel $1 het nit chenne widerhärgstellt wäre: D Datei isch scho vor em Lesche nimmi vorhande gsi.',
 'undelete-cleanup-error' => 'Fähler bim Lesche vu dr nit benutzte Archiv-Version $1.',
 'undelete-missing-filearchive' => 'D Datei mit dr Archiv-ID $1 cha nit widerhärgstellt wäre, wel si nit in dr Datebank vorhanden isch. Villicht isch si scho widerhärgstellt wore.',
+'undelete-error' => 'Bim Widerhärstelle vu dr Syte het s e Fähler gee.',
 'undelete-error-short' => 'Fähler bim Widerhärstelle vu dr Datei $1',
 'undelete-error-long' => 'S sin Fähler bim Widerhärstelle vun ere Datei feschtgstellt wore:
 
@@ -2363,7 +2431,7 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
 'blocklog-showsuppresslog' => 'Dää Benutzer isch schon emol gsperrt wore un syyni Bearbeitige sin uusblädet wore. S Uusbländigs-Logbuech git s do as Referänz:',
 'blocklogentry' => 'sperrt [[$1]] für d Ziit vo: $2 $3',
 'reblock-logentry' => 'het d Sperri fir „[[$1]]“ gänderet fir dr Zytruum: $2 $3',
-'blocklogtext' => 'Des isch s Logbuech iber Sperrige un Entsperrige vu Benutzer. Automatisch blockierti IP-Adrässe wäre nit erfasst. Lueg au [[Special:BlockList|IP-Block Lischt]] fir e Lischt vu gsperrte Benutzer.',
+'blocklogtext' => 'Des isch s Logbuech iber Sperrige un Entsperrige vu Benutzer. Automatisch blockierti IP-Adrässe wäre nit erfasst. Lueg au [[Special:BlockList|Block Lischt]] fir e Lischt vu gsperrte Benutzer.',
 'unblocklogentry' => 'het d Sperri vu „$1“ ufghobe',
 'block-log-flags-anononly' => 'nume Anonymi',
 'block-log-flags-nocreate' => 'Aalege vu Benutzerchonte gsperrt',
@@ -2499,9 +2567,11 @@ Bitte wehl e andre Name.',
 'export' => 'Sytenen exportiere',
 'exporttext' => 'Du chasch dr Text un d Versionsgschicht vu einzelne Syte in ere XML-Datei exportiere. Die Datei cha derno in e ander MediaWiki-Wiki importiert wäre iber [[Special:Import|Importiere]].
 Zum Exportiere trag dr Sytetitel in dr Täxtchaschte unter yy, ei Titel pro Zyyle, un wehl us, eb Du di aktuäll Version mitsamt dr eltere Versione (mit dr Versionsgschicht-Zyyle) oder nume di aktuäll Version mit dr Information iber di letscht Bearbeitig. In däm Fall chasch au e Link fir dr Export verwände, z. B. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fir d Syte "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Alli Syte exportiere',
 'exportcuronly' => 'Numme d aktuelli Version vo dr Syte exportiere, statt dr ganze Versionsgschicht',
 'exportnohistory' => "----
 '''Hywys:''' S Exportiere vo ganzi Versionsgschichte durch des Formular isch us Gründ vo dr Leischtig vum Syschtem abgschaltet worde",
+'exportlistauthors' => 'Fir jedi Syte di vollständig Lischt vu dr Bearbeiter derzue tue',
 'export-submit' => 'Sytene exportiere',
 'export-addcattext' => 'Syte us dere Kategori dezuefüege',
 'export-addcat' => 'Dezuefüege',
@@ -2514,7 +2584,7 @@ Zum Exportiere trag dr Sytetitel in dr Täxtchaschte unter yy, ei Titel pro Zyyl
 # Namespace 8 related
 'allmessages' => 'Systemnochrichte',
 'allmessagesname' => 'Name',
-'allmessagesdefault' => 'Standard-Tekscht',
+'allmessagesdefault' => 'Standardtext',
 'allmessagescurrent' => 'jetzige Tekscht',
 'allmessagestext' => 'Des isch e Lischt vu allene meglige Syschtemnochrichte us em MediaWiki Namensruum.
 Lueg au uf [//www.mediawiki.org/wiki/Localisation MediaWiki Lokalisierig] un [//translatewiki.net translatewiki.net], wänn Du zue dr MediaWiki-Lokalisierig wit byytrage.',
@@ -2534,6 +2604,8 @@ Lueg au uf [//www.mediawiki.org/wiki/Localisation MediaWiki Lokalisierig] un [//
 'thumbnail_error' => 'Fähler bir Härstellig vo re Vorschou: $1',
 'djvu_page_error' => 'DjVu-Syte isch uusserhalb vum Sytebereich',
 'djvu_no_xml' => 'XML-Date chönne für d DjVu-Datei nüt abgruefe werde',
+'thumbnail-temp-create' => 'D Datei fir di temporär Miniaturaasicht het nit chenne aagleit wäre.',
+'thumbnail-dest-create' => 'D Miniaturaasicht het nit chenne an däm Ort gspycheret wäre.',
 'thumbnail_invalid_params' => 'Ungültigs Thumbnail-Parameter',
 'thumbnail_dest_directory' => 'S Ziilverzeichnis cha nüt erstellt werde',
 'thumbnail_image-type' => 'Bildtyp wird nit unterstitzt',
@@ -2561,7 +2633,7 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'imported-log-entries' => '$1 {{PLURAL:$1|lLogbuechyytrag|Logbuechyytreg}} importiert.',
 'importfailed' => 'Dr Import isch misslunge: $1',
 'importunknownsource' => 'Importquell isch unbekannt',
-'importcantopen' => 'D Importdatei het nüt chönne geöffnet werde',
+'importcantopen' => 'D Importdatei het nit chenne ufgmacht wäre.',
 'importbadinterwiki' => 'Falscher Interwiki-Link',
 'importnotext' => 'Leer oder kei Teggscht',
 'importsuccess' => 'Dr Import isch abgschlosse.',
@@ -2580,6 +2652,9 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'import-invalid-interwiki' => 'Us däm Wiki wo du aagää hesch isch kei Import mögli.',
 'import-error-edit' => 'Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z bearbeite.',
 'import-error-create' => 'Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z erstelle.',
+'import-error-interwiki' => 'D Syte „$1“ isch nit importiert wore, wel dr Name vun ere fir externi Link (Interwiki) reserviert isch.',
+'import-error-special' => 'D Syte „$1“ isch nit importiert wore, wel si zuen eme bsundere Namensruum ghert, wu kei Syte megli sin.',
+'import-error-invalid' => 'Syte „$1“ isch nit importiert wore, wel dr Name vun ere nit giltig isch.',
 
 # Import log
 'importlogpage' => 'Import-Logbuech',
@@ -2589,6 +2664,17 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'import-logentry-interwiki' => '„$1“ isch importiert worde (Transwiki)',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|Version|Versione}} vo $2',
 
+# JavaScriptTest
+'javascripttest' => 'JavaScript-Tescht',
+'javascripttest-disabled' => 'Die Funktion isch in däm Wiki nit aktiviert wore.',
+'javascripttest-title' => '$1-Tescht wäre durgfiert',
+'javascripttest-pagetext-noframework' => 'Die Syte isch reserviert fir JavaSkript-Tescht.',
+'javascripttest-pagetext-unknownframework' => 'Nit bekannt Framework „$1“.',
+'javascripttest-pagetext-frameworks' => 'Bitte eis vu däne Framework uuswehle: $1',
+'javascripttest-pagetext-skins' => 'Wehl e Benutzeroberflechi uus fir d Durfierig vu dr Tescht:',
+'javascripttest-qunit-intro' => 'Lueg d [$1 Dokumentation zue Tescht] uf mediawiki.org',
+'javascripttest-qunit-heading' => 'MediaWiki-JavaSkript-QUnit-Teschter',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Dyyni Benutzersyte',
 'tooltip-pt-anonuserpage' => 'D Benutzersyte vo der IP-Adress wo du mit schaffsch',
@@ -2649,6 +2735,8 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'tooltip-diff' => 'Zeigt a, was du am Tekscht hesch veränderet.',
 'tooltip-compareselectedversions' => 'Underschide zwüsche zwo usgwählte Versione vo dere Syten azeige.',
 'tooltip-watch' => 'Tue die Syten uf dyni Beobachtigslischte.',
+'tooltip-watchlistedit-normal-submit' => 'Yytreg uuseneh',
+'tooltip-watchlistedit-raw-submit' => 'D Beobachtigslischt aktualisiere',
 'tooltip-recreate' => 'Die Syte nöi erstelle, trotz dass si emool glöscht worren isch.',
 'tooltip-upload' => 'Aafange mit ufelade',
 'tooltip-rollback' => 'Mach alli letschti Ändrige uf dere Syte, wo vo däm Benutzer gmacht worre sin, ruggängig.',
@@ -3372,6 +3460,9 @@ E [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopi vu dr GNU General Public-Lizänz] sott
 'version-software' => 'Installierti Software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'Yygangspunkt-URL',
+'version-entrypoints-header-entrypoint' => 'Yygangspunkt',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Dateipfad',
@@ -3506,6 +3597,8 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'newuserlog-byemail' => 's Passwort isch per E-Mail gschickt wore',
 
 # Feedback
+'feedback-bugornote' => 'Wän Du detailliert e tächnisch Probläm witt bschryybe, no mäld bitte [$1 ne Fähler].
+Sunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit Dyym Benutzername un dr Version vu Dyym Webbrowser un em Betribssyschtem, uf dr Syte „[$3 $2]“ zuegfiegt.',
 'feedback-subject' => 'Beträff:',
 'feedback-message' => 'Noochricht:',
 'feedback-cancel' => 'Abbräche',
@@ -3514,6 +3607,10 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'feedback-error1' => 'Fäälermäldig: Unbekannts Ergebniss vo de API',
 'feedback-error2' => 'Fääler: Bearbeitig fehlgschlo',
 'feedback-error3' => 'Fäälermäldig: Kei Antwort vo de API',
+'feedback-thanks' => 'Dankschen. Dyy Ruckmäldig isch uf dr Syte „[$2 $1]“ gspycheret wore.',
+'feedback-close' => 'Isch gmacht',
+'feedback-bugcheck' => 'Schen! Bitte iberprief no, eb s sich doderby nit um e scho [$1 bekannte Fähler] handlet.',
+'feedback-bugnew' => 'Ich haa s iberprieft. Dr nej Fähler mälde.',
 
 # API errors
 'api-error-badaccess-groups' => 'Du derfsch keini Dateie in des Wiki uffelade.',
@@ -3524,6 +3621,7 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'api-error-duplicate-archive-popup-title' => 'Doppelti {{PLURAL:$1|Datei, wo scho worde isch|Dateie, wo scho glöscht worde sin}}',
 'api-error-duplicate-popup-title' => 'Dopplet vorhandeni {{PLURAL:$1|Datei|Dateie}}',
 'api-error-empty-file' => 'D Datei, wu Du uffeglade hesch, isch läär.',
+'api-error-emptypage' => 'S isch nit erlaubt, neji lääri Syte aazlege.',
 'api-error-fetchfileerror' => 'Intärne Fähler: Bim Abruefe vu dr Datei isch e Fähler ufträtte.',
 'api-error-file-too-large' => 'D Datei, wu Du ibertrait hesch, isch z groß.',
 'api-error-filename-tooshort' => 'Dr Dateiname isch z churz.',
@@ -3548,7 +3646,19 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'api-error-unknown-code' => 'Nit bekannte Fähler: „$1“',
 'api-error-unknown-error' => 'Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei.',
 'api-error-unknown-warning' => 'Unbekannti Warnig: $1',
+'api-error-unknownerror' => 'Nit bekannte Fähler: „$1“',
 'api-error-uploaddisabled' => 'S Uffelade isch in däm Wiki deaktiviert.',
 'api-error-verification-error' => 'Die Datei isch entwäder fählerhaft oder si het di falsch Dateinameerwyterig.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Sekund|Sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Minut|Minute}}',
+'duration-hours' => '$1 {{PLURAL:$1|Stund|Stunde}}',
+'duration-days' => '$1 {{PLURAL:$1|Tag|Täg}}',
+'duration-weeks' => '$1 {{PLURAL:$1|Wuche|Wuche}}',
+'duration-years' => '$1 {{PLURAL:$1|Johr|Johr}}',
+'duration-decades' => '$1 {{PLURAL:$1|Johrzehnt|Johrzeht}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Johrhundert|Johrhundert}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Jahrtöusert|Jahrtöusert}}',
+
 );
index dbe60a0..e093dfd 100644 (file)
@@ -1041,7 +1041,8 @@ $2
 'updated' => '(מעודכן)',
 'note' => "'''הערה:'''",
 'previewnote' => "'''זכרו שזו רק תצוגה מקדימה.'''
-השינויים שלכם טרם נשמרו! [[#editform|← להמשך העריכה]]",
+השינויים שלכם טרם נשמרו!",
+'continue-editing' => 'להמשך העריכה',
 'previewconflict' => 'תצוגה מקדימה זו מציגה כיצד ייראה הטקסט בחלון העריכה העליון, אם תבחרו לשמור אותו.',
 'session_fail_preview' => "'''לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.'''
 אנא נסו שוב.
@@ -1134,6 +1135,10 @@ $2
 'parser-template-loop-warning' => 'נמצאה תבנית הקוראת לעצמה: [[$1]]',
 'parser-template-recursion-depth-warning' => 'עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)',
 'language-converter-depth-warning' => 'עומק ממיר השפה עבר את המגבלה ($1)',
+'node-count-exceeded-category' => 'דפים שבהם מספר הצמתים גדול מדי',
+'node-count-exceeded-warning' => 'מספר הצמתים בדף גדול מדי',
+'expansion-depth-exceeded-category' => 'דפים שבהם עומק ההרחבה גדול מדי',
+'expansion-depth-exceeded-warning' => 'עומק ההרחבה בדף גדול מדי',
 
 # "Undo" feature
 'undo-success' => 'ניתן לבטל את העריכה. אנא בִדקו את השוואת הגרסאות למטה כדי לוודא שזה מה שאתם רוצים לעשות, ואז שמרו את השינויים למטה כדי לבצע את ביטול העריכה.',
@@ -1276,7 +1281,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'יומן הסתרות',
 'suppressionlogtext' => 'להלן רשימת המחיקות והחסימות הכוללות תוכן המוסתר ממפעילי המערכת.
-ר×\90×\95 ×\90ת [[Special:BlockList|רש×\99×\9eת ×\9bת×\95×\91×\95ת ×\94Ö¾IP ×\94×\97ס×\95×\9e×\95ת]] לרשימת החסימות הפעילות כעת.',
+ר×\90×\95 ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\97ס×\95×\9e×\99×\9d]] לרשימת החסימות הפעילות כעת.',
 
 # History merging
 'mergehistory' => 'מיזוג גרסאות של דפים',
@@ -1951,6 +1956,7 @@ $1',
 'http-curl-error' => 'שגיאה בקבלת כתובת ה־URL‏: $1',
 'http-host-unreachable' => 'לא ניתן להגיע לכתובת ה־URL.',
 'http-bad-status' => 'הייתה בעיה בשליחת בקשת ה־HTTP‏: $1 $2',
+'http-truncated-body' => 'גוף הבקשה התקבל רק באופן חלקי.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'לא ניתן להגיע ל־URL',
@@ -2230,6 +2236,11 @@ $1',
 'allpages-bad-ns' => 'אין מרחב שם בשם "$1".',
 'allpages-hide-redirects' => 'הסתרת הפניות',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'זוהי גרסה שמורה בזיכרון המטמון של דף זה, שעשויה להיות בת $1.',
+'cachedspecial-viewing-cached-ts' => 'זוהי גרסה שמורה בזיכרון המטמון של דף זה, שעשויה שלא להיות מעודכנת.',
+'cachedspecial-refresh-now' => 'צפייה באחרון.',
+
 # Special:Categories
 'categories' => 'קטגוריות',
 'categoriespagetext' => '{{PLURAL:$1|הקטגוריה הבאה כוללת|הקטגוריות הבאות כוללות}} דפים או קובצי מדיה.
@@ -2667,7 +2678,7 @@ $1',
 'blockipsuccesssub' => 'החסימה הושלמה בהצלחה',
 'blockipsuccesstext' => '{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.
 
-ר×\90×\95 ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\9bת×\95×\91×\95ת ×\94×\97ס×\95×\9e×\95ת]] כדי לצפות בחסימות.',
+ר×\90×\95 ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\97ס×\95×\9e×\99×\9d]] כדי לצפות בחסימות.',
 'ipb-blockingself' => 'אתם עומדים לחסום את עצמכם! האם אתם באמת רוצים לעשות את זה?',
 'ipb-confirmhideuser' => 'אתם עומדים לחסום משתמש עם האפשרות "הסתרת משתמש". פעולה זו תסתיר את שם המשתמש בכל הרשימות ופעולות היומן. האם אתם בטוחים שברצונכם לעשות זאת?',
 'ipb-edit-dropdown' => 'עריכת סיבות החסימה',
@@ -2720,7 +2731,7 @@ $1',
 'reblock-logentry' => 'שינה את הגדרות החסימה של [[$1]] עם זמן פקיעה של $2 $3',
 'blocklogtext' => 'זהו יומן פעולות החסימה והשחרור של משתמשים.
 כתובות IP שנחסמו אוטומטית אינן מופיעות.
-ר×\90×\95 ×\92×\9d ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\9bת×\95×\91×\95ת ×\94×\97ס×\95×\9e×\95ת]] לרשימה של החרמות וחסימות פעילות כעת.',
+ר×\90×\95 ×\92×\9d ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\97ס×\95×\9e×\99×\9d]] לרשימה של החרמות וחסימות פעילות כעת.',
 'unblocklogentry' => 'שחרר את $1',
 'block-log-flags-anononly' => 'משתמשים אנונימיים בלבד',
 'block-log-flags-nocreate' => 'יצירת חשבונות נחסמה',
@@ -3886,6 +3897,9 @@ $5
 'version-software' => 'תוכנות מותקנות',
 'version-software-product' => 'תוכנה',
 'version-software-version' => 'גרסה',
+'version-entrypoints' => 'כתובות של נקודות כניסה',
+'version-entrypoints-header-entrypoint' => 'נקודת כניסה',
+'version-entrypoints-header-url' => 'כתובת',
 
 # Special:FilePath
 'filepath' => 'נתיב לקובץ',
@@ -4073,4 +4087,15 @@ $5
 'api-error-uploaddisabled' => 'ההעלאה מבוטלת באתר הוויקי הזה.',
 'api-error-verification-error' => 'קובץ זה עשוי להיות פגום או בעל סיומת שגויה.',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|שנייה|$1 שניות}}',
+'duration-minutes' => '{{PLURAL:$1|דקה|$1 דקות}}',
+'duration-hours' => '{{PLURAL:$1|שעה|$1 שעות|שעתיים}}',
+'duration-days' => '{{PLURAL:$1|יום|$1 ימים|יומיים}}',
+'duration-weeks' => '{{PLURAL:$1|שבוע|$1 שבועות|שבועיים}}',
+'duration-years' => '{{PLURAL:$1|שנה|$1 שנים|שנתיים}}',
+'duration-decades' => '{{PLURAL:$1|עשור|$1 עשורים}}',
+'duration-centuries' => '{{PLURAL:$1|מאה שנה|$1 מאות שנים|מאתיים שנה}}',
+'duration-millennia' => '{{PLURAL:$1|אלף שנה|$1 אלפי שנים|אלפיים שנה}}',
+
 );
index 087c61e..f8b288b 100644 (file)
@@ -36,6 +36,7 @@
  * @author Reedy
  * @author Sajeel.irkal
  * @author Sayak Sarkar
+ * @author Shantanoo
  * @author Shrish
  * @author Shyam
  * @author Shyam123.ckp
@@ -782,6 +783,7 @@ $2
 ऐसा तब भी हो सकता है यदि आप कोई खराब वेब-आधारित अनामक प्रौक्सी प्रयोग कर रहे हों।",
 'edit_form_incomplete' => "'''सम्पादन फ़ॉर्म के कुछ भाग सर्वर तक नहीं पहुँच पाए; जाँच लें कि आपके द्वारा किये बदलाव अक्षुण्ण हैं, और सहेजने का पुनः यत्न करें।'''",
 'editing' => '$1 सम्पादन',
+'creating' => '$1 बनाएँ',
 'editingsection' => '$1 सम्पादन (अनुभाग)',
 'editingcomment' => '$1 सम्पादन (नया अनुभाग)',
 'editconflict' => 'संपादन अंतर्विरोध: $1',
@@ -851,9 +853,9 @@ $2
 यह पहले से मौजूद है।',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => "'''à¤\9aà¥\87तावनà¥\80:''' à¤\87स à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤¬à¤¹à¥\81त à¤\85धिà¤\95 à¤¸à¤\82à¤\96à¥\8dया à¤®à¥\87à¤\82 à¤\95à¥\80मतà¥\80 à¤ªà¤¾à¤°à¥\8dसर à¥\9eंक्शनों का प्रयोग किया गया है।
+'expensive-parserfunction-warning' => "'''à¤\9aà¥\87तावनà¥\80:''' à¤\87स à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤¬à¤¹à¥\81त à¤\85धिà¤\95 à¤¸à¤\82à¤\96à¥\8dया à¤®à¥\87à¤\82 à¤\95à¥\80मतà¥\80 à¤ªà¤¾à¤°à¥\8dसर à¤«à¤¼ंक्शनों का प्रयोग किया गया है।
 
-इनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार है।",
+इनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार {{PLURAL:$2|है|हैं}}।",
 'expensive-parserfunction-category' => 'कीमती पार्सर फ़ंक्शनों का अत्यधिक प्रयोग कर रहे पृष्ठ',
 'post-expand-template-inclusion-warning' => "'''चेतावनी:''' साँचे जुड़ने की सीमा पार हो चुकी है।
 कुछ साँचे नहीं जुड़ेंगे।",
@@ -1008,7 +1010,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'छुपाने की लॉग',
-'suppressionlogtext' => 'नीचे प्रबंधकों से छुपाये गए ब्लॉक और हटाये गये पृष्ठों की सूची है। मौजूदा ब्लॉक एवं बैन देखने के लिये [[Special:BlockList|आइ॰पी ब्लॉक सूची]] देखें।',
+'suppressionlogtext' => 'नीचे प्रबंधकों से छुपाये गए ब्लॉक और हटाये गये पृष्ठों की सूची है।
+मौजूदा ब्लॉक एवं बैन देखने के लिये [[Special:BlockList|ब्लॉक सूची]] देखें।',
 
 # History merging
 'mergehistory' => 'पृष्ठ के इतिहास एकत्रित करें',
@@ -1624,6 +1627,7 @@ $1',
 'backend-fail-contenttype' => '"$1" पर संजोने के लिये फ़ाइल का प्रकार नहीं निश्चित किया जा सका।',
 'backend-fail-batchsize' => 'भंडारण बैकेंड को $1 फ़ाइल {{PLURAL:$1|कार्य}} दिये गए थे; सीमा {{PLURAL:$2|$2 कार्य|$2 कार्यों}} की है।',
 
+# File journal errors
 'filejournal-fail-dbconnect' => 'भंडारण बैकेंड "$1" के जर्नल डाटाबेस से सम्पर्क नहीं हो पाया।',
 'filejournal-fail-dbquery' => 'भंडारण बैकेंड "$1" के जर्नल डाटाबेस का अद्यतन नहीं किया जा सका।',
 
@@ -1862,7 +1866,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'nbytes' => '$1 {{PLURAL:$1|बाइट|बाइट}}',
 'ncategories' => '{{PLURAL:$1|एक श्रेणी|$1 श्रेणियाँ}}',
 'nlinks' => '$1 {{PLURAL:$1|कड़ी|कड़ियाँ}}',
-'nmembers' => '{{PLURAL:$1|एक सदस्य|$1 सदस्य}}',
+'nmembers' => '$1 {{PLURAL:$1|सदस्य}}',
 'nrevisions' => '$1 {{PLURAL:$1|अवतरण}}',
 'nviews' => '{{PLURAL:$1|एक|$1}} बार देखा गया है',
 'nimagelinks' => '$1 {{PLURAL:$1|पृष्ठ|पृष्ठों}} पर प्रयुक्त',
@@ -2069,10 +2073,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'watchnologin' => 'लॉग इन नहीं किया है',
 'watchnologintext' => 'ध्यानसूची में बदलाव के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है।',
 'addwatch' => 'ध्यानसूची में जोड़ें',
-'addedwatchtext' => 'आपकी [[Special:Watchlist|ध्यानसूची]] में "<nowiki>$1</nowiki>" का समावेश कर दिया गया है।
-भविष्य में इस पृष्ठ तथा इस पृष्ठ की वार्ता में होने वाले बदलाव आपकी ध्यानसूची में दिखेंगे तथा [[Special:RecentChanges|हाल में हुए बदलावों की सूची]] में यह पृष्ठ बोल्ड दिखेगा ताकि आप आसानी से इसका ध्यान रख सकें।
+'addedwatchtext' => 'आपकी [[Special:Watchlist|ध्यानसूची]] में "[[:$1]]" पृष्ठ का समावेश कर दिया गया है।
+भविष्य में इस पृष्ठ तथा इसके वार्ता पृष्ठ में होने वाले बदलाव आपकी ध्यानसूची में दिखेंगे तथा [[Special:RecentChanges|हाल में हुए बदलावों की सूची]] में यह पृष्ठ बोल्ड दिखेगा ताकि आप आसानी से इसका ध्यान रख सकें।
 
-<p>अगर आपको इस पृष्ठ को अपनी ध्यानसूची से निकालना हो तो "ध्यान हटायें" पर क्लिक करें।',
+अगर आपको इस पृष्ठ को अपनी ध्यानसूची से निकालना हो तो "ध्यान हटायें" पर क्लिक करें।',
 'removewatch' => 'ध्यानसूची से हटाएँ',
 'removedwatchtext' => '"[[:$1]]" नामक पृष्ठ को आपकी [[Special:Watchlist|ध्यानसूची]] से हटा दिया गया है।',
 'watch' => 'ध्यान रखें',
@@ -2328,7 +2332,7 @@ $1',
 
 # Contributions
 'contributions' => 'सदस्य योगदान',
-'contributions-title' => '$1 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¯à¥\8bà¤\97दान',
+'contributions-title' => '$1 के योगदान',
 'mycontris' => 'मेरा योगदान',
 'contribsub2' => '$1 के लिये ($2)',
 'nocontribs' => 'इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।',
@@ -2362,7 +2366,7 @@ $1',
 'nolinkshere-ns' => "चुने हुए नामस्थानसे '''[[:$1]]''' को जुडने वाले पृष्ठ नहीं हैं।",
 'isredirect' => 'पुनर्निर्देशन पृष्ठ',
 'istemplate' => 'मिलाईयें',
-'isimage' => 'सà¤\82à¤\9aिà¤\95ा à¤\95ि à¤\95ड़à¥\80',
+'isimage' => 'फ़ाà¤\87ल à¤ªà¥\8dरयà¥\8bà¤\97',
 'whatlinkshere-prev' => '{{PLURAL:$1|पिछला|पिछले $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|अगला|अगले $1}}',
 'whatlinkshere-links' => '← कड़ियाँ',
@@ -2632,6 +2636,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 पृष्ठों को निर्यात करने के लिए, नीचे विषय वस्तु संदूक में शीर्षक प्रवेश करें, एक शीर्षक प्रति पंक्ति, और चुने कि आप वर्त्तमान अवतरण के साथ पुराने अवतरण भी चाहते हैं कि नहीं, या पिछले संपादन के बारे में जानकारी के साथ केवल वर्त्तमान अवतरण चाहते हैं।
 
 बाद वाली स्थिति के लिए आप एक सम्पर्क भी प्रयोग कर सकते हैं, उदाहरण के लिए, "[[{{MediaWiki:Mainpage}}]]" पृष्ठ के लिए [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।',
+'exportall' => 'सभी पृष्ठ निर्यात करें',
 'exportcuronly' => 'पूरा इतिहास नहीं चाहियें, सिर्फ अभी का अवतरण अंतर्भूत करें',
 'exportnohistory' => "----
 '''सूचना:''' इस फॉर्म का इस्तेमाल कर पृष्ठका पूरा इतिहास निर्यात करना परफॉर्मेन्स के चलते रोक दिया गया हैं।",
@@ -3194,12 +3199,12 @@ $1',
 'exif-focalplaneresolutionunit-2' => 'इंच',
 
 'exif-sensingmethod-1' => 'अव्यक्त',
-'exif-sensingmethod-2' => 'वन चीप कलर एरीया सेन्सर',
-'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
-'exif-sensingmethod-4' => 'थ्री चीप कलर एरीया सेन्सर',
+'exif-sensingmethod-2' => 'वन चीप कलर एरीया सेन्सर',
+'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
+'exif-sensingmethod-4' => 'थ्री चीप कलर एरीया सेन्सर',
 'exif-sensingmethod-5' => 'कलर सिक्वेण्शीयल एरीया सेंसर',
 'exif-sensingmethod-7' => 'ट्रायलिनीयर सेंसर',
-'exif-sensingmethod-8' => 'कलर सिक्वेंशीयल लिनीयर सेन्सर',
+'exif-sensingmethod-8' => 'कलर सिक्वेंशीयल लिनीयर सेन्सर',
 
 'exif-filesource-3' => 'डिजिटल स्टिल कैमरा',
 
@@ -3555,6 +3560,7 @@ $5
 'version-software' => 'इन्स्टॉल की हुई प्रणाली',
 'version-software-product' => 'प्रोडक्ट',
 'version-software-version' => 'अवतरण',
+'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
 # Special:FilePath
 'filepath' => 'सञ्चिका पथ',
@@ -3685,7 +3691,7 @@ $5
 'logentry-newusers-newusers' => '$1 created उपयोगकर्ता के खाता',
 'logentry-newusers-create' => '$1 created उपयोगकर्ता के खाता',
 'logentry-newusers-create2' => '$1 created a user account $3',
-'logentry-newusers-autocreate' => 'à¤\96ातà¥\87 $1 à¤¥à¤¾ created à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87',
+'logentry-newusers-autocreate' => 'à¤\96ातà¥\87 $1 à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤¬à¤¨à¤¾à¤¯à¤¾ à¤\97या',
 'newuserlog-byemail' => 'कूटशब्द इ-मेल द्वारा भेजा गया हैं',
 
 # Feedback
@@ -3742,4 +3748,15 @@ $5
 'api-error-uploaddisabled' => 'इस विकि पर अपलोड अक्षम है.',
 'api-error-verification-error' => 'यह फ़ाइल दूषित हो सकती है, या गलत एक्सटेंशन है।',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|सॅकेंड}}',
+'duration-minutes' => '$1 {{PLURAL:$1|मिनट}}',
+'duration-hours' => '$1 {{PLURAL:$1|घंटा|घंटे}}',
+'duration-days' => '$1 {{PLURAL:$1|दिन}}',
+'duration-weeks' => '$1 {{PLURAL:$1|सप्ताह}}',
+'duration-years' => '$1 {{PLURAL:$1|वर्ष}}',
+'duration-decades' => '$1 {{PLURAL:$1|दशक}}',
+'duration-centuries' => '$1 {{PLURAL:$1|शताब्दी}}',
+'duration-millennia' => '$1 {{PLURAL:$1|सहस्राब्दी}}',
+
 );
index 6ecdbda..291dcc5 100644 (file)
@@ -779,7 +779,7 @@ Zbog toga posjetitelji s ove IP adrese trenutačno ne mogu otvoriti nove suradni
 'emailauthenticated' => 'Vaša e-mail adresa je ovjerena $2 u $3.',
 'emailnotauthenticated' => 'Vaša e-mail adresa još nije ovjerena.
 Ne možemo poslati e-mail ni u jednoj od sljedećih naredbi.',
-'noemailprefs' => 'Nije navedena e-mail adresa, stoga sljedeće naredbe neće raditi.',
+'noemailprefs' => 'Nije navedena adresa elektroničke pošte, stoga sljedeće naredbe ne će raditi.',
 'emailconfirmlink' => 'Potvrdite svoju e-mail adresu',
 'invalidemailaddress' => 'Ne mogu prihvatiti e-mail adresu jer nije valjano oblikovana.
 Molim unesite ispravno oblikovanu adresu ili ostavite polje praznim.',
@@ -991,6 +991,7 @@ Stoga je uređivanje odbačeno da se spriječi uništavanje teksta stranice.
 To se ponekad događa kad rabite neispravan web-baziran anonimni posrednik (proxy).",
 'edit_form_incomplete' => "'''Neki dijelovi obrasca za uređivanja nisu dostigli do poslužitelja; provjerite jesu li izmjene netaknute i pokušajte ponovno.'''",
 'editing' => 'Uređujete $1',
+'creating' => 'Stvori $1',
 'editingsection' => 'Uređujete $1 (odlomak)',
 'editingcomment' => 'Uređujete $1 (novi odlomak)',
 'editconflict' => 'Istovremeno uređivanje: $1',
@@ -2620,13 +2621,13 @@ mijenjanje postavki, uređivanje popisa praćenja i druge stvari koje zahtijevaj
 # Move page
 'move-page' => 'Premjesti $1',
 'move-page-legend' => 'Premjesti stranicu',
-'movepagetext' => "Korištenjem ovog obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime.
+'movepagetext' => "Uporabom ovog obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime.
 Stari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi naslov.
-Možete odabrati automatsko ažuriranje preusmjeravanja na originalni naslov.
+Možete odabrati automatsko ažuriranje preusmjeravanja na izvorni naslov.
 Ako se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].
 Dužni ste provjeriti da sve poveznice i dalje nastave voditi na prave stranice.
 
-Stranica se '''neće''' premjestiti ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.
+Stranica se '''ne će''' premjestiti ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.
 To znači: 1. ako pogriješite, možete opet preimenovati stranicu na stari naslov, 2. ne može se dogoditi da izbrišete neku postojeću stranicu.
 
 '''Upozorenje!'''
@@ -2636,21 +2637,21 @@ Stari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi n
 Budite sigurni da ste provjerili [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nevaljana preusmjeravanja]]. 
 Vi ste odgovorni za to da poveznice i dalje povezuju tamo gdje treba.
 
-Imajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena. 
-To znači da stranicu možete preimenovati u prethodno ime ukoliko ste pogriješili te ne možete pisati preko postojeće stranice. 
+Imajte na umu da stranica '''ne će''' biti premještena ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena. 
+To znači da stranicu možete preimenovati u prethodno ime ako ste pogriješili te ne možete pisati preko postojeće stranice. 
 
 '''Upozorenje!''' 
 Ovo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice; 
 budite sigurni da razumijete posljedice ove akcije prije nastavka.",
-'movepagetalktext' => "Stranica za razgovor, ako postoji, automatski će se premjestiti zajedno sa stranicom koju premještate. '''Stranica za razgovor neće se premjestiti ako:'''
+'movepagetalktext' => "Stranica za razgovor, ako postoji, automatski će se premjestiti zajedno sa stranicom koju premještate. '''Stranica se za razgovor ne će premjestiti ako:'''
 *premještate stranicu iz jednog prostora u drugi,
 *pod novim imenom već postoji stranica za razgovor s nekim sadržajem, ili
 *maknete kvačicu u kućici na dnu ove stranice.
 
-U tim slučajevima ćete morati sami premjestiti ili iskopirati stranicu za razgovor,
+U tim ćete slučajevima morati sami premjestiti ili iskopirati stranicu za razgovor,
 ako to želite.",
 'movearticle' => 'Premjesti stranicu',
-'moveuserpage-warning' => "'''Upozorenje:''' Premještate suradničku stranicu. Imajte na umu da će stranica biti premještena, ali suradnik ''neće'' biti preimenovan.",
+'moveuserpage-warning' => "'''Upozorenje:''' Premještate suradničku stranicu. Imajte na umu da će stranica biti premještena, ali suradnik ''ne će'' biti preimenovan.",
 'movenologin' => 'Niste prijavljeni',
 'movenologintext' => 'Ako želite premjestiti stranicu morate biti [[Special:UserLogin|prijavljeni]].',
 'movenotallowed' => 'Nemate pravo premještanja stranica.',
@@ -3773,7 +3774,7 @@ Slike se na taj način prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
 'sqlite-no-fts' => '$1 bez podrške pretraživanja cijelog teksta',
 
 # New logging system
-'logentry-delete-delete' => '$1 je obrisao stranicu $3',
+'logentry-delete-delete' => '$1 obrisao je stranicu $3',
 'logentry-delete-restore' => '$1 je vratio stranicu $3',
 'logentry-delete-event' => '$1 je promijenio vidljivost {{PLURAL:$5|zapisa u evidenciji|$5 zapisa u evidenciji}} na $3: $4',
 'logentry-delete-revision' => '$1 je promijenio vidljivost {{PLURAL:$5|uređivanja|$5 uređivanja}} na stranici $3: $4',
index b3da4ff..312aa1e 100644 (file)
@@ -803,7 +803,8 @@ Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony]] na druhich stronach
 'updated' => '(Zaktualizowany)',
 'note' => "'''Kedźbu:'''",
 'previewnote' => "'''Wobmysl, zo to je jenož přehlad.'''
-Twoje změny hišće njejsu składowane! [[#editform|→ Dale wobdźěłaś]]",
+Twoje změny hišće njejsu składowane!",
+'continue-editing' => 'Dale wobdźěłać',
 'previewconflict' => 'Tutón přehlad zwobraznja tekst w hornim tekstowym polu,  kaž so zjewi, jeli jón składuješ.',
 'session_fail_preview' => "'''Njemóžachmy twoju změnu předźěłać, dokelž su so posedźenske daty zhubili.'''
 Spytaj prošu hišće raz.
@@ -895,6 +896,10 @@ Dyrbjała mjenje hač $2 {{PLURAL:$2|wołanje|wołanjej|wołanja|wołanjow}} mě
 'parser-template-loop-warning' => 'Předłohowa sekla wotkryta: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limit za rekursijnu hłubokosć předłohi překročeny ($1)',
 'language-converter-depth-warning' => 'Limit hłubokosće rěčneho konwertera překročena ($1)',
+'node-count-exceeded-category' => 'Strony, hdźež ličba sukow je překročena',
+'node-count-exceeded-warning' => 'Strona je ličbu sukow překročiła',
+'expansion-depth-exceeded-category' => 'Strony, hdźež ekspansiska hłubokosć je překročena',
+'expansion-depth-exceeded-warning' => 'Strona je ekspansisku hłubokosć překročił',
 
 # "Undo" feature
 'undo-success' => 'Wersija je so wuspěšnje wotstroniła. Prošu přepruwuj deleka w přirunanskim napohledźe, hač twoja změna bu přewzata a klikń potom na „Składować”, zo by změnu składował.',
@@ -1036,7 +1041,7 @@ Prošu přepruwuj protokole.',
 # Suppression log
 'suppressionlog' => 'Protokol potłóčenjow',
 'suppressionlogtext' => 'Deleka je lisćina wušmórnjenjow a zablokowanjow, inkluziwnje wobsaha schowaneho wot administratorow.
-Hlej [[Special:BlockList|Lisćina zablokowanych IP-adresow]] za lisćinu tuchwilnych zablokowanjow.',
+Hlej [[Special:BlockList|Lisćinu blokowanjow]] za lisćinu tuchwilnych zablokowanjow.',
 
 # History merging
 'mergehistory' => 'Stawizny stronow zjednoćić',
@@ -1968,6 +1973,11 @@ Prošu wobkedźbuj, zo druhe websydła móža na dataju z direktnym URL wotkazow
 'allpages-bad-ns' => 'Mjenowy rum „$1" w {{grammar:lokatiw|{{SITENAME}}}} njeeksistuje.',
 'allpages-hide-redirects' => 'Dalesposrědkowanja schować',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Wobhladuješ sej pufrowanu wersiju tuteje strony, kotraž móže do $1 stara być.',
+'cachedspecial-viewing-cached-ts' => 'Wobhladuješ sej pufrowanu wersiju tuteje strony, kotraž móhła njeaktualna być.',
+'cachedspecial-refresh-now' => 'Aktualnu wersiju sej wobhladać.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Slědowaca kategorija wobsahuje|Slědowacej kategoriji wobsahujetej|Slědowace kategorije wobsahuja|Slědowace kategorije wobsahuja}} strony abo medije.
@@ -2396,8 +2406,8 @@ Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
 'ipb-confirm' => 'Blokowanje wobkrućić',
 'badipaddress' => 'Njepłaćiwa IP-adresa',
 'blockipsuccesssub' => 'Zablokowanje wuspěšne',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] bu zablokowany.
-<br />Hlej [[Special:BlockList|lisćinu blokowanjow IP]], zo by zablokowanjow pruwował.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] bu {{GENDER:$1|zablokowany|zablokowana}}.<br />
+Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.',
 'ipb-blockingself' => 'Chceš samoho blokować! Chceš to woprawdźe činić?',
 'ipb-confirmhideuser' => 'Chceš runje wužiwarja z nastajenjom "wužiwarja schować" blokować. To k tomu dowjedźe, zo mjeno wužiwarja so we wšch lisćinach a protokolowych zapiskach potłóči. Chceš to woprawdźe činić?',
 'ipb-edit-dropdown' => 'přičiny zablokowanjow wobdźěłać',
@@ -2447,7 +2457,7 @@ Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
 'blocklog-showsuppresslog' => 'Tutón wužiwar bu prjedy zablokowany a schowany. Protokol potłóčenjow  so deleka jako referenca podawa:',
 'blocklogentry' => 'je wužiwarja [[$1]] zablokował z časom spadnjenja $2 $3',
 'reblock-logentry' => 'změni blokowanske nastajenja za [[$1]] z časom spadnjenja $2 $3',
-'blocklogtext' => 'To je protokol blokowanja a wotblokowanja wužiwarjow. Awtomatisce blokowane IP-adresy so njenalistuja. Hlej [[Special:BlockList|lisćinu zablokowanych IP-adresow]] za lisćinu tuchwilnych wuhnaćow a zablokowanjow.',
+'blocklogtext' => 'To je protokol blokowanja a wotblokowanja wužiwarjow. Awtomatisce blokowane IP-adresy so njenalistuja. Hlej [[Special:BlockList|lisćinu blokowanjow]] za lisćinu tuchwilnych wuhnaćow a zablokowanjow.',
 'unblocklogentry' => 'zablokowanje wužiwarja $1 bu zběhnjene',
 'block-log-flags-anononly' => 'jenož anonymnych',
 'block-log-flags-nocreate' => 'wutworjenje wužiwarskich kontow znjemóžnjene',
@@ -3495,6 +3505,9 @@ Ty měł [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licency GNU General Public Lic
 'version-software' => 'Instalowana software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Wersija',
+'version-entrypoints' => 'URL zastupneho dypka',
+'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Datajowy puć',
@@ -3683,4 +3696,15 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'api-error-uploaddisabled' => 'Nahraća su na tutym wikiju znjemóžnjene.',
 'api-error-verification-error' => 'Tuta dataja móhła wobkškodźena być abo wopačny sufiks měć.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundźe|sekundy|sekundow}}',
+'duration-minutes' => '$1 {{PLURAL:$1|mjeńšina|mjeńšinje|mjeńšiny|mjeńšin}}',
+'duration-hours' => '$1 {{PLURAL:$1|hodźina|hodźinje|hodźiny|hodźin}}',
+'duration-days' => '$1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}}',
+'duration-weeks' => '$1 {{PLURAL: $1|tydźeń|njedźeli|njedźele|njedźel}}',
+'duration-years' => '$1 {{PLURAL: $1|lěto|lěće|lěta|lět}}',
+'duration-decades' => '$1 {{PLURAL:$1|lětdźesatk|lětdźesatkaj|lětdźesatki|lětdźesatkow}}',
+'duration-centuries' => '$1 {{PLURAL:$1|lětstotk|lětstotkaj|lětstotki|lětstotkow}}',
+'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysacaj|lěttysacy|lěttysacow}}',
+
 );
index 00e1fc5..51f94d7 100644 (file)
@@ -991,6 +991,7 @@ a szerkesztési tokenben. A szerkesztés azért lett visszautasítva, hogy megel
 Ez a probléma akkor fordulhat elő, ha hibás, web-alapú proxyszolgáltatást használsz.'''",
 'edit_form_incomplete' => "'''A szerkesztési űrlap egyes részei nem érkeztek meg a szerverre; ellenőrizd újra, hogy a szerkesztés sértetlen-e, majd próbáld újra.'''",
 'editing' => '$1 szerkesztése',
+'creating' => '$1 létrehozása',
 'editingsection' => '$1 szerkesztése (szakasz)',
 'editingcomment' => '$1 szerkesztése (új szakasz)',
 'editconflict' => 'Szerkesztési ütközés: $1',
@@ -2134,6 +2135,7 @@ A napló típusának, a szerkesztő nevének (kis- és nagybetűérzékeny), vag
 'allpagesprefix' => 'Lapok listázása, amik ezzel az előtaggal kezdődnek:',
 'allpagesbadtitle' => 'A megadott lapnév nyelvközi vagy wikiközi előtagot tartalmazott, vagy érvénytelen volt. Talán olyan karakter van benne, amit nem lehet lapnevekben használni.',
 'allpages-bad-ns' => 'A(z) {{SITENAME}} webhelyen nincs "$1" névtér.',
+'allpages-hide-redirects' => 'Átirányítások elrejtése',
 
 # Special:Categories
 'categories' => 'Kategóriák',
index fc929db..398296a 100644 (file)
@@ -887,6 +887,7 @@ $2',
 '''Եթե սա բարեխիղճ խմբագրման փորձ է, խնդրում ենք փորձել կրկին։ Սխալի կրկնման դեպքում՝ փորձեք [[Special:UserLogout|դուրս գալ]], ապա կրկին մտնել համակարգ։'''",
 'token_suffix_mismatch' => "'''Ձեր խմբագրումը մերժվել է, քանի որ ձեր օգտագործած ծրագիրը աղավաղել է կետադրության նշանները խմբագրման դաշտում։ Խմբագրումը մերժվել է էջի տեքստի խաթարումը կանխելու նպատակով։ Սա երբեմն պայմանավորված է սխալներ պարունակող անանվանեցնող վեբ-փոխարինորդ (proxy) ծառայության օգտագործմամբ։'''",
 'editing' => 'Խմբագրում. $1',
+'creating' => 'Ստեղծում $1',
 'editingsection' => 'Խմբագրում. $1 (բաժին)',
 'editingcomment' => 'Խմբագրում $1 (նոր բաժին)',
 'editconflict' => 'Խմբագրման ընդհարում. $1',
@@ -1035,6 +1036,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'difference' => '(Խմբագրումների միջև եղած տարբերությունները)',
 'lineno' => 'Տող  $1.',
 'compareselectedversions' => 'Համեմատել ընտրած տարբերակները',
+'showhideselectedversions' => 'Ցուցադրել/թաքցնել ընտրված խմբագրումները',
 'editundo' => 'հետ շրջել',
 'diff-multi' => '({{PLURAL:$1|$1 միջանկյալ տարբերակ|$1 միջանկյալ տարբերակ}} ցուցադրված չէ։)',
 
@@ -2048,8 +2050,8 @@ $1',
 '''ԶԳՈՒՇԱՑՈ՜ՒՄ'''
 Այս գործողությունը կարող է ունենալ արմատական ազդեցություն ''ժողովրդական'' էջի համար։
 Շարունակելուց առաջ խնդրում ենք համոզվել նրանում, որ դուք հասկանում եք հնարավոր հետևանքները։",
-'movepagetalktext' => "Կցված քննարկման էջը ավտոմատիկ կտեղափոխվի էջի հետ՝ '''բացառությամբ դեպքերի, երբ'''.
-*Գոյություն ունի ոչ-դատարկ քքնարկման էջ նոր անվանման տակ
+'movepagetalktext' => "Կցված քննարկման էջը ավտոմատ կտեղափոխվի էջի հետ՝ '''բացառությամբ այն դեպքերի, երբ'''.
+*Գոյություն ունի ոչ-դատարկ քննարկման էջ նոր անվանման տակ
 *Դուք հանել եք նշումը ստորև արկղից
 
 Այսպիսի դեպքերում հարկավոր է տեղափոխել կամ միաձուլել էջերը ձեռքով, եթե դա ցանկանաք։",
index 0055cc1..7b8c28a 100644 (file)
@@ -534,6 +534,8 @@ Le motivo specificate es ''$2''.",
 'filereadonlyerror' => 'Impossibile modificar le file "$1" perque le deposito de files "$2" es in modo de lectura sol.
 
 Le administrator qui lo blocava offereva iste explication: "$3".',
+'invalidtitle-knownnamespace' => 'Titulo invalide con spatio de nomines "$2" e texto "$3"',
+'invalidtitle-unknownnamespace' => 'Titulo invalide con spatio de nomines incognite $1 e texto "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Configuration incorrecte: programma antivirus non cognoscite: ''$1''",
@@ -843,7 +845,8 @@ Memora que le paginas .css and .js personalisate usa un titulo in minusculas, p.
 'updated' => '(Actualisate)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Isto es solmente un previsualisation.'''
-Le modificationes non ha ancora essite publicate! [[#editform|→ Continuar le modification]]",
+Le modificationes non ha ancora essite publicate!",
+'continue-editing' => 'Continuar a modificar',
 'previewconflict' => 'Iste previsualisation reflecte le apparentia final del texto in le area de modification superior
 si tu opta pro publicar lo.',
 'session_fail_preview' => "'''Nos non poteva processar tu modification proque nos perdeva le datos del session.
@@ -942,6 +945,10 @@ Iste parametros ha essite omittite.",
 'parser-template-loop-warning' => 'Recursion infinite detegite in patrono: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limite de recursion del patrono excedite ($1)',
 'language-converter-depth-warning' => 'Limite de profunditate del conversor de lingua excedite ($1)',
+'node-count-exceeded-category' => 'Paginas in que le numero de nodos excede le limite',
+'node-count-exceeded-warning' => 'Le numero de nodos in iste pagina excede le limite',
+'expansion-depth-exceeded-category' => 'Paginas in que le profunditate de expansion excede le limite',
+'expansion-depth-exceeded-warning' => 'Le profunditate de expansion in iste pagina excede le limite',
 
 # "Undo" feature
 'undo-success' => 'Le modification pote esser disfacite.
@@ -1088,7 +1095,7 @@ Per favor verifica le registros.',
 # Suppression log
 'suppressionlog' => 'Registro de suppressiones',
 'suppressionlogtext' => 'Infra es un lista de deletiones e blocadas que involve contento que es celate de administratores.
-Vide le [[Special:BlockList|lista de blocadas IP]] pro le lista de bannimentos e blocadas actualmente in operation.',
+Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e blocadas actualmente in operation.',
 
 # History merging
 'mergehistory' => 'Fusionar historias del paginas',
@@ -1765,6 +1772,7 @@ Pro securitate optimal, img_auth.php es disactivate.',
 'http-curl-error' => 'Error al obtener datos del URL: $1',
 'http-host-unreachable' => 'Non poteva acceder al URL',
 'http-bad-status' => 'Un problema occurreva durante le requesta HTTP: $1 $2',
+'http-truncated-body' => 'Le corpore del requesta ha essite solo partialmente recipite.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Non poteva acceder al URL',
@@ -2046,6 +2054,11 @@ Es possibile que illo contine un o plus characteres que non pote esser usate in
 'allpages-bad-ns' => '{{SITENAME}} non ha un spatio e nomines "$1".',
 'allpages-hide-redirects' => 'Celar redirectiones',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Tu vide un version in cache de iste pagina, que pote haber usque a $1 de etate.',
+'cachedspecial-viewing-cached-ts' => 'Tu vide un version in cache de iste pagina, que pote non esser completemente actual.',
+'cachedspecial-refresh-now' => 'Vider le plus recente.',
+
 # Special:Categories
 'categories' => 'Categorias',
 'categoriespagetext' => 'Le sequente {{PLURAL:$1|categoria|categorias}} contine paginas o multimedia.
@@ -2503,7 +2516,7 @@ specific que ha essite vandalisate).',
 'badipaddress' => 'Adresse IP mal formate.',
 'blockipsuccesssub' => 'Blocada succedite',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ha essite blocate.<br />
-Vide le [[Special:BlockList|lista de adresses IP blocate]] pro revider le blocadas.',
+Vide le [[Special:BlockList|lista de blocadas]] pro revider le blocadas.',
 'ipb-blockingself' => 'Tu sta super le puncto de blocar te mesme! Es tu secur de voler facer isto?',
 'ipb-confirmhideuser' => 'Tu es super le puncto de blocar un usator con le option "celar usator" activate. Isto supprimera le nomine del usator in tote le listas e entratas de registro. Es tu secur de voler facer isto?',
 'ipb-edit-dropdown' => 'Modificar le motivos pro blocar',
@@ -2557,7 +2570,7 @@ Le motivo specificate pro le blocada de $1 es: "$2"',
 'reblock-logentry' => 'cambiava configurationes de blocada pro [[$1]] con un tempore de expiration de $2 $3',
 'blocklogtext' => 'Isto es un registro de blocadas e disblocadas de usatores.
 Le adresses IP automaticamente blocate non es includite.
-Vide le [[Special:BlockList|lista de blocadas IP]] pro le lista de bannimentos e blocadas actualmente in operation.',
+Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e blocadas actualmente in operation.',
 'unblocklogentry' => 'disblocava $1',
 'block-log-flags-anononly' => 'usatores anonyme solmente',
 'block-log-flags-nocreate' => 'creation de contos disactivate',
@@ -3661,6 +3674,11 @@ Vos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Lic
 'version-software' => 'Software installate',
 'version-software-product' => 'Producto',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'URL del puncto de entrata',
+'version-entrypoints-header-entrypoint' => 'Puncto de entrata',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cammino al articulo]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cammino al script]',
 
 # Special:FilePath
 'filepath' => 'Cammino del file',
@@ -3849,4 +3867,15 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 'api-error-uploaddisabled' => 'Le incargamento es disactivate in iste wiki.',
 'api-error-verification-error' => 'Le file pote esser corrumpite o su nomine pote haber un extension errate.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|secunda|secundas}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minutas}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|horas}}',
+'duration-days' => '$1 {{PLURAL:$1|die|dies}} retro',
+'duration-weeks' => '$1 {{PLURAL:$1|septimana|septimanas}}',
+'duration-years' => '$1 {{PLURAL:$1|anno|annos}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennio|decennios}}',
+'duration-centuries' => '$1 {{PLURAL:$1|seculo|seculos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennio|millennios}}',
+
 );
index 15f3e51..7ca994c 100644 (file)
@@ -801,6 +801,7 @@ Karenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain un
 'invalidemailaddress' => 'Alamat surel ini tidak dapat diterima karena formatnya tidak sesuai.
 Harap masukkan alamat surel dalam format yang benar atau kosongkan isian tersebut.',
 'cannotchangeemail' => 'Alamat surel akun tidak dapat diubah di wiki ini.',
+'emaildisabled' => 'Situs ini tidak dapat mengirim surel.',
 'accountcreated' => 'Akun dibuat',
 'accountcreatedtext' => 'Akun pengguna untuk $1 telah dibuat.',
 'createaccount-title' => 'Pembuatan akun untuk {{SITENAME}}',
@@ -1013,6 +1014,7 @@ Suntingan tersebut ditolak untuk mencegah kesalahan pada teks halaman.
 Hal ini kadang terjadi jika Anda menggunakan layanan proxy anonim berbasis web yang bermasalah.",
 'edit_form_incomplete' => "'''Beberapa bagian dari formulir suntingan tidak mencapai server; periksa ulang apakah suntingan Anda tetap utuh dan coba lagi.'''",
 'editing' => 'Menyunting $1',
+'creating' => 'Membuat $1',
 'editingsection' => 'Menyunting $1 (bagian)',
 'editingcomment' => 'Menyunting $1 (bagian baru)',
 'editconflict' => 'Konflik penyuntingan: $1',
index 2b5502c..0a85879 100644 (file)
@@ -405,7 +405,7 @@ $2',
 Ti naited a rason ket ''$2''.",
 'filereadonlyerror' => 'Di nabaliwan ti papales "$1" gapu ket ti repositorio ti papeles "$2" ket basaen laeng a moda.
 
-Ti rason a naited ket "\'\'$3\'\'".',
+Ti administrador a nagserra ket nagited iti daytoy a panagilawlawag "\'\'$3\'\'".',
 
 # Virus scanner
 'virus-badscanner' => 'Madi di panaka-aramidna: Di am-ammo a birus a panagskan: "$1"',
@@ -501,6 +501,7 @@ Awan ti e-surat nga ipatulod para dagitoy a langa.',
 'invalidemailaddress' => 'Ti e-surat a pagtaengam ket saan a maawat, ket kasla addaan ti saan a napudno a nakabuklan.
 Pangngaasi ta ikkam ti nasayaat  a  nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
 'cannotchangeemail' => 'Dagiti pakabilangan nga e-surat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
+'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatuod kadagiti e-surat.',
 'accountcreated' => 'Naaramiden ti pakabilangan',
 'accountcreatedtext' => 'Naaramiden ti pakabilangan a pagaramat ni $1.',
 'createaccount-title' => 'Panagaramid iti pakabilangan para iti {{SITENAME}}',
@@ -708,7 +709,9 @@ Ti naudi a listaan ti panaka-serra ket adda dita baba tapno mausar a reperensia:
 Annawid a .css ken .js dagiti titulo ket agususar ti napababa a letra, a kas dagiti {{ns:user}}:Foo/vector.css saan ket a {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Napabaro)',
 'note' => "'''Paammo:'''",
-'previewnote' => "'''Maysa laeng a pagpadas daytoy; dagiti sinukatam ket saan pay a naidulin!'''",
+'previewnote' => "'''Laglagipem a daytoy ket panagipadas laeng.'''
+Dagiti sinukatam ket saan pay a naidulin!",
+'continue-editing' => 'Agtultuloy nga agurnos',
 'previewconflict' => 'Daytoy a panagpadas ket agiparang ti testo dita ngato a panagurnos a lugar a kasla agparang no kayatmo nga idulin.',
 'session_fail_preview' => "'''Pasensian a! Saan mi a maaramid ti panag-urnos gapu ngamin ta naawanan ti gimong ti data.'''
 Pangngaasi ta padasem manen.
@@ -724,6 +727,7 @@ Ti panag-urnos ket saan a naawat tapno mapawilan ti panakadadael ti testo ti pan
 Mapasamak daytoy no agus-usar ka ti saan a nasayaat a naibasta ti sapot a diamammo a proxy a panagserbi.",
 'edit_form_incomplete' => "'''Adda dagiti paset ti panag-urnos a kabuklan a saan a nakadanon dita server; kitkitaen nga dagiti pianag-urnos mo ket saan a naikkatan ken padasem manen.'''",
 'editing' => 'Ururnosen ti $1',
+'creating' => 'Agparpartuat ti $1',
 'editingsection' => 'Ururnosen ti $1 (paset)',
 'editingcomment' => 'Ururnosen ti $1 (baro a paset)',
 'editconflict' => 'Adda kasinnungat ti panag-urnos: $1',
@@ -791,6 +795,7 @@ Kasla met naikkaten.',
 'edit-no-change' => 'Ti inurnos mo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.',
 'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
 Adda met daytoyen.',
+'defaultmessagetext' => 'Naisigud a testo ti mensahe',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser nga opisio a pinagtawtawag.
@@ -950,8 +955,8 @@ Saan mo a mabalin a serrekan.',
 
 # Suppression log
 'suppressionlog' => 'Listaan ti nadepdepan',
-'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken naserraan nga adda nagyanna a nailemmeng kadagiti administrador.
-Kitaen ti [[Special:BlockList|Listaan ti naserraan nga IP]] iti listaan ti agdama a kadagiti operasional a pinagparit ken panagserra',
+'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken npanagserra a nairaman dagiti linaon a nailemmeng manipud kadagiti administrador.
+Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama nga operasional a pinagparit ken panagserra.',
 
 # History merging
 'mergehistory' => 'Pagtiponen dagiti pakasaritaan ti pampanid',
@@ -1895,6 +1900,10 @@ Mapabassit mo ti pinagpakita no piliam ti kita ti listaan, ti nagan ti gar-arama
 'allpages-bad-ns' => 'Awan ti {{SITENAME}} iti nagan ti lugar a "$1".',
 'allpages-hide-redirects' => 'Ilemmeng dagiti baw-ing',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Kitkitaenm ti naidulin a bersion iti daytoy a panid, nga addan ti kadaanan a $1.',
+'cachedspecial-refresh-now' => 'Kitaen ti kinaudian.',
+
 # Special:Categories
 'categories' => 'Dagiti kategoria',
 'categoriespagetext' => 'Dagiti sumaganad a {{PLURAL:$1|nagyan ti kategoria|dagiti nagyan ti kategoria}} pampanid wenno midia.
@@ -2342,8 +2351,8 @@ Ikkan ti nainaganan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid
 'ipb-confirm' => 'Pasingkedan ti serra',
 'badipaddress' => 'Imbalido nga IP a pagtaengan',
 'blockipsuccesssub' => 'Balligi ti panangserra',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ket naserraan.<br />
-Kitaen ti [[Special:BlockList|listaan ti IP a naserraan]] ta kitaen dagiti serra.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ket naserraanen.<br />
+Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti serra.',
 'ipb-blockingself' => 'Mangrugrugi ka nga agserra kenka! Sigurado nga kayatmo nga aramiden daytoy?',
 'ipb-confirmhideuser' => 'Mangrugrugi ka ti mangserra ti agar-aramat nga addaan ti napabalin na nga "ilemmeng ti agar-aramat". Iddeppen na ti nagan daytoy nga agar-aramat kadagiti amin a listaan ken dagiti naikabkabil ti listaan. Sigurado ka a kasta ti kayatmo?',
 'ipb-edit-dropdown' => 'Urnosen dagiti rason ti panagserra',
@@ -2396,9 +2405,9 @@ Ti listaan ti serra ket naikabil dita baba tapno mausar a reperensia:',
 Ti listaan ti napasardeng ket naikabil dita baba tapno mausar a reperensia:',
 'blocklogentry' => 'naserraan ni [[$1]] nga addaan ti oras ti panagpaso nga $2 $3',
 'reblock-logentry' => 'sinukatan ti panakaserra ni [[$1]] ti agtapos nga oras nga $2 $3',
-'blocklogtext' => 'Daytoy ket listaan ti gar-aramat kadagiti pinagserraken panaglukat ti serra
-Dagiti na-automatiko a panakaserra ti IP a pagtaengan ket saan a nailista.
-Kitaen ti [[Special:BlockList|Listaan ti serra ti IP]] ti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.',
+'blocklogtext' => 'Daytoy ket listaan ti agar-aramat kadagiti pinagserra ken panaglukat ti serra
+Dagiti na-atomatiko a panakaserra ti IP a pagtaengan ket saan a nailista.
+Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.',
 'unblocklogentry' => 'lukatan ti serra ni $1',
 'block-log-flags-anononly' => 'dagiti di am-ammo nga agar-aramat laeng',
 'block-log-flags-nocreate' => 'naisardeng ti pinagaramid iti pakabilangan',
@@ -3073,6 +3082,8 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-planarconfiguration-1' => 'chunky format',
 'exif-planarconfiguration-2' => 'planar format',
 
+'exif-colorspace-65535' => 'Di-nakalibrar',
+
 'exif-componentsconfiguration-0' => 'awan',
 
 'exif-exposureprogram-0' => 'Saan a naipalpalawag',
@@ -3455,6 +3466,9 @@ Naka-awat ka kuman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'version-software' => 'Naikabil a software',
 'version-software-product' => 'Produkto',
 'version-software-version' => 'Bersion',
+'version-entrypoints' => 'Paserrekan a puntos dagiti URL',
+'version-entrypoints-header-entrypoint' => 'Pagserrekan a puntos',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Dalanan ti papeles',
@@ -3644,4 +3658,15 @@ Nupay kasta, mau-sar mo ti nakabuklan dita baba. Ti komentario nga ited mo ket m
 'api-error-uploaddisabled' => 'Nabaldado ti mangipapan iti daytoy a wiki.',
 'api-error-verification-error' => 'Dakes ngata daytoy a papeles, wenno addaan ti madi a pagpa-atiddog.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|seg-segundo}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|min-minuto}}',
+'duration-hours' => '$1 {{PLURAL:$1|oras|or-oras}}',
+'duration-days' => '$1 {{PLURAL:$1|aldaw|al-aldaw}}',
+'duration-weeks' => '$1 {{PLURAL:$1|lawas|law-lawas}}',
+'duration-years' => '$1 {{PLURAL:$1|tawen|taw-tawen}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekada|dek-dekada}}',
+'duration-centuries' => '$1 {{PLURAL:$1|siglo|sig-siglo}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenio|mil-milenio}}',
+
 );
index 2cef3f3..f02468c 100644 (file)
@@ -399,7 +399,7 @@ $messages = array(
 Шун йийшая, кхыдола йоазувнашкахь [[Special:Search/{{PAGENAME}}|дола цӀерий хаттам корае]] е <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} нийсамий тептара йоазувнаш корае].</span>',
 'note' => "'''ХӀамоалар:'''",
 'previewnote' => "'''Хьалхе б|аргтассам мара бац.'''
-Яздам кха яздаь дац! [[#editform|→ хувцам д|ахьо д|аде]]",
+Яздам кха яздаь дац!",
 'editing' => 'ГӀалатнийсдар: $1',
 'editingsection' => 'ГIалатнийсдар $1 (оагӀувдакъа)',
 'editingcomment' => 'ГӀалатнийсдар $1 (керда декъам)',
index fbba123..d96a129 100644 (file)
@@ -550,6 +550,7 @@ Voluntez konfirmez se vu volas krear/redaktar ica pagino.',
 Voluntez probar itere.
 Se ol ankore nefuncionas, probez [[Special:UserLogout|ekirar]] e pose enirar.",
 'editing' => 'Vu redaktas $1',
+'creating' => 'Vu kreas $1',
 'editingsection' => 'Vu redaktas $1 (seciono)',
 'editingcomment' => 'Vu redaktas $1 (nova seciono)',
 'editconflict' => 'Redakto-konflikto: $1',
index a61bf30..de93a0d 100644 (file)
@@ -924,6 +924,7 @@ Ef þetta leysir ekki vandamálið, reyndu að [[Special:UserLogout|skrá þig 
 Þetta getur gerst þegar þú notar bilaðan vafra eða ónafngreinda vefsels þjónustu.",
 'edit_form_incomplete' => "'''Sumir hlutar breytingarinnar bárust ekki til vefþjónsins; athugaðu hvort breytingin þín er óbreytt og reyndu aftur.'''",
 'editing' => 'Breyti $1',
+'creating' => 'Skapa $1',
 'editingsection' => 'Breyti $1 (hluta)',
 'editingcomment' => 'Breyti $1 (nýr hluti)',
 'editconflict' => 'Breytingaárekstur: $1',
@@ -3313,7 +3314,7 @@ Póstþjónninn skilaði: $1',
 'confirmemail_success' => 'Netfang þitt hefur verið staðfest. Þú getur nú [[Special:UserLogin|skráð þig inn]] og vafrað um wiki-kerfið.',
 'confirmemail_loggedin' => 'Netfang þitt hefur verið staðfest.',
 'confirmemail_error' => 'Eitthvað fór úrskeiðis við vistun staðfestingarinnar.',
-'confirmemail_subject' => '{{SITENAME}} netfangs-staðfesting',
+'confirmemail_subject' => 'Staðfesting netfangs á {{SITENAME}}',
 'confirmemail_body' => 'Einhver, sennilega þú, með vistfangið $1 hefur skráð sig á {{SITENAME}} undir notandanafninu „$2“ og gefið upp þetta netfang.
 
 Til að staðfesta að það hafi verið þú sem skráðir þig undir þessu nafni, og til þess að virkja póstsendingar í gegnum {{SITENAME}}, skaltu opna þennan tengil í vafranum þínum:
index 110b994..370f8e9 100644 (file)
@@ -29,6 +29,7 @@
  * @author FollowTheMedia
  * @author Gianfranco
  * @author HalphaZ
+ * @author Jasonbleinel
  * @author Kaganer
  * @author Klutzy
  * @author Marco 27
@@ -57,6 +58,7 @@
  * @author Una giornata uggiosa '94
  * @author Vajotwo
  * @author Valepert
+ * @author Ximo17
  * @author Xpensive
  * @author ZioNicco
  * @author לערי ריינהארט
@@ -918,7 +920,8 @@ L'ultimo elemento del registro dei blocchi è riportato di seguito per informazi
 'updated' => '(Aggiornato)',
 'note' => "'''NOTA:'''",
 'previewnote' => "'''Ricorda che questa è solo un'anteprima.'''
-Le tue modifiche NON sono ancora state salvate! [[#editform|→ Continua a modificare]]",
+Le tue modifiche NON sono ancora state salvate!",
+'continue-editing' => 'Continua a modificare',
 'previewconflict' => 'L\'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di premere "Salva la pagina" in questo momento.',
 'session_fail_preview' => "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.
 Riprovare.
@@ -1010,6 +1013,10 @@ Alcuni template non verranno inclusi.",
 'parser-template-loop-warning' => 'Rilevato loop del template: [[$1]]',
 'parser-template-recursion-depth-warning' => 'È stato raggiunto il limite di ricorsione nel template ($1)',
 'language-converter-depth-warning' => 'Limite di profondità del convertitore di lingua superato ($1)',
+'node-count-exceeded-category' => 'Pagine dove viene superato il numero di nodi',
+'node-count-exceeded-warning' => 'Questa pagina ha superato il numero di nodi',
+'expansion-depth-exceeded-category' => 'Pagine dove viene superata la profondità di espansione',
+'expansion-depth-exceeded-warning' => 'Questa pagina ha superato la profondità di espansione',
 
 # "Undo" feature
 'undo-success' => 'Questa modifica può essere annullata. Verificare il confronto presentato di seguito per accertarsi che il contenuto corrisponda a quanto desiderato e quindi salvare le modifiche per completare la procedura di annullamento.',
@@ -1146,7 +1153,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Log delle soppressioni',
-'suppressionlogtext' => "Di seguito sono elencate le cancellazioni e i blocchi con del contenuto nascosto agli amministratori. Vedi l'[[Special:BlockList|elenco degli IP bloccati]] per l'elenco dei blocchi attivi al momento.",
+'suppressionlogtext' => "Di seguito sono elencate le cancellazioni e i blocchi con del contenuto nascosto agli amministratori.
+Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blocchi attivi al momento.",
 
 # History merging
 'mergehistory' => 'Unione cronologie',
@@ -1736,6 +1744,10 @@ $1',
 'backend-fail-contenttype' => 'Impossibile determinare la tipologia del file da archiviare in "$1".',
 'backend-fail-batchsize' => 'Il backend di memoria ha programmato una serie di $1 {{PLURAL:$1|operazione|operazioni}} su file; il limite è di $2 {{PLURAL:$2|operazione|operazioni}}.',
 
+# File journal errors
+'filejournal-fail-dbconnect' => 'Impossibile connettersi al database journal per l\'archiviazione back-end "$1".',
+'filejournal-fail-dbquery' => 'Impossibile aggiornare il database journal per l\'archiviazione back-end "$1".',
+
 # Lock manager
 'lockmanager-notlocked' => 'Impossibile sbloccare "$1"; non è bloccato.',
 'lockmanager-fail-closelock' => 'Non riuscita chiusura del file di blocco per "$1".',
@@ -1793,6 +1805,7 @@ Per una sicurezza ottimale, img_auth.php è disattivato.',
 'http-curl-error' => "Errore durante il recupero dell'URL: $1",
 'http-host-unreachable' => 'URL non raggiungibile.',
 'http-bad-status' => "C'è stato un problema durante la richiesta HTTP: $1 $2",
+'http-truncated-body' => 'Il corpo della richiesta è stato solo parzialmente accolto.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL non raggiungibile',
@@ -2067,6 +2080,11 @@ Potrebbero essere presenti immagini che sono usate da altri siti con un collegam
 'allpages-bad-ns' => 'Il namespace "$1" non esiste su {{SITENAME}}.',
 'allpages-hide-redirects' => 'Nascondi redirect',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Stai vedendo una versione di questa pagina memorizzata nella cache, che può essere vecchia al massimo di $1.',
+'cachedspecial-viewing-cached-ts' => 'Stai vedendo una versione di questa pagina memorizzata nella cache, che potrebbe non essere completamente aggiornata.',
+'cachedspecial-refresh-now' => 'Mostra la più recente.',
+
 # Special:Categories
 'categories' => 'Categorie',
 'categoriespagetext' => '{{PLURAL:$1|La categoria indicata di seguito contiene|Le categorie indicate di seguito contengono}} pagine o file multimediali.
@@ -2494,8 +2512,8 @@ Indicare il motivo specifico per il quale si procede al blocco (per esempio, cit
 'ipb-confirm' => 'Conferma il blocco',
 'badipaddress' => 'Indirizzo IP non valido.',
 'blockipsuccesssub' => 'Blocco eseguito',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] è stato bloccato. <br />
-Consultare la [[Special:BlockList|lista degli IP bloccati]] per vedere i blocchi attivi.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] è stato bloccato.<br />
+Consultare la [[Special:BlockList|lista dei blocchi]] per vedere i blocchi attivi.',
 'ipb-blockingself' => 'Stai per bloccare te stesso! Sei sicuro di volerlo fare?',
 'ipb-confirmhideuser' => 'Si sta per bloccare un utente con l\'opzione "Nascondi utente" abilitata.
 In questo modo si evita che il nome utente compaia in tutte le liste e le voci di registro.
@@ -2548,7 +2566,9 @@ Il blocco dell\'utente $1 è stato imposto per il seguente motivo: "$2".',
 'blocklog-showsuppresslog' => 'Questo utente è stato bloccato e nascosto in precedenza. Il registro delle rimozioni è riportato di seguito per informazione:',
 'blocklogentry' => 'ha bloccato [[$1]] per un periodo di $2 $3',
 'reblock-logentry' => 'ha cambiato le impostazioni del blocco per [[$1]] con una scadenza di $2 $3',
-'blocklogtext' => "Di seguito sono elencate le azioni di blocco e sblocco utenti. Gli indirizzi IP bloccati automaticamente non sono elencati. Consultare l'[[Special:BlockList|elenco IP bloccati]] per l'elenco degli indirizzi e nomi utente il cui blocco è operativo.",
+'blocklogtext' => "Di seguito sono elencate le azioni di blocco e sblocco utenti.
+Gli indirizzi IP bloccati automaticamente non sono elencati.
+Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o blocchi attualmente operativi.",
 'unblocklogentry' => 'ha sbloccato $1',
 'block-log-flags-anononly' => 'solo utenti anonimi',
 'block-log-flags-nocreate' => 'creazione account bloccata',
@@ -3631,6 +3651,11 @@ Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/CO
 'version-software' => 'Software installato',
 'version-software-product' => 'Prodotto',
 'version-software-version' => 'Versione',
+'version-entrypoints' => 'URL di accesso',
+'version-entrypoints-header-entrypoint' => 'Punti di accesso',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Percorso voci]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Percorso script]',
 
 # Special:FilePath
 'filepath' => 'Percorso di un file',
@@ -3818,4 +3843,15 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'api-error-uploaddisabled' => 'Il caricamento è disabilitato su questa wiki.',
 'api-error-verification-error' => "Questo file potrebbe essere danneggiato, o avere l'estensione sbagliata.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|secondo|secondi}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minuti}}',
+'duration-hours' => '$1 {{PLURAL:$1|ora|ore}}',
+'duration-days' => '$1 {{PLURAL:$1|giorno|giorni}}',
+'duration-weeks' => '$1 {{PLURAL:$1|settimana|settimane}}',
+'duration-years' => '$1 {{PLURAL:$1|anno|anni}}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decadi}}',
+'duration-centuries' => '$1 {{PLURAL:$1|secolo|secoli}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennio|millenni}}',
+
 );
index 3cabb47..2c6d0f1 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Akaniji
  * @author Alexsh
+ * @author Ant176
  * @author Aotake
  * @author Aphaia
  * @author Broad-Sky
@@ -363,39 +364,39 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'リンクの下線:',
-'tog-justify' => '段è\90½ã\82\92å\9d\87ç­\89å\89²ã\82\8aä»\98ã\81\91ã\81\99ã\82\8b',
+'tog-justify' => '段è\90½ã\81«å\9d\87ç­\89å\89²ã\82\8aä»\98ã\81\91ã\82\92設å®\9a',
 'tog-hideminor' => '最近の更新に細部の編集を表示しない',
 'tog-hidepatrolled' => '最近の更新に巡回済みの編集を表示しない',
 'tog-newpageshidepatrolled' => '新しいページの一覧に巡回済みのページを表示しない',
-'tog-extendwatchlist' => 'ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示する',
-'tog-usenewrc' => '最近の更新ページを拡張する(JavaScriptが必要)',
+'tog-extendwatchlist' => 'ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示',
+'tog-usenewrc' => '最近の更新ページを拡張(JavaScriptが必要)',
 'tog-numberheadings' => '自動的に見出しに番号を振る',
-'tog-showtoolbar' => '編集用のツールバーを表示する(JavaScriptが必要)',
-'tog-editondblclick' => 'ダブルクリックで編集する(JavaScriptが必要)',
+'tog-showtoolbar' => '編集用のツールバーを表示(JavaScriptが必要)',
+'tog-editondblclick' => 'ダブルクリックで編集(JavaScriptが必要)',
 'tog-editsection' => '[編集]リンクから節を編集できるようにする',
-'tog-editsectiononrightclick' => '節見出しの右クリックで節編集を行えるようにする(JavaScriptが必要)',
-'tog-showtoc' => '目次を表示する(ページに見出しが4つ以上ある場合)',
-'tog-rememberpassword' => 'このブラウザにログイン情報を記憶させる(最大$1{{PLURAL:$1|日|日間}})',
-'tog-watchcreations' => '自分が作成したページをウォッチリストに追加する',
-'tog-watchdefault' => '自分が編集したページをウォッチリストに追加する',
-'tog-watchmoves' => '自分が移動したページをウォッチリストに追加する',
-'tog-watchdeletion' => '自分が削除したページをウォッチリストに追加する',
-'tog-minordefault' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\82\92æ\97¢å®\9aã\81§ã\83\81ã\82§ã\83\83ã\82¯ã\81\99る',
-'tog-previewontop' => 'プレビューを編集ボックスの前に配置する',
-'tog-previewonfirst' => '編集開始時にもプレビューを表示する',
+'tog-editsectiononrightclick' => '節見出しの右クリックで節を編集できるようにする(JavaScriptが必要)',
+'tog-showtoc' => '目次を表示(ページに見出しが4つ以上ある場合)',
+'tog-rememberpassword' => 'このブラウザにログイン情報を記憶(最大 $1 {{PLURAL:$1|日間}})',
+'tog-watchcreations' => '自分が作成したページをウォッチリストに追加',
+'tog-watchdefault' => '自分が編集したページをウォッチリストに追加',
+'tog-watchmoves' => '自分が移動したページをウォッチリストに追加',
+'tog-watchdeletion' => '自分が削除したページをウォッチリストに追加',
+'tog-minordefault' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81«æ\97¢å®\9aã\81§ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cる',
+'tog-previewontop' => 'プレビューを編集ボックスの前に配置',
+'tog-previewonfirst' => '編集開始時にもプレビューを表示',
 'tog-nocache' => 'ブラウザによるページのキャッシュを無効にする',
-'tog-enotifwatchlistpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\81¨ã\81\8dã\81«メールを受け取る',
-'tog-enotifusertalkpages' => 'è\87ªå\88\86ã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\81¨ã\81\8dã\81«メールを受け取る',
+'tog-enotifwatchlistpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\82\89メールを受け取る',
+'tog-enotifusertalkpages' => 'è\87ªå\88\86ã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\82\89メールを受け取る',
 'tog-enotifminoredits' => '細部の編集でもメールを受け取る',
-'tog-enotifrevealaddr' => '通知メールで自分のメールアドレスを明示する',
-'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示する',
+'tog-enotifrevealaddr' => '通知メールで自分のメールアドレスを明示',
+'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示',
 'tog-oldsig' => '既存の署名:',
-'tog-fancysig' => 'ç½²å\90\8dã\82\92ã\82¦ã\82£ã\82­æ\96\87ã\81¨ã\81\97ã\81¦æ\89±ã\81\86ï¼\88è\87ªå\8b\95ã\81§ã\83ªã\83³ã\82¯ã\81\97ã\81ªã\81\84)',
-'tog-externaleditor' => '既定で編集に外部アプリケーションを使(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-externaldiff' => '差分表示に外部アプリケーションを使(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
+'tog-fancysig' => 'ç½²å\90\8dã\82\92ã\82¦ã\82£ã\82­æ\96\87ã\81¨ã\81\97ã\81¦æ\89±ã\81\86ï¼\88è\87ªå\8b\95ã\83ªã\83³ã\82¯ã\81ªã\81\97)',
+'tog-externaleditor' => '既定で編集に外部アプリケーションを使(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
+'tog-externaldiff' => '差分表示に外部アプリケーションを使(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-showjumplinks' => '利用しやすさ向上のための「{{int:jumpto}}」リンクを有効にする',
-'tog-uselivepreview' => 'ライブプレビューを使用する(JavaScriptが必要)(試験中の機能)',
-'tog-forceeditsummary' => '要約欄が空欄の場合に警告する',
+'tog-uselivepreview' => 'ライブプレビューを使用(JavaScriptが必要)(開発中)',
+'tog-forceeditsummary' => '要約欄が空欄の場合に確認を促す',
 'tog-watchlisthideown' => 'ウォッチリストに自分の編集を表示しない',
 'tog-watchlisthidebots' => 'ウォッチリストにボットによる編集を表示しない',
 'tog-watchlisthideminor' => 'ウォッチリストに細部の編集を表示しない',
@@ -403,9 +404,9 @@ $messages = array(
 'tog-watchlisthideanons' => 'ウォッチリストに匿名利用者の編集を表示しない',
 'tog-watchlisthidepatrolled' => 'ウォッチリストに巡回済みの編集を表示しない',
 'tog-nolangconversion' => '言語変種変換を無効にする',
-'tog-ccmeonemails' => '他の利用者に送信したメールの控えを自分にも送',
-'tog-diffonly' => '差分表示の下にページの内容を表示しない',
-'tog-showhiddencats' => '隠しカテゴリを表示する',
+'tog-ccmeonemails' => '他の利用者に送信したメールの控えを自分にも送',
+'tog-diffonly' => '差分の下にページ内容を表示しない',
+'tog-showhiddencats' => '隠しカテゴリを表示',
 'tog-noconvertlink' => 'リンクタイトル変換を無効にする',
 'tog-norollbackdiff' => '巻き戻し後の差分を表示しない',
 
@@ -417,8 +418,8 @@ $messages = array(
 'editfont-style' => '編集エリアのフォントスタイル:',
 'editfont-default' => 'ブラウザの設定を使用',
 'editfont-monospace' => '等幅フォント',
-'editfont-sansserif' => 'サンセリフフォント',
-'editfont-serif' => 'セリフフォント',
+'editfont-sansserif' => 'Sans Serif フォント',
+'editfont-serif' => 'Serif フォント',
 
 # Dates
 'sunday' => '日曜日',
@@ -480,12 +481,12 @@ $messages = array(
 'category-empty' => "''このカテゴリには、ページまたはメディアがひとつもありません。''",
 'hidden-categories' => '{{PLURAL:$1|隠しカテゴリ}}',
 'hidden-category-category' => '隠しカテゴリ',
-'category-subcat-count' => '{{PLURAL:$2|このカテゴリには、次の下位カテゴリのみ含まれています。|このカテゴリには、次の$2下位カテゴリが含まれており、そのうち$1カテゴリが表示されています。}}',
-'category-subcat-count-limited' => 'このカテゴリには、次の{{PLURAL:$1|$1下位カテゴリ}}が含まれています。',
-'category-article-count' => '{{PLURAL:$2|このカテゴリには、次のページのみ含まれています。|以下の$2ページがこのカテゴリに含まれており、そのうち$1ページが表示されています。}}',
-'category-article-count-limited' => '以下のページ{{PLURAL:$1|$1ページ}}が、現在のカテゴリに含まれています。',
-'category-file-count' => '{{PLURAL:$2|このカテゴリには、次のファイルのみが含まれています。|このカテゴリには、$2ファイルが含まれており、そのうち$1ファイルが表示されています。}}',
-'category-file-count-limited' => '以下の{{PLURAL:$1|$1ファイル}}が、現在のカテゴリに含まれています。',
+'category-subcat-count' => '{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには $2 下位カテゴリが含まれており、そのうち以下の{{PLURAL:$1|下位カテゴリ|&#32;$1 下位カテゴリ}}を表示しています。}}',
+'category-subcat-count-limited' => 'このカテゴリには以下の{{PLURAL:$1|下位カテゴリ|&#32;$1 下位カテゴリ}}が含まれています。',
+'category-article-count' => '{{PLURAL:$2|このカテゴリには以下のページのみが含まれています。|このカテゴリには $2 ページが含まれており、そのうち以下の {{PLURAL:$1|$1 ページ}}を表示しています。}}',
+'category-article-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ページ|&#32;$1 ページ}}が含まれています。',
+'category-file-count' => '{{PLURAL:$2|このカテゴリには以下のファイルのみが含まれています。|このカテゴリには $2 ファイルが含まれており、そのうち以下の {{PLURAL:$1|$1 ファイル}}を表示しています。}}',
+'category-file-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ファイル|&#32;$1 ファイル}}が含まれています。',
 'listingcontinuesabbrev' => 'の続き',
 'index-category' => '検索エンジンに収集されるページ',
 'noindex-category' => '検索エンジンに収集されないページ',
@@ -495,12 +496,12 @@ $messages = array(
 'article' => '本文',
 'newwindow' => '(新しいウィンドウが開きます)',
 'cancel' => '中止',
-'moredotdotdot' => '続き・・・',
+'moredotdotdot' => '続き...',
 'mypage' => '自分のページ',
 'mytalk' => '自分のトーク',
 'anontalk' => 'このIPアドレスのトーク',
 'navigation' => '案内',
-'and' => 'および',
+'and' => '&#32;および&#32;',
 
 # Cologne Blue skin
 'qbfind' => '検索',
@@ -520,12 +521,12 @@ $messages = array(
 'vector-action-protect' => '保護',
 'vector-action-undelete' => '復帰',
 'vector-action-unprotect' => '保護再設定',
-'vector-simplesearch-preference' => '検索語の提案機能を拡張する(ベクター外装のみ)',
+'vector-simplesearch-preference' => '検索語の提案機能を拡張(ベクター外装のみ)',
 'vector-view-create' => '作成',
 'vector-view-edit' => '編集',
 'vector-view-history' => '履歴表示',
 'vector-view-view' => '閲覧',
-'vector-view-viewsource' => 'ソース表示',
+'vector-view-viewsource' => 'ソースを閲覧',
 'actions' => '操作',
 'namespaces' => '名前空間',
 'variants' => '変種',
@@ -540,7 +541,7 @@ $messages = array(
 'searcharticle' => '表示',
 'history' => 'ページの履歴',
 'history_short' => '履歴',
-'updatedmarker' => '最後の訪問から更新されています',
+'updatedmarker' => '最後の訪問以降に更新されました',
 'printableversion' => '印刷用バージョン',
 'permalink' => 'この版への固定リンク',
 'print' => '印刷',
@@ -551,7 +552,7 @@ $messages = array(
 'create-this-page' => 'このページを作成',
 'delete' => '削除',
 'deletethispage' => 'このページを削除',
-'undelete_short' => '{{PLURAL:$1|$1版}}を復帰',
+'undelete_short' => '{{PLURAL:$1|$1 版}}を復帰',
 'viewdeleted_short' => '削除された$1件の編集を閲覧',
 'protect' => '保護',
 'protect_change' => '設定変更',
@@ -580,7 +581,7 @@ $messages = array(
 'redirectedfrom' => '($1から転送)',
 'redirectpagesub' => 'リダイレクトページ',
 'lastmodifiedat' => 'このページの最終更新は $1 $2 に行われました。',
-'viewcount' => 'このページは{{PLURAL:$1|$1回}}アクセスされました。',
+'viewcount' => 'このページは {{PLURAL:$1|$1 回}}アクセスされました。',
 'protectedpage' => '保護されたページ',
 'jumpto' => '移動:',
 'jumptonavigation' => '案内',
@@ -597,7 +598,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}}について',
 'aboutpage' => 'Project:{{SITENAME}}について',
-'copyright' => 'å\86\85容ã\81¯$1ã\81®ã\83©ã\82¤ã\82»ã\83³ã\82¹ã\81§å\88©ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82',
+'copyright' => '内容は$1のライセンスで利用できます。',
 'copyrightpage' => '{{ns:project}}:著作権',
 'currentevents' => '最近の出来事',
 'currentevents-url' => 'Project:最近の出来事',
@@ -611,27 +612,28 @@ $1',
 'policy-url' => 'Project:方針',
 'portal' => 'コミュニティ・ポータル',
 'portal-url' => 'Project:コミュニティ・ポータル',
-'privacy' => 'プライバシーポリシー',
-'privacypage' => 'Project:プライバシーポリシー',
+'privacy' => 'プライバシー ポリシー',
+'privacypage' => 'Project:プライバシー ポリシー',
 
 'badaccess' => '権限がありません',
 'badaccess-group0' => '要求した操作を行うことは許可されていません。',
-'badaccess-groups' => 'この操作は、$1{{PLURAL:$2|の|のいずれかの}}グループに属する利用者のみが実行できます。',
+'badaccess-groups' => 'この操作は、以下の{{PLURAL:$2|グループ|グループのいずれか}}に属する利用者のみが実行できます: $1。',
 
-'versionrequired' => 'MediaWikiのバージョン$1が必要',
-'versionrequiredtext' => 'このページの利用にはMediaWikiのバージョン$1が必要です。[[Special:Version|バージョン情報]]を確認してください。',
+'versionrequired' => 'MediaWiki のバージョン $1 が必要',
+'versionrequiredtext' => 'このページの使用にはMediaWiki バージョン $1 が必要です。
+[[Special:Version|バージョン情報]]をご覧ください。',
 
 'ok' => 'OK',
-'retrievedfrom' => 'ã\80\8c$1ã\80\8dã\82\88ã\82\8a取得',
-'youhavenewmessages' => '$1が届いています。($2)',
+'retrievedfrom' => 'ã\80\8c$1ã\80\8dã\81\8bã\82\89取得',
+'youhavenewmessages' => '$1が届いています($2)。',
 'newmessageslink' => '新しいメッセージ',
 'newmessagesdifflink' => '最終更新の差分',
-'youhavenewmessagesmulti' => '$1に新しい伝言が届いています',
+'youhavenewmessagesmulti' => '$1に新着メッセージがあります',
 'editsection' => '編集',
 'editold' => '編集',
-'viewsourceold' => 'ソースを表示',
+'viewsourceold' => 'ソースを閲覧',
 'editlink' => '編集',
-'viewsourcelink' => 'ソースを表示',
+'viewsourcelink' => 'ソースを閲覧',
 'editsectionhint' => '節を編集: $1',
 'toc' => '目次',
 'showtoc' => '表示',
@@ -639,7 +641,7 @@ $1',
 'collapsible-collapse' => '折り畳む',
 'collapsible-expand' => '展開する',
 'thisisdeleted' => '$1を閲覧または復帰しますか?',
-'viewdeleted' => '$1を表示しますか?',
+'viewdeleted' => '$1を閲覧しますか?',
 'restorelink' => '削除された$1編集',
 'feedlinks' => 'フィード:',
 'feed-invalid' => 'フィード形式の指定が間違っています。',
@@ -666,9 +668,9 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'そのような操作はありません',
-'nosuchactiontext' => 'このURLで指定された操作は無効です
-URLを間違って打ったか、正しくないリンクを辿った可能性があります。
-また、{{SITENAME}}が利用するソフトウェアのバグである可能性もあります。',
+'nosuchactiontext' => 'この URL で指定された操作は正しくありません
+URL を間違って入力したか、正しくないリンクをたどった可能性があります。
+{{SITENAME}}が利用するソフトウェアのバグの可能性もあります。',
 'nosuchspecialpage' => 'そのような特別ページはありません',
 'nospecialpagetext' => '<strong>要求された特別ページは存在しません。</strong>
 
@@ -676,25 +678,25 @@ URLを間違って打ったか、正しくないリンクを辿った可能性
 
 # General errors
 'error' => 'エラー',
-'databaseerror' => 'データベースエラー',
+'databaseerror' => 'データベース エラー',
 'dberrortext' => 'データベースクエリの構文エラーが発生しました。
 ソフトウェアにバグがある可能性があります。
 最後に実行を試みたクエリは次の通りです:
 関数「<tt>$2</tt>」内
 <blockquote><tt>$1</tt></blockquote>。
\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®返したエラー「<tt>$3:$4</tt>」',
-'dberrortextcl' => 'データベースクエリの構文エラーが発生しました。
-最後に実行を試みたクエリは次の通りです:
-関数 "$2" 内
\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81\8c返したエラー「<tt>$3:$4</tt>」',
+'dberrortextcl' => 'データベース クエリの構文エラーが発生しました。
+最後に実行を試みたクエリは以下の通りです:
+関数「$2」内から
 "$1"
\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®è¿\94ã\81\97ã\81\9fã\82¨ã\83©ã\83¼ "$3: $4"',
\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81\8cè¿\94ã\81\97ã\81\9fã\82¨ã\83©ã\83¼ã\80\8c$3ï¼\9a$4ã\80\8d',
 'laggedslavemode' => "'''警告:'''ページに最新の編集が反映されていない可能性があります。",
 'readonly' => 'データベースがロックされています',
 'enterlockreason' => 'ロックの理由とロック解除の予定を入力してください',
 'readonlytext' => 'データベースは現在、新しいページの追加や編集を受け付けない「ロック状態」になっています。これはおそらくデータベースの定期メンテナンスのためで、メンテナンス終了後は正常な状態に復帰します。
 
 データベースをロックした管理者による説明は以下の通りです:$1',
-'missing-article' => 'ã\80\8c$1ã\80\8d$2ã\81¨ã\81\84ã\81\86ã\83\9aã\83¼ã\82¸ã\81®æ\9c¬æ\96\87ã\82\92ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ä¸\8aã\81«è¦\8bã\81¤ã\81\91ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dませんでした。
+'missing-article' => 'ã\83\9aã\83¼ã\82¸ã\80\8c$1ã\80\8d$2ã\81®æ\9c¬æ\96\87ã\81\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\86\85ã\81§è¦\8bã\81¤ã\81\8bã\82\8aませんでした。
 
 ページの削除された版への古い差分表示や固定リンクをたどった時にこのようなことになります。
 
@@ -716,17 +718,17 @@ URLを間違って打ったか、正しくないリンクを辿った可能性
 'unexpected' => '予期しない値「$1」=「$2」です。',
 'formerror' => 'エラー:フォームを送信できませんでした',
 'badarticleerror' => 'このページでは要求された操作を行えません。',
-'cannotdelete' => '指定されたページあるいはファイル「$1」を削除できませんでした。
-すでに他の人によって削除された可能性があります。',
+'cannotdelete' => 'ページまたはファイル「$1」を削除できませんでした。
+他の人が既に削除した可能性があります。',
 'cannotdelete-title' => '「$1」というページを削除できません',
 'badtitle' => '不正なページ名',
-'badtitletext' => '要求されたページ名は、無効、空、または正しくない言語間リンク・ウィキ間リンクのページ名です。
-ページ名に用できない文字が1つ以上含まれている可能性があります。',
-'perfcached' => '以ä¸\8bã\81®ã\83\87ã\83¼ã\82¿ã\81¯ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cã\81¦ã\81\8aã\82\8aã\80\81æ\9c\80æ\96°ã\81®ç\8a¶æ\85\8bã\81§ã\81ªã\81\84å\8f¯è\83½æ\80§ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82æ\9c\80大$1件ã\81¾ã\81§ã\81®çµ\90æ\9e\9cã\81\8cã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81§å\88©ç\94¨å\8f¯è\83½ã\81«ã\81ªã\81£ã\81¦ã\81\84ます。',
-'perfcachedts' => '以下のデータはキャッシュされており、最後に更新された日時は$1です。最大$4件までの結果がキャッシュで利用可能になっています。',
+'badtitletext' => '要求されたページ名は、無効、空、正しくない言語間リンク/ウィキ間リンクのページ名、のいずれかです。
+ページ名に使用できない文字が1つ以上含まれている可能性があります。',
+'perfcached' => '以ä¸\8bã\81®ã\83\87ã\83¼ã\82¿ã\81¯ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cã\81¦ã\81\8aã\82\8aã\80\81æ\9c\80æ\96°ã\81§ã\81¯ã\81ªã\81\84å\8f¯è\83½æ\80§ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82æ\9c\80大 $1 {{PLURAL:$1|件ã\81®çµ\90æ\9e\9c}}ã\81\8cã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cます。',
+'perfcachedts' => '以下のデータはキャッシュされており、最終更新日時は $1 です。最大 $4 {{PLURAL:$4|件の結果}}がキャッシュされます。',
 'querypage-no-updates' => 'ページの更新は無効になっています。
 以下のデータの更新は現在行われていません。',
-'wrong_wfQuery_params' => 'wfQuery()ã\81¸èª¤ã\81£ã\81\9få¼\95æ\95°が渡されました。<br />
+'wrong_wfQuery_params' => 'wfQuery()ã\81«èª¤ã\81£ã\81\9fã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\83¼が渡されました。<br />
 関数:$1<br />
 クエリ:$2',
 'viewsource' => 'ソースを表示',
@@ -735,21 +737,24 @@ URLを間違って打ったか、正しくないリンクを辿った可能性
 'actionthrottledtext' => '短時間にこの操作を大量に行ったため、スパム対策として設定されている制限を超えました。
 少し時間をおいてからもう一度操作してください。',
 'protectedpagetext' => 'このページは編集できないように保護されています。',
-'viewsourcetext' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ã\82½ã\83¼ã\82¹ã\82\92é\96²è¦§ã\81\97ã\80\81ã\82³ã\83\94ã\83¼ã\81\99ã\82\8bã\81\93ã\81¨ができます:',
-'viewyourtext' => "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«å¯¾ã\81\99ã\82\8b'''ã\81\82ã\81ªã\81\9fã\81®ç·¨é\9b\86'''ã\81®ã\82½ã\83¼ã\82¹ã\82\92é\96²è¦§ã\81\97ã\80\81ã\82³ã\83\94ã\83¼ã\81\99ã\82\8bã\81\93ã\81¨ができます:",
-'protectedinterface' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼スに使用されるテキストが保存されており、いたずらなどの防止のために保護されています。',
-'editinginterface' => "'''è­¦å\91\8aï¼\9a'''ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼ã\82¹ã\81«ä½¿ç\94¨ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\86ã\82­ã\82¹ã\83\88を編集しています。
-このページの変更はすべての利用者のユーザーインタフェースに影響します。
-翻訳ã\82\92ã\81\99ã\82\8bå ´å\90\88ã\80\81MediaWikiã\81®å\9c°å\9f\9få\8c\96ã\83\97ã\83­ã\82¸ã\82§ã\82¯ã\83\88[//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net]ã\81®å\88©用を検討してください。",
+'viewsourcetext' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ã\82½ã\83¼ã\82¹ã\81®é\96²è¦§ã\82\84ã\82³ã\83\94ã\83¼ができます:',
+'viewyourtext' => "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¸ã\81®'''ã\81\82ã\81ªã\81\9fã\81®ç·¨é\9b\86'''ã\81®ã\82½ã\83¼ã\82¹ã\81®é\96²è¦§ã\82\84ã\82³ã\83\94ã\83¼ができます:",
+'protectedinterface' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤スに使用されるテキストが保存されており、いたずらなどの防止のために保護されています。',
+'editinginterface' => "'''è­¦å\91\8aï¼\9a'''ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤ã\82¹ã\81®æ\96\87ç« ã\81¨ã\81\97ã\81¦ä½¿ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸を編集しています。
+このページの変更は他の利用者のユーザー インターフェイスの外観に影響します。
+翻訳ã\81\99ã\82\8bå ´å\90\88ã\80\81MediaWiki ã\81®ã\83­ã\83¼ã\82«ã\83©ã\82¤ã\82º ã\83\97ã\83­ã\82¸ã\82§ã\82¯ã\83\88 [//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] ã\81®ä½¿用を検討してください。",
 'sqlhidden' => '(SQLクエリ非表示)',
-'cascadeprotected' => 'このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ}}で読み込まれているため、編集できないように保護されています。
+'cascadeprotected' => 'このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}で読み込まれているため、編集できないように保護されています:
 $2',
 'namespaceprotected' => "'''$1'''名前空間にあるページを編集する権限がありません。",
-'customcssprotected' => 'このCSSページはほかのユーザーの個人設定が含まれているため、編集することができません。',
+'customcssprotected' => 'このCSSページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。',
 'customjsprotected' => '他の利用者の個人設定を含むため、このJavaScriptのページを編集する権限がありません。',
 'ns-specialprotected' => '特別ページは編集できません。',
 'titleprotected' => "[[User:$1|$1]]によりこのページ名を持つページの作成は保護されています。
 理由は「''$2''」です。",
+'filereadonlyerror' => 'ファイルリポジトリ「$2」が読み取り専用の状態にあるため、ファイル「$1」を変更できません。
+
+読み取り専用に設定した管理者からの説明:「$3」',
 
 # Virus scanner
 'virus-badscanner' => "環境設定が不適合です:不明なウイルス検知ソフトウェア:''$1''",
@@ -759,15 +764,15 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ログアウトしました。'''
 
\81\93ã\81®ã\81¾ã\81¾å\8c¿å\90\8dã\81§{{SITENAME}}ã\82\92使ã\81\84ç¶\9aã\81\91ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82å\90\8cã\81\98ã\81\82ã\82\8bã\81\84ã\81¯å\88¥ã\81®å\88©ç\94¨è\80\85ã\81¨ã\81\97ã\81¦[[Special:UserLogin|ã\82\82ã\81\86ä¸\80度ã\83­ã\82°ã\82¤ã\83³ã\81\99ã\82\8b]]こともできます。
-なお、ページによっては、ブラウザのキャッシュをクリアするまで、ログインしているかのように表示され続けることがあるので注意してください。",
-'welcomecreation' => '== ようこそ、$1さん! ==
\81\93ã\81®ã\81¾ã\81¾å\8c¿å\90\8dã\81§{{SITENAME}}ã\81®ä½¿ç\94¨ã\82\92ç¶\9aè¡\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82å\90\8cã\81\98ã\81¾ã\81\9fã\81¯å\88¥ã\81®å\88©ç\94¨è\80\85ã\81¨ã\81\97ã\81¦[[Special:UserLogin|ã\82\82ã\81\86ä¸\80度ã\83­ã\82°ã\82¤ã\83³]]ã\81\99ã\82\8bこともできます。
+なお、ページによっては、ブラウザのキャッシュをクリアするまで、ログインしているかのように表示され続ける場合があるためご注意ください。",
+'welcomecreation' => '== ようこそ、$1 さん! ==
 アカウントが作成されました。
 [[Special:Preferences|{{SITENAME}}の個人設定]]の変更も忘れないようにしてください。',
 'yourname' => '利用者名:',
 'yourpassword' => 'パスワード:',
 'yourpasswordagain' => 'パスワード再入力:',
-'remembermypassword' => 'このブラウザーにログイン情報を保存する (最長$1日間)',
+'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
 'securelogin-stick-https' => 'ログイン後にHTTPS接続を維持',
 'yourdomainname' => 'ドメイン:',
 'externaldberror' => '外部の認証データベースでエラーが発生したか、または外部アカウント情報の更新が許可されていません。',
@@ -788,8 +793,8 @@ $2',
 'createaccountmail' => 'メールで送信',
 'createaccountreason' => '理由:',
 'badretype' => '入力したパスワードが一致しません。',
-'userexists' => '入力された利用者名はすでに使用されています。
-ほかの名前を選んでください。',
+'userexists' => '入力された利用者名はに使用されています。
+の名前を選んでください。',
 'loginerror' => 'ログインのエラー',
 'createaccounterror' => 'アカウントを作成できませんでした: $1',
 'nocookiesnew' => '利用者アカウントが作成されましたが、ログインしていません。
@@ -800,126 +805,129 @@ $2',
 クッキーが無効になっているようです。
 クッキーを有効にして、もう一度試してください。',
 'nocookiesfornew' => '発信元を確認できなかったため、アカウントは作成されませんでした。
\82¯ã\83\83ã\82­ã\83¼ã\81\8cæ\9c\89å\8a¹ã\81«ã\81ªã\81£ã\81¦ã\81\84ã\82\8bã\81\93ã\81¨ã\82\92確èª\8dã\81®ä¸\8aã\80\81ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ã\83ªã\83­ã\83¼ã\83\89ã\81\97ã\81¦ã\82\82ã\81\86ä¸\80度è¡\8cã\81£てください。',
\82¯ã\83\83ã\82­ã\83¼ã\81\8cæ\9c\89å\8a¹ã\81«ã\81ªã\81£ã\81¦ã\81\84ã\82\8bã\81\93ã\81¨ã\82\92確èª\8dã\81\97ã\81¦ã\80\81ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92å\86\8d読込ã\81\97ã\81¦ã\82\82ã\81\86ä¸\80度試ã\81\97てください。',
 'noname' => '利用者名を正しく指定していません。',
 'loginsuccesstitle' => 'ログイン成功',
 'loginsuccess' => "'''{{SITENAME}}に「$1」としてログインしました。'''",
 'nosuchuser' => '「$1」という名前の利用者は見当たりません。
 利用者名では大文字と小文字を区別します。
-綴りが正しいことを確認するか、[[Special:UserLogin/signup|新たにアカウントを作成してください]]。',
+綴りが正しいことを確認するか、[[Special:UserLogin/signup|新たにアカウントを作成]]してください。',
 'nosuchusershort' => '「$1」という利用者は見当たりません。
 綴りが正しいことを再度確認してください。',
 'nouserspecified' => '利用者名を指定してください。',
 'login-userblocked' => 'この利用者はブロックされています。ログインは拒否されます。',
 'wrongpassword' => 'パスワードが間違っています。 
 もう一度やり直してください。',
-'wrongpasswordempty' => 'パスワードを空にすることはできません。
+'wrongpasswordempty' => 'パスワードを空欄にはできません。
 もう一度やり直してください。',
-'passwordtooshort' => 'パスワードは{{PLURAL:$1|$1文字}}以上でなければなりません。',
+'passwordtooshort' => 'パスワードは {{PLURAL:$1|$1 文字}}以上にしてください。',
 'password-name-match' => 'パスワードは利用者名と同じであってはいけません。',
-'password-login-forbidden' => 'このã\82\88ã\81\86ã\81ªå\88©ç\94¨è\80\85å\90\8dã\81¨ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92使ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ç¦\81æ­¢ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82',
-'mailmypassword' => '新しいパスワードを電子メールで送る',
+'password-login-forbidden' => 'このå\88©ç\94¨è\80\85å\90\8dã\81¨ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®ä½¿ç\94¨ã\81¯ç¦\81æ­¢ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82',
+'mailmypassword' => '新しいパスワードをメールで送信',
 'passwordremindertitle' => '{{SITENAME}}の仮パスワード通知',
-'passwordremindertext' => '誰かã\81\8cï¼\88ã\81\8aã\81\9dã\82\89ã\81\8fã\81\94è\87ªèº«ã\81\8cã\80\81IPã\82¢ã\83\89ã\83¬ã\82¹$1ã\81\8bã\82\89ï¼\89{{SITENAME}}ï¼\88$4ï¼\89ã\81®ã\83­ã\82°ã\82¤ã\83³ç\94¨ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®å\86\8dç\99ºè¡\8cã\82\92ç\94³è«\8bã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
-ã\80\8c$2ã\80\8dã\81®ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81\8cã\80\8c$3ã\80\8dã\81«è¨­å®\9aã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82
\82\82ã\81\97ã\81\94è\87ªèº«ã\81§ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®ç\99ºè¡\8cã\82\92ç\94³è«\8bしたのであれば、ログインして新しいパスワードを決めてください。
-この仮パスワードは{{PLURAL:$5|$5日間}}で有効期限が切れます。
+'passwordremindertext' => '誰かï¼\88ã\81\8aã\81\9dã\82\89ã\81\8fã\81\82ã\81ªã\81\9fï¼\89ã\81\8cIPã\82¢ã\83\89ã\83¬ã\82¹$1ã\81\8bã\82\89{{SITENAME}}ï¼\88$4ï¼\89ã\81®ã\83­ã\82°ã\82¤ã\83³ç\94¨ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®å\86\8dç\99ºè¡\8cã\82\92ç\94³è«\8bã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
+å\88©ç\94¨è\80\85ã\80\8c$2ã\80\8dã\81®ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81\8cä½\9cæ\88\90ã\81\95ã\82\8cã\80\8c$3ã\80\8dã\81«è¨­å®\9aã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82
\82\82ã\81\97ã\81\82ã\81ªã\81\9fã\81\8cã\81\93ã\81®ç\94³è«\8bã\82\92したのであれば、ログインして新しいパスワードを決めてください。
+この仮パスワードは {{PLURAL:$5|$5 日間}}で有効期限が切れます。
 
-この依頼をしたのが他人である場合、あるいはログイン用パスワードを思い出してパスワード変更の必要がなくなった場合は、このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
+この申請をしたのが他人の場合、あるいはパスワードを思い出してパスワード変更が不要になった場合は、
+このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
 'noemail' => '利用者「$1」のメールアドレスは登録されていません。',
-'noemailcreate' => '有効な電子メールアドレスを入力する必要があります。',
+'noemailcreate' => '有効なメール アドレスを入力する必要があります',
 'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスに送信しました。
 メールを受け取ったら、再度ログインしてください。',
 'blocked-mailpassword' => '使用しているIPアドレスからの編集はブロックされており、不正利用防止のため、パスワードの再発行機能は使用できません。',
 'eauthentsent' => '指定されたメールアドレスにアドレス確認のためのメールを送信しました。
-その他のメールがこのアカウント宛に送信される前に、メールの指示に従って、このアカウントが本当に自身のものであるか確認してください。',
-'throttled-mailpassword' => '新しいパスワードは{{PLURAL:$1|$1時間}}以内に送信済みです。
\82ªç\94¨é\98²æ­¢ã\81®ã\81\9fã\82\81ã\80\81ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81¯{{PLURAL:$1|$1æ\99\82é\96\93}}é\96\93é\9a\94ã\81§ã\81®ã\81¿å\86\8dç\99ºè¡\8cå\8f¯è\83½です。',
+その他のメールがこのアカウント宛に送信される前に、メールの指示に従って、このアカウントが本当にあなたのものか確認してください。',
+'throttled-mailpassword' => '新しいパスワードは過去 {{PLURAL:$1|$1 時間}}に送信済みです。
\82ªç\94¨é\98²æ­¢ã\81®ã\81\9fã\82\81ã\80\81ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®å\86\8dç\99ºè¡\8cã\81¯ {{PLURAL:$1|$1 æ\99\82é\96\93}}ã\81« 1 å\9b\9eã\81®ã\81¿です。',
 'mailerror' => 'メールの送信中にエラーが発生しました:$1',
-'acct_creation_throttle_hit' => '同じIPアドレスでこのウィキへ訪れた人が、直前24時間で{{PLURAL:$1|$1個}}のアカウントを作成しており、これはこの期間中に作成が許可されている最大数です。
-そのため、現在このIPアドレスの利用者はアカウントをこれ以上作成できません。',
+'acct_creation_throttle_hit' => 'あなたと同じ IP アドレスでこのウィキに訪れた人が、最近 24 時間で {{PLURAL:$1|$1 アカウント}}を作成しており、これはこの期間で作成が許可されている最大数です。
+そのため、現在この IP アドレスではアカウントをこれ以上作成できません。',
 'emailauthenticated' => 'メールアドレスは$2 $3に認証されています。',
 'emailnotauthenticated' => 'メールアドレスが認証されていません。
-確認されるまで以下のいかなるメールも送られません。',
+認証されるまで、以下のいかなる機能でもメールは送信されません。',
 'noemailprefs' => 'これらの機能を有効にするためには個人設定でメールアドレスを登録する必要があります。',
-'emailconfirmlink' => 'ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92確èª\8dã\81\99ã\82\8b',
+'emailconfirmlink' => 'ã\81\82ã\81ªã\81\9fã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92確èª\8d',
 'invalidemailaddress' => '入力されたメールアドレスが正しい形式に従っていないため、受け付けられません。
 正しい形式で入力し直すか、メールアドレス欄を空にしておいてください。',
-'cannotchangeemail' => 'このウィキでは、アカウントの電子メールアドレスを変更できません。',
+'cannotchangeemail' => 'このウィキではアカウントのメールアドレスを変更できません。',
+'emaildisabled' => 'このサイトではメールを送信できません。',
 'accountcreated' => 'アカウントを作成しました',
-'accountcreatedtext' => '利用者アカウント:$1が作成されました。',
+'accountcreatedtext' => '利用者アカウント「$1」を作成しました。',
 'createaccount-title' => '{{SITENAME}}のアカウント作成',
-'createaccount-text' => '{{SITENAME}} ($4) に「$2」という名前のアカウントが、この電子メールアドレスを連絡先として作成されました。パスワードは「$3」です。
-今すぐログインし、パスワードを変更してください。
+'createaccount-text' => '誰か(おそらくあなた)が、{{SITENAME}} ($4) にあなたのメール アドレスのアカウントを作成しました。
+アカウント名「$2」、パスワード「$3」です。
+今すぐログインしてパスワードを変更してください。
 
-何かの手違いでアカウントが作成されたと思う場合、このメッセージは無視してください。',
+このアカウントが何かの手違いで作成された場合は、このメッセージを無視してください。',
 'usernamehasherror' => '利用者名には番号記号を含むことができません',
 'login-throttled' => 'ログインの失敗が制限回数を超えました。
 しばらく時間をおいてから再度お試しください。',
-'login-abort-generic' => 'ログインに失敗しました。− 中止',
+'login-abort-generic' => 'ログインに失敗しました - 中止',
 'loginlanguagelabel' => '言語: $1',
-'suspicious-userlogout' => 'å£\8aã\82\8cã\81\9fã\83\96ã\83©ã\82¦ã\82¶ã\82\82ã\81\97ã\81\8fã\81¯ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\83»ã\83\97ã\83­ã\82­ã\82·ã\81«ã\82\88ã\81£ã\81¦é\80\81ä¿¡ã\81\95ã\82\8cã\81\9få\8f¯è\83½æ\80§ã\81\8cã\81\82ã\82\8bã\81\9fã\82\81ã\80\81ã\83­ã\82°ã\82¢ã\82¦ã\83\88è¦\81æ±\82ã\81¯æ\8b\92å\90¦ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82',
+'suspicious-userlogout' => '壊れたブラウザもしくはキャッシュプロキシによって送信された可能性があるため、ログアウト要求は拒否されました。',
 
 # E-mail sending
 'php-mail-error-unknown' => 'PHPのmail()関数で不明なエラー',
-'user-mail-no-addy' => '電子メールアドレスなしで、電子メールを送信しようとしました。',
+'user-mail-no-addy' => 'メール アドレスなしでメールを送信しようとしました。',
 
 # Change password dialog
 'resetpass' => 'パスワードの変更',
-'resetpass_announce' => '電子メールで送信された仮パスワードでログインしています
\83­ã\82°ã\82¤ã\83³ã\82\92å®\8cäº\86ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81\93ã\81§æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92設å®\9aã\81\97ã\81ªã\81\8aã\81\99必要があります:',
+'resetpass_announce' => 'メールでお送りした仮パスワードでログインしました
\83­ã\82°ã\82¤ã\83³ã\82\92å®\8cäº\86ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81\93ã\81§æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92設å®\9aã\81\99ã\82\8b必要があります:',
 'resetpass_text' => '<!-- ここに文を挿入 -->',
 'resetpass_header' => 'アカウントのパスワードを変更',
 'oldpassword' => '古いパスワード:',
 'newpassword' => '新しいパスワード:',
 'retypenew' => '新しいパスワードを再入力:',
 'resetpass_submit' => '再設定してログイン',
-'resetpass_success' => 'パスワードの変更に成功しました
-ログインしています',
+'resetpass_success' => 'パスワードの変更に成功しました!
+ログインしています...',
 'resetpass_forbidden' => 'パスワードは変更できません',
 'resetpass-no-info' => 'このページに直接アクセスするためにはログインしている必要があります。',
 'resetpass-submit-loggedin' => 'パスワードを変更',
 'resetpass-submit-cancel' => '中止',
-'resetpass-wrong-oldpass' => '仮パスワードまたは現在のパスワードが無効です
-すでにパスワード変更を行っているか、新しい仮パスワードの発行を依頼している可能性があります。',
+'resetpass-wrong-oldpass' => '仮パスワードまたは現在のパスワードが正しくありません
+既にパスワード変更したか、新しい仮パスワードを依頼した可能性があります。',
 'resetpass-temp-password' => '仮パスワード:',
 
 # Special:PasswordReset
 'passwordreset' => 'パスワードの再設定',
-'passwordreset-text' => 'ã\81\93ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81«å\9b\9eç­\94ã\81\99ã\82\8bã\81¨ã\80\81ã\81\94è\87ªèº«ã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°ã\81\8cé\9b»å­\90ã\83¡ã\83¼ã\83«ã\81§é\80\9aç\9f¥ã\81\95ã\82\8cます。',
+'passwordreset-text' => 'ã\81\93ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81«å\85¥å\8a\9bã\81\99ã\82\8bã\81¨ã\80\81ã\82¢ã\82«ã\82¦ã\83³ã\83\88詳細ã\81®ã\83ªã\83\9eã\82¤ã\83³ã\83\80ã\83¼ã\82\92ã\83¡ã\83¼ã\83«ã\81§ã\81\8aé\80\81ã\82\8aã\81\97ます。',
 'passwordreset-legend' => 'パスワードの再設定',
 'passwordreset-disabled' => 'パスワードの再設定は、このウィキでは無効になっています。',
-'passwordreset-pretext' => '{{PLURAL:$1||以下のデータのうちのひとつを入力してください。}}',
+'passwordreset-pretext' => '{{PLURAL:$1||以下のデータのうちの 1 つを入力してください}}',
 'passwordreset-username' => '利用者名:',
-'passwordreset-domain' => 'ドメイン:',
-'passwordreset-capture' => '送られるメールの内容を見ますか?',
-'passwordreset-capture-help' => 'ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92ã\83\81ã\82§ã\83\83ã\82¯ã\81\99ã\82\8bã\81¨ã\80\81å\88©ç\94¨è\80\85ã\81«é\80\81ã\82\89れるメールの内容(一時的なパスワードを含む)をあなたも見ることができます。',
-'passwordreset-email' => '電子メールアドレス:',
+'passwordreset-domain' => 'ドメイン',
+'passwordreset-capture' => '送信されるメールの内容を表示しますか?',
+'passwordreset-capture-help' => 'ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cã\82\8bã\81¨ã\80\81å\88©ç\94¨è\80\85ã\81«é\80\81ä¿¡ã\81\95れるメールの内容(一時的なパスワードを含む)をあなたも見ることができます。',
+'passwordreset-email' => 'メールアドレス:',
 'passwordreset-emailtitle' => '{{SITENAME}}上のアカウントの詳細',
-'passwordreset-emailtext-ip' => 'どなたかが(おそらくあなた、IP アドレス $1 )あなたの {{SITENAME}} ($4)
\81«ã\81\8aã\81\91ã\82\8bã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°æ\83\85å ±ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ç\94³è«\8bã\81\95ã\82\8cました。
¸\8bè¨\98ã\81®å\88©ç\94¨è\80\85{{PLURAL:$3|ã\82¢ã\82«ã\82¦ã\83³ã\83\88}}がこのメールアドレスと紐付けられています。
+'passwordreset-emailtext-ip' => 'どなたか(おそらくあなた、IP アドレス $1)が {{SITENAME}} ($4) での
\81\82ã\81ªã\81\9fã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°æ\83\85å ±ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ç\94³è«\8bã\81\97ました。
»¥ä¸\8bã\81®å\88©ç\94¨è\80\85{{PLURAL:$3|ã\82¢ã\82«ã\82¦ã\83³ã\83\88\82¢ã\82«ã\82¦ã\83³ã\83\88群}}がこのメールアドレスと紐付けられています。
 
 $2
 
-{{PLURAL:$3|この一時的なパスワード}}は{{PLURAL:$5|$5日}}で有効期限が切れます。
\81\82ã\81ªã\81\9fã\81¯ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\80\81æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ã\81\99ã\81\90ã\81«é\81¸ã\81必要があります。
\81\93ã\81®ç\94³è«\8bã\81\8cä»\96ã\81®ã\81 ã\82\8cã\81\8bã\81«ã\82\88ã\82\8bã\82\82ã\81®ã\81§ã\81\82ã\82\8bã\81\8bã\80\81ã\81\82ã\82\8bã\81\84ã\81¯ã\81\82ã\81ªã\81\9fã\81\8cè\87ªèº«ã\81®å\85\83ã\80\85のパスワードを
-è¦\9aã\81\88ã\81¦ã\81\8aã\82\8aã\80\81å¤\89ã\81\88ã\81\9fã\81\8fã\81ªã\81\84å ´å\90\88ã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92ç\84¡è¦\96ã\81\97ã\81¦
»¥å\89\8dã\81®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92使ã\81\84続けることができます。',
+{{PLURAL:$3|この|これらの}}一時的なパスワードは {{PLURAL:$5|$5 日間}}で有効期限が切れます。
\81\82ã\81ªã\81\9fã\81¯ã\81\99ã\81\90ã\81«ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81¦æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92å¤\89æ\9b´ã\81\99ã\82\8b必要があります。
\81\93ã\82\8cã\81\8cä»\96ã\81®èª°ã\81\8bã\81«ã\82\88ã\82\8bç\94³è«\8bã\81§ã\81\82ã\82\8bå ´å\90\88ã\80\81ã\81\82ã\82\8bã\81\84ã\81¯ã\81\82ã\81ªã\81\9fã\81\8cè\87ªèº«ã\81®å\85\83のパスワードを
+è¦\9aã\81\88ã\81¦ã\81\84ã\81¦ã\81\9dã\82\8cã\82\92å¤\89æ\9b´ã\81\97ã\81\9fã\81\8fã\81ªã\81\84å ´å\90\88ã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92ç\84¡è¦\96ã\81\97ã\81¦ä»¥å\89\8dã\81®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92
½¿ç\94¨ã\81\97続けることができます。',
 'passwordreset-emailtext-user' => '{{SITENAME}} の利用者 $1 があなたの {{SITENAME}} ($4)
\81«ã\81\8aã\81\91ã\82\8bã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°æ\83\85å ±ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ç\94³è«\8bã\81\95ã\82\8cました。
\81«ã\81\8aã\81\91ã\82\8bã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°æ\83\85å ±ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ç\94³è«\8bã\81\97ました。
 下記の利用者{{PLURAL:$3|アカウント}}がこのメールアドレスと紐付けられています。
 
 $2
 
-{{PLURAL:$3|この一時的なパスワード}}は{{PLURAL:$5|$5日}}で有効期限が切れます。
\81\82ã\81ªã\81\9fã\81¯ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\80\81新しいパスワードをすぐに選ぶ必要があります。
-この申請が他のだれかによるものであるか、あるいはあなたが自身の元々のパスワードを
-è¦\9aã\81\88ã\81¦ã\81\8aã\82\8aã\80\81å¤\89ã\81\88ã\81\9fã\81\8fã\81ªã\81\84å ´å\90\88ã\81«は、このメッセージを無視して
+{{PLURAL:$3|この一時的なパスワード|これらの一時的なパスワード}}は{{PLURAL:$5|$5日}}で有効期限が切れます。
\81\82ã\81ªã\81\9fã\81¯ã\80\81ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81¦新しいパスワードをすぐに選ぶ必要があります。
+この申請が他の誰かによるものの場合、あるいはあなたが自身の元のパスワードを
+è¦\9aã\81\88ã\81¦ã\81\84ã\81¦ã\80\81å¤\89æ\9b´ã\81\97ã\81\9fã\81\8fã\81ªã\81\84å ´å\90\88は、このメッセージを無視して
 以前のパスワードを使い続けることができます。',
-'passwordreset-emailelement' => '利用者名: $1
-仮パスワード: $2',
+'passwordreset-emailelement' => '利用者名:$1
+仮パスワード:$2',
 'passwordreset-emailsent' => '確認のメールが送信されました。',
 'passwordreset-emailsent-capture' => '確認のメールが送信されました。以下に表示します。',
 'passwordreset-emailerror-capture' => '生成された確認メールを以下に表示していますが、利用者への送信には失敗しました: $1',
@@ -927,7 +935,7 @@ $2
 # Special:ChangeEmail
 'changeemail' => 'メールアドレスの変更',
 'changeemail-header' => 'アカウントのメールアドレスを変更',
-'changeemail-text' => 'ã\81\93ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81¸å\85¥å\8a\9bã\81\99ã\82\8bã\81\93ã\81¨ã\81§ã\80\81ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81®å¤\89æ\9b´ã\82\92å®\8cäº\86ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\81¯ã\80\81パスワードを入力する必要があります。',
+'changeemail-text' => 'ã\81\93ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81§ã\81¯ã\83¡ã\83¼ã\83« ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92å¤\89æ\9b´ã\81§ã\81\8dã\81¾ã\81\99ã\80\82ã\81\93ã\81®å¤\89æ\9b´ã\82\92確èª\8dã\81\99ã\82\8bã\81\9fã\82\81ã\81«パスワードを入力する必要があります。',
 'changeemail-no-info' => 'このページに直接アクセスするためにはログインしている必要があります。',
 'changeemail-oldemail' => '現在のメールアドレス:',
 'changeemail-newemail' => '新しいメールアドレス:',
@@ -957,9 +965,9 @@ $2
 
 # Edit pages
 'summary' => '編集内容の要約:',
-'subject' => '題名見出し:',
+'subject' => '題名/見出し:',
 'minoredit' => 'これは細部の編集です',
-'watchthis' => 'このページをウォッチする',
+'watchthis' => 'このページをウォッチ',
 'savearticle' => 'ページを保存',
 'preview' => 'プレビュー',
 'showpreview' => 'プレビューを表示',
@@ -971,10 +979,10 @@ $2
 'missingsummary' => "'''注意:'''要約欄が空欄です。
 「{{int:savearticle}}」をもう一度クリックすると、編集は要約なしで保存されます。",
 'missingcommenttext' => '以下にコメントを入力してください。',
-'missingcommentheader' => "'''注意::'' このコメントに対する題名見出しが空欄です。
+'missingcommentheader' => "'''注意::'' このコメントに対する題名/見出しが空欄です。
 「{{int:savearticle}}」ボタンをもう一度押すと、空のまま編集が保存されます。",
 'summary-preview' => '要約のプレビュー:',
-'subject-preview' => '題名見出しのプレビュー:',
+'subject-preview' => '題名/見出しのプレビュー:',
 'blockedtitle' => '利用者はブロックされています',
 'blockedtext' => "'''この利用者名またはIPアドレスはブロックされています。'''
 
@@ -1021,18 +1029,18 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこの件につ
 'newarticle' => '(新)',
 'newarticletext' => "まだ存在していないページへのリンクをたどりました。
 このページを新規に作成するには、下のボックスに内容を書き込んでください(詳しくは[[{{MediaWiki:Helppage}}|ヘルプページ]]を参照してください)。
-誤ã\81£ã\81¦ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81\9fã\81©ã\82\8aç\9d\80ã\81\84ã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81ã\83\96ã\83©ã\82¦ã\82¶ã\81®'''æ\88»ã\82\8b'''ã\83\9cã\82¿ã\83³ã\82\92使ã\81£ã\81¦前のページに戻ってください。",
+誤ã\81£ã\81¦ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81\9fã\81©ã\82\8aç\9d\80ã\81\84ã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81ã\83\96ã\83©ã\82¦ã\82¶ã\81®'''æ\88»ã\82\8b'''ã\83\9cã\82¿ã\83³ã\81§前のページに戻ってください。",
 'anontalkpagetext' => "----''このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。
-匿名利用者を識別するために、利用者名のわりにIPアドレスが使用されています。
-IPアドレスは複数の利用者の間で共有されていることがあります。
-もし、自身が匿名利用者であり、自分に関係のないコメントが寄せられている考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。''",
+匿名利用者を識別するために、利用者名のわりにIPアドレスが使用されています。
+IP アドレスは複数の利用者で共有されている場合があります。
+もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられている考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。''",
 'noarticletext' => '現在このページには内容がありません。
-他のページに含まれる[[Special:Search/{{PAGENAME}}|このページ名を検索する]]か、
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連記録を検索する]か、
\82\82ã\81\97ã\81\8fã\81¯ã\80\81[{{fullurl:{{FULLPAGENAME}}|action=edit}} ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86]</span>ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cできます。',
+他のページ内で[[Special:Search/{{PAGENAME}}|このページ名を検索する]]か、
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連する記録を検索]するか、
\81\82ã\82\8bã\81\84ã\81¯ã\80\81[{{fullurl:{{FULLPAGENAME}}|action=edit}} ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86]</span>できます。',
 'noarticletext-nopermission' => '現在このページには内容がありません。他のページに含まれる[[Special:Search/{{PAGENAME}}|このページ名を検索する]]か、もしくは<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連記録を検索する]</span>ことができます。',
-'userpage-userdoesnotexist' => '「<nowiki>$1</nowiki>」という名前のアカウントは登録されていません。
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bã\81\93ã\81¨が適切かどうか確認してください。',
+'userpage-userdoesnotexist' => '「$1」という利用者アカウントは登録されていません。
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä½\9cæ\88\90/ç·¨é\9b\86が適切かどうか確認してください。',
 'userpage-userdoesnotexist-view' => '利用者アカウント「$1」は登録されていません。',
 'blocked-notice-logextract' => 'この利用者は現在ブロックされています。
 参考のために最新のブロック記録を以下に表示します。',
@@ -1053,26 +1061,28 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 'sitejspreview' => "'''ここでは、JavaScriptをプレビューしているだけに過ぎません。'''
 '''まだ保存されていません!'''",
 'userinvalidcssjstitle' => "'''警告:'''「$1」という外装はありません。
-.cssと.jsページを編集する際には、ページ名を小文字にすることを忘れないでください(例えば、{{ns:user}}:Hoge/Vector.cssではなく{{ns:user}}:Hoge/vector.cssとなります)。",
+カスタム .css/.js ページではページ名を小文字にしてください。例:{{ns:user}}:Hoge/Vector.css ではなく {{ns:user}}:Hoge/vector.css",
 'updated' => '(更新)',
 'note' => "'''お知らせ:'''",
 'previewnote' => "'''これはプレビューです。'''
-変更箇所はまだ保存されていません! [[#editform|→ 編集を続行]]",
+変更箇所はまだ保存されていません!",
+'continue-editing' => '編集を続行',
 'previewconflict' => 'このプレビューは、上の文章編集エリアの文章を保存した場合にどう見えるようになるかを示すものです。',
-'session_fail_preview' => "'''ç\94³ã\81\97訳ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ï¼\81ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81\8cå\88\87æ\96­ã\81\95ã\82\8cたため編集を処理できませんでした。'''
-もう一度やりなおしてください。
+'session_fail_preview' => "'''ç\94³ã\81\97訳ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ï¼\81ã\82»ã\83\83ã\82·ã\83§ã\83³ã\83\87ã\83¼ã\82¿ã\81\8cæ¶\88失ã\81\97たため編集を処理できませんでした。'''
+もう一度やりしてください。
 それでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直してください。",
-'session_fail_preview_html' => "'''申し訳ありません!セッションが切断されたため編集を処理することができませんでした。'''
+'session_fail_preview_html' => "'''申し訳ありません!セッション データが消失したため編集を処理できませんでした。'''
 
 ''{{SITENAME}}では生のHTMLが有効であり、JavaScriptでの攻撃を予防するためにプレビューを表示していません。''
 
-'''この編集が問題ないものであるならば、もう一度保存してください。'''
-それでもうまくいかない際には一度[[Special:UserLogout|ログアウト]]して、ログインし直してみてください。",
+'''この編集が問題ない場合はもう一度保存してください。'''
+それでもうまくいかない場合は一度[[Special:UserLogout|ログアウト]]して、ログインし直してみてください。",
 'token_suffix_mismatch' => "'''使用中のクライアントが編集トークン内の句読点を正しく処理していないため、編集を受け付けられません。'''
 ページ本文の破損を防ぐため、編集は反映されません。
-これは、問題のある匿名プロキシサービスを利用していると、起こることがあります。",
+問題のある匿名プロキシ サービスを使用していると、これが発生する場合があります。",
 'edit_form_incomplete' => "'''一部の編集フォームの値がサーバーに届きませんでした。ご確認の上、そのまま再度投稿してください。'''",
 'editing' => '「$1」を編集中',
+'creating' => '「$1」を作成中',
 'editingsection' => '「$1」を編集中 (節単位)',
 'editingcomment' => '「$1」を編集中 (新しい節)',
 'editconflict' => '編集競合:$1',
@@ -1083,35 +1093,35 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 上側のテキスト領域の内容'''だけ'''が、「{{int:savearticle}}」をクリックした時に実際に保存されます。",
 'yourtext' => '編集中の文章',
 'storedversion' => '保存された版',
-'nonunicodebrowser' => "'''警告:使用中のブラウザがUnicodeに対応していません。'''
-å®\89å\85¨ã\81«ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bå\9b\9eé\81¿ç­\96ã\81\8c表示ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ï¼\9aç·¨é\9b\86ã\83\9cã\83\83ã\82¯ã\82¹ä¸­ã\81®é\9d\9eASCIIæ\96\87å­\97ã\81¯16é\80²æ\95°æ\96\87å­\97ã\82³ã\83¼ã\83\89ã\81«ã\82\88ã\81£ã\81¦è¡¨ç\8f¾ã\81\95ã\82\8cます。",
+'nonunicodebrowser' => "'''警告:あなたのブラウザーはUnicodeに未対応です。'''
+å®\89å\85¨ã\81«ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bå\9b\9eé\81¿ç­\96ã\82\92表示ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ï¼\9aç·¨é\9b\86ã\83\9cã\83\83ã\82¯ã\82¹å\86\85ã\81®é\9d\9eASCIIæ\96\87å­\97ã\82\9216é\80²æ\95°ã\82³ã\83¼ã\83\89ã\81§è¡¨ç\8f¾ã\81\97ã\81¦ã\81\84ます。",
 'editingold' => "'''警告:このページの古い版を編集しています。'''
 保存すると、この版以降に追加されていた変更がすべて失われます。",
 'yourdiff' => '差分',
-'copyrightwarning' => "{{SITENAME}}ã\81¸ã\81®æ\8a\95稿ã\81¯ã\80\81ã\81\99ã\81¹ã\81¦$2ï¼\88詳細ã\81¯$1ã\82\92å\8f\82ç\85§ï¼\89ã\81®ã\82\82ã\81¨ã\81§å\85¬é\96\8bã\81\95ã\82\8cたと見なされることにご注意ください。
-投稿されたものが、他人によって遠慮なく編集され、自由に配布されることを望まない場合は、ここには投稿しないでください。<br />
\81¾ã\81\9fã\80\81æ\8a\95稿ã\81\95ã\82\8cã\82\8bã\82\82ã\81®ã\81¯ã\80\81è\87ªèº«ã\81«ã\82\88ã\81£ã\81¦æ\9b¸ã\81\8bã\82\8cã\81\9fã\82\82ã\81®ã\81§ã\81\82ã\82\8bã\81\8bã\80\81ã\83\91ã\83\96ã\83ªã\83\83ã\82¯ã\83»ã\83\89ã\83¡ã\82¤ã\83³ã\80\81またはそれに類するフリーな資料からの複製であることを約束してください。
+'copyrightwarning' => "{{SITENAME}}ã\81¸ã\81®æ\8a\95稿ã\81¯ã\80\81ã\81\99ã\81¹ã\81¦$2ï¼\88詳細ã\81¯$1ã\82\92å\8f\82ç\85§ï¼\89ã\81®ã\82\82ã\81¨ã\81§å\85¬é\96\8bã\81\97たと見なされることにご注意ください。
+あなたが投稿したものを、他人がよって遠慮なく編集し、それを自由に配布するのを望まない場合は、ここには投稿しないでください。<br />
\81¾ã\81\9fã\80\81æ\8a\95稿ã\81\99ã\82\8bã\81®ã\81¯ã\80\81ã\81\82ã\81ªã\81\9fã\81\8cæ\9b¸ã\81\84ã\81\9fã\82\82ã\81®ã\81\8bã\80\81ã\83\91ã\83\96ã\83ªã\83\83ã\82¯ ã\83\89ã\83¡ã\82¤ã\83³またはそれに類するフリーな資料からの複製であることを約束してください。
 '''著作権保護されている作品を、許諾なしに投稿しないでください!'''",
-'copyrightwarning2' => "{{SITENAME}}への全ての投稿は、他の利用者によって編集、変更、除去される可能性があります。
-自信の投稿が他人によって遠慮なく編集されることを望まない場合は、ここには投稿しないでください。<br />
\81¾ã\81\9fã\80\81æ\8a\95稿ã\81\95ã\82\8cã\82\8bã\82\82ã\81®ã\81¯ã\80\81è\87ªèº«ã\81«ã\82\88ã\81£ã\81¦æ\9b¸ã\81\8bã\82\8cã\81\9fã\82\82ã\81®ã\81§ã\81\82ã\82\8bã\81\8bã\80\81ã\83\91ã\83\96ã\83ªã\83\83ã\82¯ã\83»ã\83\89ã\83¡ã\82¤ã\83³ã\80\81またはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。
+'copyrightwarning2' => "{{SITENAME}}へのすべての投稿は、他の利用者が編集、変更、除去する可能性があります。
+あなたの投稿を、他人が遠慮なく編集するのを望まない場合は、ここには投稿しないでください。<br />
\81¾ã\81\9fã\80\81æ\8a\95稿ã\81\99ã\82\8bã\81®ã\81¯ã\80\81ã\81\82ã\81ªã\81\9fã\81\8cæ\9b¸ã\81\84ã\81\9fã\82\82ã\81®ã\81\8bã\80\81ã\83\91ã\83\96ã\83ªã\83\83ã\82¯ ã\83\89ã\83¡ã\82¤ã\83³またはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。
 '''著作権保護されている作品を、許諾なしに投稿してはいけません!'''",
-'longpageerror' => "'''エラー:投稿された文章は {{PLURAL:$1|1キロバイト|$1キロバイト}}の長さがあります。これは投稿できる最大の長さである{{PLURAL:$2|$2キロバイト|$2キロバイト}}を超えています。'''
+'longpageerror' => "'''エラー:投稿された文章は {{PLURAL:$1|$1 KB}} の長さがあります。これは投稿できる最大の長さ {{PLURAL:$2|$2 KB}} を超えています。'''
 この編集は保存できません。",
 'readonlywarning' => "'''警告:データベースがメンテナンスのためにロックされているため、現在は編集を保存できません。'''
 必要であれば文章をカットアンドペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。
 
 データベースをロックした管理者による説明は以下の通りです:$1",
-'protectedpagewarning' => "'''è­¦å\91\8aï¼\9aã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\8aã\82\8aã\80\81管ç\90\86è\80\85権é\99\90ã\81®ã\81\82ã\82\8bå\88©ç\94¨è\80\85ã\81\97ã\81\8bç·¨é\9b\86ã\81§ã\81\8dã\81ªã\81\84ã\82\88ã\81\86ã\81«ã\81ªã\81£ã\81¦ã\81\84ます。'''
+'protectedpagewarning' => "'''è­¦å\91\8aï¼\9aã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81管ç\90\86è\80\85権é\99\90ã\82\92æ\8c\81ã\81¤å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8cç·¨é\9b\86ã\81§ã\81\8dます。'''
 参考として以下に一番最後の記録を表示します:",
-'semiprotectedpagewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81\97ã\81\8bç·¨é\9b\86ã\81§ã\81\8dã\81¾ã\81\9bã\82\93
+'semiprotectedpagewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8cç·¨é\9b\86ã\81§ã\81\8dã\81¾ã\81\99
 参考として以下に一番最後の記録を表示します:",
-'cascadeprotectedwarning' => "'''警告:'''このページはカスケード保護されている以下の{{PLURAL:$1|ページ}}から読み込まれているため、管理者権限を持つ利用者しか編集できないように保護されています。",
+'cascadeprotectedwarning' => "'''警告:'''このページはカスケード保護されている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、管理者権限を持つ利用者しか編集できないように保護されています。",
 'titleprotectedwarning' => "'''警告:このページは保護されているため、作成には[[Special:ListGroupRights|特定の権限]]が必要です。'''
 参考として以下に一番最後の記録を表示します:",
-'templatesused' => 'このページで使れている{{PLURAL:$1|テンプレート}}:',
-'templatesusedpreview' => 'このプレビューで使れている{{PLURAL:$1|テンプレート}}:',
-'templatesusedsection' => 'この節で使れている{{PLURAL:$1|テンプレート}}:',
+'templatesused' => 'このページで使用されている{{PLURAL:$1|テンプレート}}:',
+'templatesusedpreview' => 'このプレビューで使用されている{{PLURAL:$1|テンプレート}}:',
+'templatesusedsection' => 'この節で使用されている{{PLURAL:$1|テンプレート}}:',
 'template-protected' => '(保護)',
 'template-semiprotected' => '(半保護)',
 'hiddencategories' => 'このページは$1隠しカテゴリに属しています:',
@@ -1123,15 +1133,15 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 'sectioneditnotsupported-title' => '節単位編集はサポートされていません',
 'sectioneditnotsupported-text' => 'このページでは節単位編集はサポートされません。',
 'permissionserrors' => '認証エラー',
-'permissionserrorstext' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ç·¨é\9b\86権é\99\90ã\81\8cありません。{{PLURAL:$1|理由}}は以下の通りです:',
-'permissionserrorstext-withaction' => '以下に示された{{PLURAL:$1|理由}}により、$2を行うことができません:',
-'recreate-moveddeleted-warn' => "'''警告:以前削除されたページを再作成しようとしています。'''
+'permissionserrorstext' => 'ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86権é\99\90ã\81¯ありません。{{PLURAL:$1|理由}}は以下の通りです:',
+'permissionserrorstext-withaction' => 'あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:',
+'recreate-moveddeleted-warn' => "'''警告:以前削除されたページを再作成しようとしています。'''
 
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\97ç¶\9aã\81\91ã\82\8bã\81\93ã\81¨ã\81\8cé\81©å\88\87ã\81§ã\81\82ã\82\8bかどうか確認してください。
\8f\82è\80\83ã\81¨ã\81\97ã\81¦以下にこのページの削除と移動の記録を表示します:",
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ç·¨é\9b\86ã\82\92ç¶\9aè¡\8cã\81\99ã\82\8bã\81®ã\81\8cé\81©å\88\87かどうか確認してください。
\8f\82è\80\83ã\81®ã\81\9fã\82\81以下にこのページの削除と移動の記録を表示します:",
 'moveddeleted-notice' => 'このページは削除されています。
 参考のため、このページの削除と移動の記録を以下に表示します。',
-'log-fulllog' => '完全な記録を見る',
+'log-fulllog' => '完全な記録を閲覧',
 'edit-hook-aborted' => 'フックによって編集が破棄されました。
 理由は不明です。',
 'edit-gone-missing' => 'ページを更新できませんでした。
@@ -1139,12 +1149,13 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 'edit-conflict' => '編集が競合。',
 'edit-no-change' => '文章が変更されていないため、編集は無視されました。',
 'edit-already-exists' => '新しいページを作成できませんでした。
-そのページは、すでに存在しています。',
+そのページは既に存在しています。',
+'defaultmessagetext' => '既定のメッセージ文',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => "'''警告:'''このページでの高負荷なパーサー関数の呼び出し回数が多過ぎます。
+'expensive-parserfunction-warning' => "'''警告:'''このページでの高負荷なパーサー関数の呼び出し回数が多過ぎます。
 
-呼び出しは{{PLURAL:$2|$2}}回以下である必要があります(現在は{{PLURAL:$1|$1}}回)。",
+{{PLURAL:$2|呼び出しは $2 回}}以下にしてください({{PLURAL:$1|現在は $1 回}})。",
 'expensive-parserfunction-category' => '高負荷な構文解析関数の呼び出しが多過ぎるページ',
 'post-expand-template-inclusion-warning' => "'''警告:'''テンプレートの読み込みサイズが大き過ぎます。
 いくつかのテンプレートは読み込まれません。",
@@ -1153,14 +1164,18 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 これらの値は省略されました。",
 'post-expand-template-argument-category' => '省略されたテンプレート引数を含むページ',
 'parser-template-loop-warning' => 'テンプレートのループが検出されました:[[$1]]',
-'parser-template-recursion-depth-warning' => 'テンプレートの再帰深さ($1)が上限値を超えました',
-'language-converter-depth-warning' => '言語変換機能が深度制限($1)を超えました',
+'parser-template-recursion-depth-warning' => 'テンプレートの再帰の深さ($1)が上限を超えました',
+'language-converter-depth-warning' => '言語変換機能の深さ($1)が制限を超えました',
+'node-count-exceeded-category' => 'ノード数が制限を超えたページ',
+'node-count-exceeded-warning' => 'ページがノード数の制限を超えました',
+'expansion-depth-exceeded-category' => '展開の深さ制限を超えたページ',
+'expansion-depth-exceeded-warning' => 'ページが展開の深さ制限を超えました',
 
 # "Undo" feature
-'undo-success' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92å\8f\96ã\82\8aæ¶\88ã\81\99ã\81\93ã\81¨ã\81\8cã\81§ã\81\8dます。
+'undo-success' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92å\8f\96ã\82\8aæ¶\88ã\81\9bます。
 下記の差分を確認し、本当に取り消すべきだと確認してから、変更を保存して取り消しを完了してください。',
 'undo-failure' => '中間の版での編集と競合したため、取り消せませんでした。',
-'undo-norev' => 'å\8f\96ã\82\8aæ¶\88ã\81\9dã\81\86ã\81¨ã\81\97ã\81\9fç·¨é\9b\86ã\81¯å­\98å\9c¨ã\81\97ã\81ªã\81\84ã\81\8bã\81\99ã\81§ã\81«å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\81\9fã\82\81ã\81«取り消せませんでした。',
+'undo-norev' => 'å\8f\96ã\82\8aæ¶\88ã\81\9dã\81\86ã\81¨ã\81\97ã\81\9fç·¨é\9b\86ã\81\8cå­\98å\9c¨ã\81\97ã\81ªã\81\84ã\81\8bå\89\8aé\99¤æ¸\88ã\81¿ã\81®ã\81\9fã\82\81取り消せませんでした。',
 'undo-summary' => '[[Special:Contributions/$2|$2]]([[User talk:$2|トーク]])による第$1版を取り消し',
 
 # Account creation failure
@@ -1170,7 +1185,7 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 $3が示した理由は ''$2'' です。",
 
 # History pages
-'viewpagelogs' => 'このページに関する記録を表示',
+'viewpagelogs' => 'このページに関する記録を閲覧',
 'nohistory' => 'このページには編集履歴がありません。',
 'currentrev' => '最新版',
 'currentrev-asof' => '$1時点における最新版',
@@ -1184,7 +1199,7 @@ $3が示した理由は ''$2'' です。",
 'last' => '前',
 'page_first' => '先頭',
 'page_last' => '末尾',
-'histlegend' => "差分の選択:比較したい版のラジオボタンを選択し、エンターキーを押すか、下部のボタンを押します。<br />
+'histlegend' => "差分の選択:比較したい版のラジオボタンを選択し、Enterキーを押すか、下部のボタンを押します。<br />
 凡例:'''({{int:cur}})'''=最新版との比較、'''({{int:last}})'''=直前の版との比較、'''{{int:minoreditletter}}'''=細部の編集",
 'history-fieldset-title' => '履歴の閲覧',
 'history-show-deleted' => '削除済みのみ',
@@ -1243,15 +1258,15 @@ $3が示した理由は ''$2'' です。",
 'revdelete-no-file' => '指定されたファイルは存在しません。',
 'revdelete-show-file-confirm' => '本当にファイル「<nowiki>$1</nowiki>」の削除された$2$3の版を閲覧しますか?',
 'revdelete-show-file-submit' => 'はい',
-'revdelete-selected' => "'''[[:$1]]の{{PLURAL:$2|選択された版}}:'''",
+'revdelete-selected' => "'''[[:$1]] の{{PLURAL:$2|選択された版}}:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|選択された記録の項目}}:'''",
 'revdelete-text' => "'''削除された版や記録はページの履歴や記録に表示され続けますが、一般の利用者はその内容にアクセスできなくなります。'''
-追å\8a ã\81®å\88¶é\99\90ã\81\8cã\81\8bã\81\91ã\82\89ã\82\8cã\81ªã\81\84é\99\90ã\82\8aã\80\81{{SITENAME}}ã\81®ä»\96ã\81®ç®¡ç\90\86è\80\85ã\82\82ã\81\93ã\82\8cã\81¨å\90\8cã\81\98ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼ã\82¹ã\82\92使ã\81£て隠された内容にアクセスしたり、復元したりできます。",
+追å\8a ã\81®å\88¶é\99\90ã\81\8cã\81\8bã\81\91ã\82\89ã\82\8cã\81ªã\81\84é\99\90ã\82\8aã\80\81{{SITENAME}}ã\81®ä»\96ã\81®ç®¡ç\90\86è\80\85ã\82\82ã\81\93ã\82\8cã\81¨å\90\8cã\81\98ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤ã\82¹ã\82\92使ç\94¨ã\81\97て隠された内容にアクセスしたり、復元したりできます。",
 'revdelete-confirm' => 'この操作を意図して行っていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に沿って行っていることを確認してください。',
 'revdelete-suppress-text' => "秘匿は、'''以下の場合に限って'''使用すべきです:
 * 名誉毀損の恐れのある記述
 * 非公開個人情報
-*: ''è\87ªå®\85ã\81®ä½\8fæ\89\80ã\82\84電話番号、社会保障番号など''",
+*: ''è\87ªå®\85ã\81®ä½\8fæ\89\80ã\80\81電話番号、社会保障番号など''",
 'revdelete-legend' => '閲覧レベル制限を設定',
 'revdelete-hide-text' => '版の本文を隠す',
 'revdelete-hide-image' => 'ファイル内容を隠す',
@@ -1265,7 +1280,7 @@ $3が示した理由は ''$2'' です。",
 'revdelete-suppress' => '他の利用者と同様に管理者からもデータを隠す',
 'revdelete-unsuppress' => '復元版に対する制限を除去',
 'revdelete-log' => '理由:',
-'revdelete-submit' => 'é\81¸æ\8a\9eã\81\97た{{PLURAL:$1|版}}に適用',
+'revdelete-submit' => 'é\81¸æ\8a\9eã\81\95ã\82\8cた{{PLURAL:$1|版}}に適用',
 'revdelete-success' => "'''版の閲覧レベルを更新しました。'''",
 'revdelete-failure' => "'''版の閲覧レベルを更新できませんでした:'''
 $1",
@@ -1274,7 +1289,7 @@ $1",
 $1",
 'revdel-restore' => '閲覧レベルを変更',
 'revdel-restore-deleted' => '削除された版',
-'revdel-restore-visible' => '閲覧可能な版',
+'revdel-restore-visible' => '閲覧できる版',
 'pagehist' => 'ページの履歴',
 'deletedhist' => '削除された履歴',
 'revdelete-hide-current' => '$1$2の項目の非表示に失敗しました:これは最新版であるため。
@@ -1285,8 +1300,7 @@ $1",
 アクセス権限がありません。',
 'revdelete-modify-missing' => 'ID$1の項目の変更に失敗しました:データベースに見当たりません!',
 'revdelete-no-change' => "'''警告:''' $1$2の項目には要求された閲覧レベルが既に設定されています。",
-'revdelete-concurrent-change' => '$1$2の項目の変更に失敗しました:変更を加えている間に、他の利用者によって設定が変更されたようです。
-記録を確認してください。',
+'revdelete-concurrent-change' => '$1$2の項目の変更に失敗しました:あなたが変更しようとしている間に、他の利用者が変更したようです。',
 'revdelete-only-restricted' => '$1$2の項目の版指定削除に失敗しました:他の閲覧レベルの選択肢のうちどれかをさらに選択しなければ、管理者から項目を秘匿することはできません。',
 'revdelete-reason-dropdown' => '*よくある削除理由
 ** 著作権侵害
@@ -1300,7 +1314,7 @@ $1",
 # Suppression log
 'suppressionlog' => '秘匿記録',
 'suppressionlogtext' => '以下は管理者から秘匿された内容を含む削除およびブロックの一覧です。
-現在操作できる追放とブロックの一覧については[[Special:BlockList|IPブロックの一覧]]を参照してください。',
+現在操作できる追放とブロックの一覧については[[Special:BlockList|ブロックの一覧]]を参照してください。',
 
 # History merging
 'mergehistory' => 'ページ履歴の統合',
@@ -1310,16 +1324,16 @@ $1",
 'mergehistory-from' => '統合元となるページ:',
 'mergehistory-into' => '統合先のページ:',
 'mergehistory-list' => '統合できる編集履歴',
-'mergehistory-merge' => '以下の[[:$1]]の履歴が、[[:$2]]へ統合可能です。
+'mergehistory-merge' => '以下の [[:$1]] の履歴を [[:$2]] に統合できます。
 特定の時間以前に作成された版のみを統合するには、ラジオボタンで版を選択してください。
-案内リンクを使と、選択が初期化されるので注意してください。',
-'mergehistory-go' => '統合可能な版の表示',
-'mergehistory-submit' => '版を統合する',
+案内リンクを使用すると、選択が初期化されるので注意してください。',
+'mergehistory-go' => '統合できる版を表示',
+'mergehistory-submit' => '版を統合',
 'mergehistory-empty' => '統合できる版がありません。',
-'mergehistory-success' => '[[:$1]]の$3{{PLURAL:$3|版}}を[[:$2]]へ統合しました。',
+'mergehistory-success' => '[[:$1]]の $3 {{PLURAL:$3|版}}を[[:$2]]に統合しました。',
 'mergehistory-fail' => '履歴の統合を実行できません。ページと時刻の引数を再確認してください。',
 'mergehistory-no-source' => '統合元ページ「$1」が存在しません。',
-'mergehistory-no-destination' => 'çµ±å\90\88å\85\88ã\81®ã\83\9aã\83¼ã\82¸$1が存在しません。',
+'mergehistory-no-destination' => 'çµ±å\90\88å\85\88ã\83\9aã\83¼ã\82¸ã\80\8c$1ã\80\8dが存在しません。',
 'mergehistory-invalid-source' => '統合元のページは有効な名前でなければなりません。',
 'mergehistory-invalid-destination' => '統合先のページは有効な名前でなければなりません。',
 'mergehistory-autocomment' => '[[:$1]]を[[:$2]]に統合',
@@ -1329,7 +1343,7 @@ $1",
 
 # Merge log
 'mergelog' => '統合記録',
-'pagemerge-logentry' => '[[$1]]ã\82\92[[$2]]ã\81¸çµ±å\90\88ï¼\88$3版まで)',
+'pagemerge-logentry' => '[[$1]]ã\82\92[[$2]]ã\81«çµ±å\90\88ï¼\88$3 版まで)',
 'revertmerge' => '統合解除',
 'mergelogpagetext' => '以下は、最近行われたあるページから別のページへの統合の一覧です。',
 
@@ -1389,15 +1403,15 @@ $1",
 'search-mwsuggest-disabled' => '検索候補を表示しない',
 'search-relatedarticle' => '関連',
 'mwsuggest-disable' => 'AJAXによる検索候補の提示を無効にする',
-'searcheverything-enable' => '全名前空間を検索する',
+'searcheverything-enable' => 'すべての名前空間を検索',
 'searchrelated' => '関連',
 'searchall' => 'すべて',
-'showingresults' => "'''$2'''件目からの'''$1'''件を表示しています。",
-'showingresultsnum' => "'''$2'''件目からの'''$3'''件を表示しています。",
-'showingresultsheader' => "「'''$4'''」に対する{{PLURAL:$5|'''$3'''件中の'''$1'''件|'''$3'''件中の'''$1'''件から'''$2'''件までの}}結果",
+'showingresults' => "'''$2'''件目からの{{PLURAL:$1|'''$1'''件の結果}}を表示しています。",
+'showingresultsnum' => "'''$2'''件目からの{{PLURAL:$3|'''$3'''件の結果}}を表示しています。",
+'showingresultsheader' => "「'''$4'''」に対する{{PLURAL:$5|'''$3'''件中の'''$1'''件の結果|'''$3'''件中の'''$1'''件目から'''$2'''件目の結果}}",
 'nonefound' => "'''注意''':既定では一部の名前空間しか検索されません。
-''all:''を前につけると、全て(トークページやテンプレートなどを含む)を対象にできます。検索したい名前空間を前につけることもできます。",
-'search-nonefound' => '問い合わせに合致する結果はありませんでした。',
+''all:''を前に付けると、すべて(トークページやテンプレートなどを含む)を対象にできます。検索する名前空間を前に付けることもできます。",
+'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
 'powersearch' => '高度な検索',
 'powersearch-legend' => '高度な検索',
 'powersearch-ns' => '名前空間を指定して検索:',
@@ -1408,8 +1422,8 @@ $1",
 'powersearch-togglenone' => 'すべて外す',
 'search-external' => '外部検索',
 'searchdisabled' => '{{SITENAME}}の検索機能は無効化されています。
\81\95ã\81\97ã\81\82ã\81\9fã\81£ã\81¦ã\81¯Googleã\81ªã\81©ã\81®æ¤\9cç´¢ã\81\8cå\88©ç\94¨できます。
-ただし外部の検索エンジンの索引にある{{SITENAME}}の情報は古い場合があります。',
\81\95ã\81\97ã\81\82ã\81\9fã\81£ã\81¦ã\81¯Googleã\81ªã\81©ã\81§æ¤\9cç´¢できます。
+ただし外部の検索エンジンの索引にある{{SITENAME}}のコンテンツは古い場合があります。',
 
 # Quickbar
 'qbsettings' => 'クイックバー',
@@ -1418,7 +1432,7 @@ $1",
 'qbsettings-fixedright' => '右端',
 'qbsettings-floatingleft' => 'ウィンドウの左上に固定',
 'qbsettings-floatingright' => 'ウィンドウの右上に固定',
-'qbsettings-directionality' => 'あなたの言語のスクリプトの方向に応じて固定',
+'qbsettings-directionality' => 'あなたの言語の文字体系の書字方向に応じて固定',
 
 # Preferences page
 'preferences' => '個人設定',
@@ -1436,9 +1450,9 @@ $1",
 'prefs-personal' => '利用者情報',
 'prefs-rc' => '最近の更新',
 'prefs-watchlist' => 'ウォッチリスト',
-'prefs-watchlist-days' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¡¨ç¤ºã\81\99ã\82\8b日数:',
-'prefs-watchlist-days-max' => '最大$1{{PLURAL:$1|日|日間}}',
-'prefs-watchlist-edits' => 'æ\8b¡å¼µã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¡¨ç¤ºã\81\99ã\82\8b件数:',
+'prefs-watchlist-days' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81®è¡¨ç¤º日数:',
+'prefs-watchlist-days-max' => '最大 $1 {{PLURAL:$1|日間}}',
+'prefs-watchlist-edits' => 'æ\8b¡å¼µã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81®è¡¨ç¤º件数:',
 'prefs-watchlist-edits-max' => '最大数:1000',
 'prefs-watchlist-token' => 'ウォッチリストのトークン:',
 'prefs-misc' => 'その他',
@@ -1459,19 +1473,19 @@ $1",
 'stub-threshold' => '<a href="#" class="stub">スタブリンク</a>として表示する閾値(バイト):',
 'stub-threshold-disabled' => '無効',
 'recentchangesdays' => '最近の更新に表示する日数:',
-'recentchangesdays-max' => '(最大$1{{PLURAL:$1|日|日間}})',
+'recentchangesdays-max' => '(最大 $1 {{PLURAL:$1|日間}})',
 'recentchangescount' => '既定で表示する件数:',
 'prefs-help-recentchangescount' => 'この設定は最近の更新、ページの履歴、および記録に適用されます。',
-'prefs-help-watchlist-token' => 'この欄に秘密鍵を入力すると、自身のウォッチリストのRSSフィードが生成されます。
+'prefs-help-watchlist-token' => 'この欄に秘密鍵を入力すると、あなたのウォッチリストのRSSフィードが生成されます。
 この欄に入力されている鍵を知っている人は誰でもこのウォッチリストを閲覧できるようになるため、他人に分からない値を選んでください。
 乱数によって生成された次の値を使うこともできます:$1',
 'savedprefs' => '個人設定を保存しました。',
-'timezonelegend' => '時間帯:',
-'localtime' => '現地時間:',
+'timezonelegend' => 'タイムゾーン:',
+'localtime' => 'ローカルの時刻:',
 'timezoneuseserverdefault' => '既定を使用 ($1)',
 'timezoneuseoffset' => 'その他(時差を指定)',
 'timezoneoffset' => '時差¹:',
-'servertime' => 'サーバーの時:',
+'servertime' => 'サーバーの時:',
 'guesstimezone' => 'ブラウザの設定から入力',
 'timezoneregion-africa' => 'アフリカ',
 'timezoneregion-america' => 'アメリカ',
@@ -1483,20 +1497,20 @@ $1",
 'timezoneregion-europe' => 'ヨーロッパ',
 'timezoneregion-indian' => 'インド洋',
 'timezoneregion-pacific' => '太平洋',
-'allowemail' => '他の利用者からの電子メールの受信を有効化する',
+'allowemail' => '他の利用者からのメールを受け取る',
 'prefs-searchoptions' => '検索設定',
 'prefs-namespaces' => '名前空間',
-'defaultns' => 'ã\81\9dã\81®ä»\96ã\81®å ´å\90\88ã\80\81次ã\81®å\90\8då\89\8d空é\96\93ã\81§ã\81®ã\81¿æ¤\9cç´¢ã\81\99ã\82\8b:',
+'defaultns' => 'ã\81¾ã\81\9fã\81¯æ¬¡ã\81®å\90\8då\89\8d空é\96\93ã\81®ã\81¿ã\82\92æ¤\9cç´¢:',
 'default' => '既定',
 'prefs-files' => 'ファイル',
 'prefs-custom-css' => 'カスタムCSS',
 'prefs-custom-js' => 'カスタムJS',
-'prefs-common-css-js' => 'すべての外装に共通のCSSとJavaScript:',
-'prefs-reset-intro' => 'このページを使うと、自身の個人設定をこのサイトの既定のものに再設定することができます。
\81\93ã\81®æ\93\8dä½\9cã\81¯å\8f\96ã\82\8aæ¶\88ã\81\97ã\81\8cã\81§ã\81\8dません。',
+'prefs-common-css-js' => '外装に共通のCSSとJavaScript:',
+'prefs-reset-intro' => 'このページを使用すると、自分の個人設定をこのサイトの初期設定に戻せます。
\81\93ã\81®æ\93\8dä½\9cã\81¯å\8f\96ã\82\8aæ¶\88ã\81\9bません。',
 'prefs-emailconfirm-label' => 'メール確認:',
 'prefs-textboxsize' => '編集画面の大きさ',
-'youremail' => '電子メール:',
+'youremail' => 'メールアドレス:',
 'username' => '利用者名:',
 'uid' => '利用者ID:',
 'prefs-memberingroups' => '所属する{{PLURAL:$1|グループ}}:',
@@ -1506,7 +1520,7 @@ $1",
 'yourvariant' => 'コンテンツ言語変種:',
 'prefs-help-variant' => 'あなたがこのウィキのコンテンツに表示に使いたい言語変種または正書法',
 'yournick' => '新しい署名:',
-'prefs-help-signature' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ä¸\8aã\81§ã\81®ç\99ºè¨\80ã\81«ã\81¯ã\80\8c<nowiki>~~~~</nowiki>ã\80\8dã\81¨ä»\98ã\81\91ã\81¦ç½²å\90\8dã\81\99ã\82\8bã\81¹ã\81\8dã\81§ã\81\99ã\80\82ã\81\93ã\82\8cã\81¯è\87ªå\88\86ã\81®ç½²å\90\8dã\81«æ\99\82å\88»å\8d°ã\82\92ä»\98å\8a ã\81\97たものに変換されます。',
+'prefs-help-signature' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ä¸\8aã\81§ã\81®ç\99ºè¨\80ã\81«ã\81¯ã\80\8c<nowiki>~~~~</nowiki>ã\80\8dã\81¨ä»\98ã\81\91ã\81¦ç½²å\90\8dã\81\99ã\81¹ã\81\8dã\81§ã\81\99ã\80\82ã\81\93ã\82\8cã\81¯è\87ªå\88\86ã\81®ç½²å\90\8dã\81«æ\99\82å\88»å\8d°ã\82\92ä»\98ã\81\91たものに変換されます。',
 'badsig' => '署名用のソースが正しくありません。
 HTMLタグを見直してください。',
 'badsiglength' => '署名が長すぎます。$1文字以下でなければなりません。',
@@ -1514,13 +1528,13 @@ HTMLタグを見直してください。',
 'gender-unknown' => '未指定',
 'gender-male' => '男',
 'gender-female' => '女',
-'prefs-help-gender' => '省略可:ソフトウェアによる文法的性の解決に使用されます。
+'prefs-help-gender' => '省略可:ソフトウェアによる文法的性の解決に使用されます。
 この情報は公開されます。',
-'email' => '電子メール',
-'prefs-help-realname' => '本名登録は省略可能です。
-登録した場合、著作物の帰属表示に本名が用いられます。',
-'prefs-help-email' => '電子メールアドレスの設定は省略可能ですが、パスワードを忘れた際に新しいパスワードを電子メールで受け取る場合に必要です。',
-'prefs-help-email-others' => 'あなたの身元を明らかにすることなく、他の利用者に利用者ページやトークページを使て連絡をしてもらうようにすることもできます。',
+'email' => 'メール',
+'prefs-help-realname' => '本名は省略できます。
+入力すると、あなたの著作物の帰属表記に本名を使用します。',
+'prefs-help-email' => 'メールアドレスは省略できますが、パスワードを忘れた際にパスワードをリセットするのに必要です。',
+'prefs-help-email-others' => 'あなたの身元を明らかにすることなく、他の利用者に利用者ページやトークページを使用して連絡をしてもらうようにすることもできます。',
 'prefs-help-email-required' => 'メールアドレスが必要です。',
 'prefs-info' => '基本情報',
 'prefs-i18n' => '国際化',
@@ -1538,11 +1552,11 @@ HTMLタグを見直してください。',
 'prefs-diffs' => '差分',
 
 # User preference: e-mail validation using jQuery
-'email-address-validity-valid' => '電子メールアドレスは有効なようです',
-'email-address-validity-invalid' => '有効な電子メールアドレスを入力してください',
+'email-address-validity-valid' => 'メール アドレスは有効のようです',
+'email-address-validity-invalid' => '有効なメールアドレスを入力',
 
 # User rights
-'userrights' => 'å\88©ç\94¨è\80\85権é\99\90ã\81®管理',
+'userrights' => 'å\88©ç\94¨è\80\85権é\99\90ã\82\92管理',
 'userrights-lookup-user' => '利用者グループを管理',
 'userrights-user-editname' => '利用者名を入力:',
 'editusergroup' => '利用者グループを編集',
@@ -1551,16 +1565,16 @@ HTMLタグを見直してください。',
 'saveusergroups' => '利用者グループを保存',
 'userrights-groupsmember' => '所属グループ:',
 'userrights-groupsmember-auto' => '自動的に付与される権限:',
-'userrights-groups-help' => 'ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81\8cå±\9eã\81\99ã\82\8bã\82°ã\83«ã\83¼ã\83\97ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82
+'userrights-groups-help' => 'この利用者が属するグループを変更できます。
 * チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。
 * チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。
-* *は一旦グループへ追加した場合に除去あるいはその逆が不可能であることを示しています。',
+* 「*」はグループに一旦追加した場合に除去(あるいはその逆)ができないことを示しています。',
 'userrights-reason' => '理由:',
 'userrights-no-interwiki' => '他ウィキ上における利用者権限の編集権限はありません。',
 'userrights-nodatabase' => 'データベース$1は存在しないか、ローカル上にありません。',
 'userrights-nologin' => '利用者権限を付与するには、管理者アカウントで[[Special:UserLogin|ログイン]]する必要があります。',
 'userrights-notallowed' => 'あなたのアカウントには利用者権限を追加または除去する権限がありません。',
-'userrights-changeable-col' => '変更可能なグループ',
+'userrights-changeable-col' => '変更できるグループ',
 'userrights-unchangeable-col' => '変更できないグループ',
 
 # Groups
@@ -1588,65 +1602,65 @@ HTMLタグを見直してください。',
 'grouppage-suppress' => '{{ns:project}}:秘匿者',
 
 # Rights
-'right-read' => 'ã\83\9aã\83¼ã\82¸ã\81®閲覧',
-'right-edit' => 'ã\83\9aã\83¼ã\82¸ã\81®編集',
-'right-createpage' => '(議論ページでない)ページの作成',
-'right-createtalk' => 'è­°è«\96ã\83\9aã\83¼ã\82¸ã\81®作成',
-'right-createaccount' => 'æ\96°ã\81\97ã\81\84å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®作成',
-'right-minoredit' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81®å\8d°ã\81¥ã\81\91',
+'right-read' => 'ã\83\9aã\83¼ã\82¸ã\82\92閲覧',
+'right-edit' => 'ã\83\9aã\83¼ã\82¸ã\82\92編集',
+'right-createpage' => 'ページ(議論ページ以外)を作成',
+'right-createtalk' => 'è­°è«\96ã\83\9aã\83¼ã\82¸ã\82\92作成',
+'right-createaccount' => 'æ\96°ã\81\97ã\81\84å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92作成',
+'right-minoredit' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81®å\8d°ã\82\92ä»\98ã\81\91ã\82\8b',
 'right-move' => 'ページの移動',
-'right-move-subpages' => 'ä¸\8bä½\8dã\83\9aã\83¼ã\82¸ã\82\92å\90«ã\82\81ã\81\9fã\83\9aã\83¼ã\82¸ã\81®移動',
-'right-move-rootuserpages' => 'å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸æ\9c¬ä½\93ã\81®移動',
+'right-move-subpages' => 'ä¸\8bä½\8dã\83\9aã\83¼ã\82¸ã\82\92å\90«ã\82\81ã\81¦ã\83\9aã\83¼ã\82¸ã\82\92移動',
+'right-move-rootuserpages' => 'å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸æ\9c¬ä½\93ã\82\92移動',
 'right-movefile' => 'ファイルの移動',
-'right-suppressredirect' => 'ページの移動の際にもとのページ名からのリダイレクトを作成しない',
-'right-upload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
-'right-reupload' => '存在するファイルの上書き',
-'right-reupload-own' => '自らがアップロードした存在するファイルの上書き',
+'right-suppressredirect' => 'ページの移動の際にのページ名からのリダイレクトを作成しない',
+'right-upload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
+'right-reupload' => '既存のファイルに上書き',
+'right-reupload-own' => '自分がアップロードした既存のファイルに上書き',
 'right-reupload-shared' => '共有メディアリポジトリ上のファイルのローカルでの上書き',
-'right-upload_by_url' => 'URLã\81\8bã\82\89ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
+'right-upload_by_url' => 'URLã\81\8bã\82\89ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
 'right-purge' => '確認を省略してサイトのキャッシュを破棄',
-'right-autoconfirmed' => 'å\8d\8aä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\81®編集',
-'right-bot' => '自動処理として認識',
+'right-autoconfirmed' => 'å\8d\8aä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\82\92編集',
+'right-bot' => '自動処理と認識させる',
 'right-nominornewtalk' => '議論ページへ細部の編集をしたときに、新しいメッセージのお知らせを表示しない',
 'right-apihighlimits' => 'API要求でより高い制限値の使用',
 'right-writeapi' => '書き込みAPIの使用',
 'right-delete' => 'ページの削除',
-'right-bigdelete' => '大ã\81\8dã\81ªå±¥æ­´ã\81®ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81®削除',
+'right-bigdelete' => '大ã\81\8dã\81ªå±¥æ­´ã\81\8cã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\82\92削除',
 'right-deleterevision' => 'ページの特定の版の削除と復帰',
-'right-deletedhistory' => '関連する本文を除く、削除された履歴項目の閲覧',
-'right-deletedtext' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fæ\9c¬æ\96\87ã\81¨å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fç\89\88é\96\93ã\81®å·®å\88\86ã\81®閲覧',
-'right-browsearchive' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\81®検索',
+'right-deletedhistory' => '削除された履歴項目(関連する本文を除く)を閲覧',
+'right-deletedtext' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fæ\9c¬æ\96\87ã\81¨å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fç\89\88é\96\93ã\81®å·®å\88\86ã\82\92閲覧',
+'right-browsearchive' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\82\92検索',
 'right-undelete' => 'ページの復帰',
 'right-suppressrevision' => '管理者から隠された版の確認と復元',
-'right-suppressionlog' => 'é\9d\9eå\85¬é\96\8bè¨\98é\8c²ã\81®閲覧',
+'right-suppressionlog' => 'é\9d\9eå\85¬é\96\8bè¨\98é\8c²ã\82\92閲覧',
 'right-block' => '他の利用者の編集をブロック',
-'right-blockemail' => '利用者の電子メール送信をブロック',
-'right-hideuser' => 'å\88©ç\94¨è\80\85å\90\8dã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\80\81公開記録から隠す',
+'right-blockemail' => '利用者のメール送信をブロック',
+'right-hideuser' => 'å\88©ç\94¨è\80\85å\90\8dã\82\92ã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\81¦公開記録から隠す',
 'right-ipblock-exempt' => 'IPブロック、自動ブロック、広域ブロックを回避',
 'right-proxyunbannable' => 'プロキシの自動ブロックを回避',
 'right-unblockself' => '自分自身に対するブロックを解除',
-'right-protect' => 'ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\81®å¤\89æ\9b´ã\81¨ä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\81®編集',
-'right-editprotected' => '保護ページの編集(カスケード保護を除く)',
-'right-editinterface' => 'ユーザーインターフェースの編集',
-'right-editusercssjs' => '他利用者のCSSとJavaScriptファイルの編集',
-'right-editusercss' => '他利用者のCSSファイルの編集',
-'right-edituserjs' => '他利用者のJavaScriptファイルの編集',
+'right-protect' => 'ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\82\92å¤\89æ\9b´ã\81\97ã\80\81ä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\82\92編集',
+'right-editprotected' => '保護ページ(カスケード保護を除く)を編集',
+'right-editinterface' => 'ユーザー インターフェイスを編集',
+'right-editusercssjs' => '他の利用者のCSSとJavaScriptファイルを編集',
+'right-editusercss' => '他の利用者のCSSファイルを編集',
+'right-edituserjs' => '他の利用者のJavaScriptファイルを編集',
 'right-rollback' => '特定ページを最後に編集した利用者の編集の即時巻き戻し',
 'right-markbotedits' => '巻き戻しをボットの編集として扱う',
 'right-noratelimit' => '速度制限を受けない',
 'right-import' => '他のウィキからのページ取り込み',
-'right-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\8bã\82\89ã\81®ã\83\9aã\83¼ã\82¸ã\81®取り込み',
+'right-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81«ã\82\88ã\82\8bã\83\9aã\83¼ã\82¸取り込み',
 'right-patrol' => '他人の編集を巡回済みにする',
 'right-autopatrol' => '自分の編集を自動的に巡回済みにする',
 'right-patrolmarks' => '最近の更新で巡回済み印を閲覧',
-'right-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\81®閲覧',
+'right-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\82\92閲覧',
 'right-mergehistory' => 'ページ履歴の統合',
-'right-userrights' => 'å\85¨å\88©ç\94¨è\80\85権é\99\90ã\81®編集',
-'right-userrights-interwiki' => 'ä»\96ã\81®ã\82¦ã\82£ã\82­ã\81®å\88©ç\94¨è\80\85ã\81®å\88©ç\94¨è\80\85権é\99\90ã\81®編集',
+'right-userrights' => 'å\85¨å\88©ç\94¨è\80\85権é\99\90ã\82\92編集',
+'right-userrights-interwiki' => 'ä»\96ã\81®ã\82¦ã\82£ã\82­ã\81®å\88©ç\94¨è\80\85ã\81®å\88©ç\94¨è\80\85権é\99\90ã\82\92編集',
 'right-siteadmin' => 'データベースのロックおよびロック解除',
 'right-override-export-depth' => 'リンク先ページを5階層まで含めて書き出す',
-'right-sendemail' => 'ä»\96ã\81®å\88©ç\94¨è\80\85ã\81¸é\9b»å­\90ã\83¡ã\83¼ã\83«ã\82\92é\80\81ã\82\8b',
-'right-passwordreset' => 'パスワード再設定メールを閲覧する',
+'right-sendemail' => 'ä»\96ã\81®å\88©ç\94¨è\80\85ã\81«ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡',
+'right-passwordreset' => 'パスワード再設定メールを閲覧',
 
 # User rights log
 'rightslog' => '利用者権限変更記録',
@@ -1656,41 +1670,41 @@ HTMLタグを見直してください。',
 'rightsnone' => '(なし)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®閲覧',
-'action-edit' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®編集',
-'action-createpage' => 'ã\83\9aã\83¼ã\82¸ã\81®æ\96°è¦\8f作成',
-'action-createtalk' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81®æ\96°è¦\8f作成',
-'action-createaccount' => 'このアカウントの作成',
-'action-minoredit' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81¨ã\81\97ã\81¦å\8d°ä»\98ã\81\91',
+'action-read' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92閲覧',
+'action-edit' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92編集',
+'action-createpage' => 'ã\83\9aã\83¼ã\82¸ã\82\92作成',
+'action-createtalk' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\82\92作成',
+'action-createaccount' => 'この利用者アカウントを作成',
+'action-minoredit' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81®å\8d°ã\82\92ä»\98ã\81\91ã\82\8b',
 'action-move' => 'このページの移動',
 'action-move-subpages' => 'このページと下位ページの移動',
 'action-move-rootuserpages' => '利用者ページ本体の移動',
 'action-movefile' => 'このファイルの移動',
-'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
-'action-reupload' => 'このファイルの上書き',
-'action-reupload-shared' => 'å\85±æ\9c\89ã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\81«ã\81\82ã\82\8bã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®上書き',
+'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
+'action-reupload' => 'この既存のファイルに上書き',
+'action-reupload-shared' => 'å\85±æ\9c\89ã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\81«ã\81\82ã\82\8bã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«上書き',
 'action-upload_by_url' => 'URLからこのファイルをアップロード',
 'action-writeapi' => '書き込みAPIを使用',
-'action-delete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®削除',
-'action-deleterevision' => 'ã\81\93ã\81®ç\89\88ã\81®削除',
-'action-deletedhistory' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å\89\8aé\99¤å±¥æ­´ã\81®表示',
+'action-delete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92削除',
+'action-deleterevision' => 'ã\81\93ã\81®ç\89\88ã\82\92削除',
+'action-deletedhistory' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å\89\8aé\99¤å±¥æ­´ã\82\92表示',
 'action-browsearchive' => '削除されたページの検索',
-'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®復帰',
+'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92復帰',
 'action-suppressrevision' => '隠された版の確認と復元',
 'action-suppressionlog' => 'この非公開記録の表示',
 'action-block' => 'この利用者の編集をブロック',
-'action-protect' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\81®変更',
-'action-rollback' => 'ç\89¹å®\9aã\83\9aã\83¼ã\82¸ã\82\92æ\9c\80å¾\8cã\81«ç·¨é\9b\86ã\81\97ã\81\9få\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\81®即時巻き戻し',
-'action-import' => '他のウィキからのこのページの取り込み',
-'action-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\8bã\82\89ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å\8f\96ã\82\8aè¾¼ã\81¿',
+'action-protect' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\82\92変更',
+'action-rollback' => 'ç\89¹å®\9aã\83\9aã\83¼ã\82¸ã\82\92æ\9c\80å¾\8cã\81«ç·¨é\9b\86ã\81\97ã\81\9få\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\82\92即時巻き戻し',
+'action-import' => 'このページを他のウィキから取り込む',
+'action-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«å\8f\96ã\82\8aè¾¼ã\82\80',
 'action-patrol' => '他の利用者の編集を巡回済みにする',
 'action-autopatrol' => '自身の編集を巡回済みにする',
-'action-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\81®表示',
-'action-mergehistory' => 'このページの履歴統合',
+'action-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\82\92表示',
+'action-mergehistory' => 'このページの履歴統合',
 'action-userrights' => '全利用者権限の変更',
 'action-userrights-interwiki' => '他のウィキ上の利用者の利用者権限変更',
-'action-siteadmin' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83­ã\83\83ã\82¯ã\82\82ã\81\97ã\81\8fはロック解除',
-'action-sendemail' => '電子メールの送信',
+'action-siteadmin' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ã\83­ã\83\83ã\82¯ã\81¾ã\81\9fはロック解除',
+'action-sendemail' => 'メールを送信',
 
 # Recent changes
 'nchanges' => '$1回の変更',
@@ -1702,7 +1716,7 @@ HTMLタグを見直してください。',
 'recentchanges-label-minor' => 'これは細部の編集です',
 'recentchanges-label-bot' => 'この編集はボットによって行われました',
 'recentchanges-label-unpatrolled' => 'この編集はまだ巡回されていません',
-'rcnote' => "$4 $5までの{{PLURAL:$2|'''1'''日|'''$2'''日間}}になされた'''$1'''件の変更は以下のとおりです。",
+'rcnote' => "$4 $5 までの{{PLURAL:$2|'''$2'''日間}}になされた{{PLURAL:$1|'''$1'''件の変更}}は以下の通りです。",
 'rcnotefrom' => "以下は、'''$2'''以降の更新です(最大'''$1'''件)。",
 'rclistfrom' => '$1以降の更新を表示する',
 'rcshowhideminor' => '細部の編集を$1',
@@ -1711,7 +1725,7 @@ HTMLタグを見直してください。',
 'rcshowhideanons' => '匿名利用者の編集を$1',
 'rcshowhidepatr' => '巡回された編集を$1',
 'rcshowhidemine' => '自分の編集を$1',
-'rclinks' => '最近$2日間の$1件分を表示する<br />$3',
+'rclinks' => '最近$2日間の$1件分を表示<br />$3',
 'diff' => '差分',
 'hist' => '履歴',
 'hide' => '非表示',
@@ -1720,13 +1734,14 @@ HTMLタグを見直してください。',
 'newpageletter' => '新',
 'boteditletter' => 'ボ',
 'unpatrolledletter' => '!',
-'number_of_watching_users_pageview' => '[$1人の利用者がウォッチしています]',
+'number_of_watching_users_pageview' => '[$1 人の利用者がウォッチしています]',
 'rc_categories' => 'カテゴリを限定(「|」で区切る)',
 'rc_categories_any' => 'すべて',
 'rc-change-size-new' => '変更後は$1バイト',
 'newsectionsummary' => '/* $1 */ 新しい節',
-'rc-enhanced-expand' => '詳細を表示(JavaScriptが必要)',
+'rc-enhanced-expand' => '詳細を表示(JavaScript が必要)',
 'rc-enhanced-hide' => '詳細を非表示',
+'rc-old-title' => '作成時のページ名は「$1」',
 
 # Recent changes linked
 'recentchangeslinked' => '関連ページの更新状況',
@@ -1734,7 +1749,7 @@ HTMLタグを見直してください。',
 'recentchangeslinked-toolbox' => '関連ページの更新状況',
 'recentchangeslinked-title' => '「$1」と関連する変更',
 'recentchangeslinked-noresult' => '指定期間中に指定ページのリンク先に変更はありませんでした。',
-'recentchangeslinked-summary' => "ã\81\93ã\82\8cã\81¯ã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bï¼\88ã\82\82ã\81\97ã\81\8fã\81¯ã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\82«ã\83\86ã\82´ã\83ªã\81«å\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bï¼\89ã\83\9aã\83¼ã\82¸ã\81«æ\9c\80è¿\91å\8a ã\81\88ã\82\89ã\82\8cã\81\9f変更の一覧です。
+'recentchangeslinked-summary' => "ã\81\93ã\82\8cã\81¯ã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bï¼\88ã\81¾ã\81\9fã\81¯æ\8c\87å®\9aã\81\97ã\81\9fã\82«ã\83\86ã\82´ã\83ªã\81«å\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bï¼\89ã\83\9aã\83¼ã\82¸ã\81¸ã\81®æ\9c\80è¿\91ã\81®変更の一覧です。
 [[Special:Watchlist|自分のウォッチリスト]]にあるページは'''太字'''で表示されています。",
 'recentchangeslinked-page' => 'ページ名:',
 'recentchangeslinked-to' => '代わりに、指定したページへのリンク元での変更を表示',
@@ -1784,7 +1799,7 @@ HTMLタグを見直してください。',
 'filetype-badmime' => 'MIMEタイプ「$1」のファイルのアップロードは許可されていません。',
 'filetype-bad-ie-mime' => '許可されていない潜在的危険性のあるファイル形式「$1」としてInternet Explorerに認識されてしまうため、このファイルをアップロードできません。',
 'filetype-unwanted-type' => "'''「.$1」'''は好ましくないファイル形式です。
-推奨される{{PLURAL:$3|ファイル形式}}は$2です。",
+推奨される{{PLURAL:$3|ファイル形式}}は $2 です。",
 'filetype-banned-type' => "'''「.$1」''' は許可されていないファイル形式です{{PLURAL:$4|}}。
 許可されているファイル形式{{PLURAL:$3|}}は$2です。",
 'filetype-missing' => 'ファイルに、「.jpg」のような拡張子がありません。',
@@ -1795,7 +1810,7 @@ HTMLタグを見直してください。',
 'verification-error' => 'このファイルは、ファイルの検証システムに合格しませんでした。',
 'hookaborted' => '拡張機能のフックによって、修正が中断されました。',
 'illegal-filename' => 'そのファイル名は許可されていません。',
-'overwrite' => '既存のファイルへ上書きすることは許可されていません。',
+'overwrite' => '既存のファイルへの上書きは許可されていません。',
 'unknown-error' => '不明なエラーが発生しました。',
 'tmp-create-error' => '一時ファイルを作成できませんでした。',
 'tmp-write-error' => '一時ファイルへの書き込みエラー',
@@ -1805,7 +1820,7 @@ HTMLタグを見直してください。',
 'emptyfile' => 'アップロードしたファイルは内容が空のようです。
 ファイル名の指定が間違っている可能性があります。
 本当にこのファイルをアップロードしたいのか、確認してください。',
-'windows-nonascii-filename' => 'ã\81\93ã\81®wikiã\81§ã\81¯ã\80\81ã\83\95ã\82¡ã\82¤ã\83«å\90\8dã\81«ç\89¹æ®\8aæ\96\87å­\97ã\82\92使ã\81\86ã\81\93ã\81¨ã\81\8cできません。',
+'windows-nonascii-filename' => 'ã\81\93ã\81®wikiã\81§ã\81¯ã\83\95ã\82¡ã\82¤ã\83«å\90\8dã\81«ç\89¹æ®\8aæ\96\87å­\97ã\82\92使ç\94¨できません。',
 'fileexists' => "この名前のファイルは既に存在しています。置き換えるべきかどうか確信がもてない場合は、'''<tt>[[:$1]]</tt>'''を確認してください。
 [[$1|thumb]]",
 'filepageexists' => "このファイルのための説明ページは既に'''<tt>[[:$1]]</tt>'''に作成されていますが、現在、ファイルが存在していません。
@@ -1816,20 +1831,20 @@ HTMLタグを見直してください。',
 * アップロード中のファイルの名前:'''<tt>[[:$1]]</tt>'''
 * 既存ファイルの名前:'''<tt>[[:$2]]</tt>'''
 違う名前を選択してください。",
-'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの(サムネイル)のようです。
+'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの''(サムネイル)''のようです。
 [[$1|thumb]]
 ファイル'''<tt>[[:$1]]</tt>'''を確認してください。
-確認したファイルが同じ画像のもとのサイズの版である場合、サムネイルを個別にアップロードする必要はありません。",
+確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
 'file-thumbnail-no' => "ファイル名が'''<tt>$1</tt>'''から始まっています。
-他の画像から縮小されたもの(サムネイル)のようです。
\82\88ã\82\8aé«\98精細ã\81ªç\94»å\83\8fã\82\92ã\81\8aæ\8c\81ã\81¡ã\81®å ´å\90\88ã\81¯ã\80\81ã\81\9dã\81¡ã\82\89ã\82\92ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\9dã\81\86ã\81§ない場合はファイル名を変更してください。",
+他の画像から縮小されたもの''(サムネイル)''のようです。
\82\88ã\82\8aé«\98精細ã\81ªç\94»å\83\8fã\82\92ã\81\8aæ\8c\81ã\81¡ã\81®å ´å\90\88ã\81¯ã\81\9dã\82\8cã\82\92ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\8aæ\8c\81ã\81¡ã\81§ã\81¯ない場合はファイル名を変更してください。",
 'fileexists-forbidden' => 'この名前のファイルは既に存在しており、上書きできません。
 アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'この名前のファイルは共有ファイルリポジトリに既に存在しています。
 アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
 [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'このファイルは以下の{{PLURAL:$1|ファイル}}と重複しています:',
+'file-exists-duplicate' => 'このファイルは以下の{{PLURAL:$1|ファイル|ファイル群}}と重複しています:',
 'file-deleted-duplicate' => 'このファイル([[:$1]])と同一のファイルが以前に削除されています。
 再度アップロードをする前に、以前削除されたファイルの削除記録を確認してください。',
 'uploadwarning' => 'アップロード警告',
@@ -1875,7 +1890,7 @@ MGP # ペンタックス
 PICT # その他
  #</pre> <!-- この行はそのままにしておいてください -->',
 'upload-success-subj' => 'アップロード成功',
-'upload-success-msg' => '[$2]からのアップロードに成功しました。[[:{{ns:file}}:$1]]から利用可能です。',
+'upload-success-msg' => '[$2] からのアップロードに成功しました。こちらで利用できます:[[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'アップロードで発生した問題',
 'upload-failure-msg' => '[$2]からのアップロード中に問題が発生しました:
 
@@ -1889,8 +1904,8 @@ $1',
 'upload-file-error-text' => '内部エラーのため、サーバー上の一時ファイル作成に失敗しました。
 [[Special:ListUsers/sysop|管理者]]に連絡してください。',
 'upload-misc-error' => '不明なアップロードのエラー',
-'upload-misc-error-text' => 'アップロードに不明なエラーが発生しました。
-指定したURLがアクセス可能で有効なものであるかを再度確認してください。
+'upload-misc-error-text' => 'アップロードに不明なエラーが発生しました。
+指定した URL が正しいこととアクセスできることを確認して、もう一度試してください。
 それでもこのエラーが発生する場合は、[[Special:ListUsers/sysop|管理者]]に連絡してください。',
 'upload-too-many-redirects' => 'そのURLに含まれるリダイレクトが多すぎます',
 'upload-unknown-size' => 'サイズ不明',
@@ -1901,10 +1916,11 @@ $1',
 'backend-fail-stream' => 'ファイル $1 をストリームできませんでした。',
 'backend-fail-backup' => 'ファイル $1 をバックアップできませんでした。',
 'backend-fail-notexists' => 'ファイル $1 は存在しません。',
-'backend-fail-notsame' => 'ファイル名 $1 はすでに違うファイルが使用しています。',
+'backend-fail-hashes' => 'ファイルの比較用のハッシュを取得できませんでした。',
+'backend-fail-notsame' => 'ファイル名 $1 は既に他のファイルが使用しています。',
 'backend-fail-invalidpath' => '$1 はストレージパスに使用することができません。',
 'backend-fail-delete' => 'ファイル $1 を削除できませんでした。',
-'backend-fail-alreadyexists' => 'ファイル $1 はすでに存在します。',
+'backend-fail-alreadyexists' => 'ファイル $1 はに存在します。',
 'backend-fail-store' => 'ファイル $1 を $2 に格納できませんでした。',
 'backend-fail-copy' => 'ファイル $1 を $2 にコピーできませんでした。',
 'backend-fail-move' => 'ファイル $1 を $2 に移動できませんでした。',
@@ -1913,9 +1929,28 @@ $1',
 'backend-fail-closetemp' => '一時ファイルを閉じることができませんでした。',
 'backend-fail-read' => 'ファイル $1 を読み込めませんでした。',
 'backend-fail-create' => 'ファイル $1 を作成できませんでした。',
+'backend-fail-maxsize' => '{{PLURAL:$2|$2 バイト}}よりも大きいため、ファイル「$1」を作成できませんでした。',
 'backend-fail-readonly' => 'ストレージバックエンド「$1」は現在読み取り専用です。理由:「$2」',
 'backend-fail-synced' => 'ファイル「$1」は、ストレージバックエンド内部において不一致の状態にあります。',
+'backend-fail-connect' => 'ストレージバックエンドに接続できませんでした。「$1」',
+'backend-fail-internal' => 'ストレージバックエンド「$1」で原因不明のエラーが発生しました。',
 'backend-fail-contenttype' => '「$1」に保存するコンテンツの種類が判断できませんでした。',
+'backend-fail-batchsize' => 'ストレージバックエンドは $1 件のファイル{{PLURAL:$1|操作}}のバッチを与えられました; 上限は $2 件の{{PLURAL:$2|操作}}です。',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'ストレージバックエンド「$1」のジャーナルデータベースに接続できません。',
+'filejournal-fail-dbquery' => 'ストレージバックエンド「$1」のジャーナルデータベースを更新できません。',
+
+# Lock manager
+'lockmanager-notlocked' => '「$1」をアンロックできませんでした。ロックはされていません。',
+'lockmanager-fail-closelock' => '「$1」用のロックファイルを閉じることができませんでした。',
+'lockmanager-fail-deletelock' => '「$1」用のロックファイルを削除することができませんでした。',
+'lockmanager-fail-acquirelock' => '「$1」用のロックを取得できませんでした。',
+'lockmanager-fail-openlock' => '「$1」用のロックファイルを開くことができませんでした。',
+'lockmanager-fail-releaselock' => '「$1」用のロックを解放できませんでした。',
+'lockmanager-fail-db-bucket' => 'バケット $1 で十分な数のロックデータベースに接触できませんでした。',
+'lockmanager-fail-db-release' => 'データベース $1 上のロックを解放できませんでした。',
+'lockmanager-fail-svr-release' => 'サーバー $1 上のロックを解放できませんでした。',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'ZIPのチェックを行った際にエラーが検出されました。',
@@ -1956,7 +1991,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization を参照してくだ
 
 # HTTP errors
 'http-invalid-url' => '無効なURL:$1',
-'http-invalid-scheme' => '"$1"のスキームを含むURLはサポートされていません',
+'http-invalid-scheme' => 'スキーム「$1」の URL には未対応です。',
 'http-request-error' => '不明なエラーによりHTTPリクエストに失敗しました。',
 'http-read-error' => 'HTTP読み込みエラー。',
 'http-timed-out' => 'HTTP要求がタイムアウトしました。',
@@ -1978,7 +2013,7 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'nolicense' => '選択なし',
 'license-nopreview' => '(プレビューはありません)',
 'upload_source_url' => '(有効かつ一般に公開されているURL)',
-'upload_source_file' => '(自身のコンピューター上のファイル)',
+'upload_source_file' => '(あなたのコンピューター上のファイル)',
 
 # Special:ListFiles
 'listfiles-summary' => 'この特別ページでは、アップロードされたすべてのファイルを表示します。
@@ -2010,11 +2045,11 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'filehist-dimensions' => '解像度',
 'filehist-filesize' => 'ファイルサイズ',
 'filehist-comment' => 'コメント',
-'filehist-missing' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81¿ã\81¤ã\81\8bりません',
+'filehist-missing' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81\82りません',
 'imagelinks' => 'ファイルの使用状況',
-'linkstoimage' => '以下の{{PLURAL:$1|ページ|$1ページ}}が、このファイルへリンクしています:',
-'linkstoimage-more' => '$1を超える数のページが、このファイルにリンクしています。
-以ä¸\8bã\81®ä¸\80覧ã\81¯ã\80\81ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«ã\83ªã\83³ã\82¯ã\81\97ã\81¦ã\81\84ã\82\8bæ\9c\80å\88\9dã\81®$1ページのみを表示しています。
+'linkstoimage' => 'このファイルへは以下の {{PLURAL:$1|ページ| $1 ページ}}からリンクしています:',
+'linkstoimage-more' => 'このファイルへは $1 を超える数のページからリンクがあります。
+以ä¸\8bã\81®ä¸\80覧ã\81§ã\81¯ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«ã\83ªã\83³ã\82¯ã\81\97ã\81¦ã\81\84ã\82\8bæ\9c\80å\88\9dã\81® $1 ページのみを表示しています。
 [[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。',
 'nolinkstoimage' => 'このファイルへリンクしているページはありません。',
 'morelinkstoimage' => 'このファイルへの[[Special:WhatLinksHere/$1|リンク元を更に]]を表示する。',
@@ -2023,11 +2058,16 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'sharedupload' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。',
 'sharedupload-desc-there' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。
 詳細は[$2 ファイル解説ページ]を参照してください。',
-'sharedupload-desc-here' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。その[$2 ファイル解説ページ]にある説明を以下に表示しています。',
+'sharedupload-desc-here' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を以下に示します。',
+'sharedupload-desc-edit' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を編集したほうがいいかもしれません。',
+'sharedupload-desc-create' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を編集したほうがいいかもしれません。',
 'filepage-nofile' => 'この名前のファイルは存在しません。',
 'filepage-nofile-link' => 'この名前のファイルは存在しませんが、[$1 アップロード]することができます。',
 'uploadnewversion-linktext' => 'このファイルの新しい版をアップロードする',
-'shared-repo-from' => '$1より',
+'shared-repo-from' => '$1 より',
 'shared-repo' => '共有リポジトリ',
 'shared-repo-name-wikimediacommons' => 'ウィキメディア・コモンズ',
 'filepage.css' => '/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */',
@@ -2083,7 +2123,7 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 
 # Random page
 'randompage' => 'おまかせ表示',
-'randompage-nopages' => '次の{{PLURAL:$2|名前空間}}:$1には、ページがありません。',
+'randompage-nopages' => '以下の{{PLURAL:$2|名前空間}}にはページがありません:$1。',
 
 # Random redirect
 'randomredirect' => 'おまかせリダイレクト',
@@ -2107,7 +2147,7 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'statistics-views-peredit' => '1編集あたりの閲覧回数',
 'statistics-users' => '[[Special:ListUsers|利用者]]',
 'statistics-users-active' => '活動中の利用者',
-'statistics-users-active-desc' => '過去$1{{PLURAL:$1|日間}}に何らかの操作を行った利用者',
+'statistics-users-active-desc' => '過去 {{PLURAL:$1|$1 日間}}に何らかの操作をした利用者',
 'statistics-mostpopular' => '最も閲覧されているページ',
 
 'disambiguations' => '曖昧さ回避ページにリンクしているページ',
@@ -2120,8 +2160,8 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'doubleredirectstext' => 'これは他のリダイレクトページへのリダイレクトの一覧です。
 各行には、最初のリダイレクトと、その転送先のリダイレクト、そのまた転送先へのリンクが表示されています。多くの場合、最終の転送先が正しい転送先であり、最初のリダイレクトは直接最後の転送先に向けるべきです。
 <del>打ち消し線</del>のはいった項目は既に修正されています。',
-'double-redirect-fixed-move' => '[[$1]]ã\81\8c移å\8b\95ã\81\95ã\82\8cました。
-これからは[[$2]]に転送されます。',
+'double-redirect-fixed-move' => '[[$1]]ã\82\92移å\8b\95ã\81\97ました。
+今後は[[$2]]に転送されます。',
 'double-redirect-fixed-maintenance' => '[[$1]]から[[$2]]への二重転送を修正します。',
 'double-redirect-fixer' => '転送修正係',
 
@@ -2160,6 +2200,8 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'wantedpages' => 'ページが存在しないリンク',
 'wantedpages-badtitle' => '結果に不正なページ名が含まれています:$1',
 'wantedfiles' => 'ファイル情報ページが存在しないファイル',
+'wantedfiletext-cat' => '以下のファイルは使用されていますが存在しません。外部リポジトリ由来のファイルは、存在していてもここに列挙される場合があります。その場合は<del>取り消し線</del>が付きます。さらに、存在しないファイルを埋め込んでいるページは[[:$1]]に列挙されます。',
+'wantedfiletext-nocat' => '以下のファイルは使用されていますが存在しません。外部リポジトリ由来のファイルは、存在していてもここに列挙される場合があります。その場合は<del>取り消し線</del>が付きます。',
 'wantedtemplates' => '呼び出し先が存在しないテンプレート呼び出し',
 'mostlinked' => '被リンク数の多いページ',
 'mostlinkedcategories' => '被リンク数の多いカテゴリ',
@@ -2184,7 +2226,7 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'listusers' => '利用者の一覧',
 'listusers-editsonly' => '投稿記録のある利用者のみを表示',
 'listusers-creationsort' => '作成日順に整列',
-'usereditcount' => '$1回の編集',
+'usereditcount' => '$1{{PLURAL:$1|回の編集}}',
 'usercreated' => '$1 $2 に{{GENDER:$3|作成}}',
 'newpages' => '新しいページ',
 'newpages-username' => '利用者名:',
@@ -2193,7 +2235,7 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'movethispage' => 'このページを移動',
 'unusedimagestext' => '以下のファイルは存在していますが、どのページにも埋め込まれていません。
 ただし、他のウェブサイトが直接URLでファイルにリンクすることがあることに注意してください。以下のファイル一覧には、そのような形で利用中のファイルが含まれていることがあります。',
-'unusedcategoriestext' => '以下のカテゴリはページが存在しますが、他のどのページおよびカテゴリでも使れていません。',
+'unusedcategoriestext' => '以下のカテゴリはページが存在しますが、他のどのページおよびカテゴリでも使用されていません。',
 'notargettitle' => '対象が存在しません',
 'notargettext' => 'この機能の実行対象となるページまたは利用者が指定されていません。',
 'nopagetitle' => 'そのようなページはありません',
@@ -2215,10 +2257,10 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'speciallogtitlelabel' => '対象(ページまたは利用者):',
 'log' => '記録',
 'all-logs-page' => 'すべての公開記録',
-'alllogstext' => '{{SITENAME}}の取得可能な記録がまとめて表示されています。
+'alllogstext' => '{{SITENAME}}の取得できる記録をまとめて表示しています。
 記録の種類、実行した利用者(大文字小文字は区別)、影響を受けたページ(大文字小文字は区別)による絞り込みができます。',
-'logempty' => '該å½\93ã\81\99ã\82\8bè¨\98é\8c²ã\81\8cã\81¿ã\81¤ã\81\8bã\82\8aã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9f。',
-'log-title-wildcard' => 'この文字列で始まるページ名を検索する',
+'logempty' => '該å½\93ã\81\99ã\82\8bè¨\98é\8c²ã\81¯ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93。',
+'log-title-wildcard' => 'この文字列で始まるページ名を検索',
 
 # Special:AllPages
 'allpages' => '全ページ',
@@ -2237,11 +2279,17 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'allpagesbadtitle' => '指定したページ名は無効か、言語間またはウィキ間接頭辞を含んでいます。
 ページ名に使用できない文字が1つ以上含まれている可能性があります。',
 'allpages-bad-ns' => '{{SITENAME}}に「$1」という名前空間はありません。',
+'allpages-hide-redirects' => 'リダイレクトを隠す',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'このページのキャッシュされた版を表示しています。最大 $1経過しています。',
+'cachedspecial-viewing-cached-ts' => 'このページのキャッシュされた版を表示しています。現在の実際の版と異なる場合があります。',
+'cachedspecial-refresh-now' => '最新版を表示します。',
 
 # Special:Categories
 'categories' => 'カテゴリ',
-'categoriespagetext' => '以下の{{PLURAL:$1|カテゴリ}}にはページまたはメディアが存在します。
-[[Special:UnusedCategories|æ\9cªä½¿ç\94¨ã\81®ã\82«ã\83\86ã\82´ã\83ª]]ã\81¯ã\81\93ã\81\93ã\81«ã\81¯è¡¨ç¤ºã\81\95ã\82\8cていません。
+'categoriespagetext' => '以下の{{PLURAL:$1|カテゴリ}}にはページまたはメディアがあります。
+[[Special:UnusedCategories|æ\9cªä½¿ç\94¨ã\81®ã\82«ã\83\86ã\82´ã\83ª]]ã\81¯ã\81\93ã\81\93ã\81«ã\81¯è¡¨ç¤ºã\81\97ていません。
 [[Special:WantedCategories|望まれるカテゴリ]]も参照してください。',
 'categoriesfrom' => '最初に表示するカテゴリ:',
 'special-categories-sort-count' => '項目数順',
@@ -2271,8 +2319,8 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 
 # Special:ActiveUsers
 'activeusers' => '活動中の利用者一覧',
-'activeusers-intro' => 'これは過去$1{{PLURAL:$1|日|日間}}になんらかの活動をした利用者の一覧です。',
-'activeusers-count' => '過去$3{{PLURAL:$3|日|日間}}に$1回の{{PLURAL:$1|編集}}',
+'activeusers-intro' => 'これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。',
+'activeusers-count' => '過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の編集}}',
 'activeusers-from' => '最初に表示する利用者:',
 'activeusers-hidebots' => 'ボットを隠す',
 'activeusers-hidesysops' => '管理者を隠す',
@@ -2294,33 +2342,33 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'listgrouprights-members' => '(該当者一覧)',
 'listgrouprights-addgroup' => '{{PLURAL:$2|グループ}}を追加:$1',
 'listgrouprights-removegroup' => '{{PLURAL:$2|グループ}}を除去:$1',
-'listgrouprights-addgroup-all' => '全グループ追加可能',
-'listgrouprights-removegroup-all' => '全グループ除去可能',
-'listgrouprights-addgroup-self' => '自のアカウントに{{PLURAL:$2|グループ}}を追加:$1',
-'listgrouprights-removegroup-self' => '自のアカウントから{{PLURAL:$2|グループ}}を除去:$1',
-'listgrouprights-addgroup-self-all' => '自のアカウントに全グループを追加可能',
-'listgrouprights-removegroup-self-all' => '自のアカウントから全グループを除去可能',
+'listgrouprights-addgroup-all' => '全グループ追加可能',
+'listgrouprights-removegroup-all' => '全グループ除去可能',
+'listgrouprights-addgroup-self' => '自のアカウントに{{PLURAL:$2|グループ}}を追加:$1',
+'listgrouprights-removegroup-self' => '自のアカウントから{{PLURAL:$2|グループ}}を除去:$1',
+'listgrouprights-addgroup-self-all' => '自のアカウントに全グループを追加可能',
+'listgrouprights-removegroup-self-all' => '自のアカウントから全グループを除去可能',
 
 # E-mail user
 'mailnologin' => '送信アドレスがありません',
 'mailnologintext' => '他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。',
 'emailuser' => 'この利用者にメールを送信',
-'emailpage' => '利用者にメール送信',
-'emailpagetext' => 'ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\82\92é\80\9aã\81\98ã\81¦ã\80\81ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81«ã\83¡ã\83¼ã\83«ã\82\92é\80\81ã\82\8bã\81\93ã\81¨ã\81\8cできます。
-受信者が直接返事を出せるよう、[[Special:Preferences|利用者の個人設定]]で登録した電子メールアドレスがメール中で「差出人」アドレスとして表示されます。',
+'emailpage' => '利用者にメール送信',
+'emailpagetext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81«ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡できます。
+[[Special:Preferences|利用者の個人設定]]で入力したメール アドレスが「差出人」に設定され、受信者があなたに直接返信できるようになります。',
 'usermailererror' => 'メールが以下のエラーを返しました:',
-'defemailsubject' => '利用者「$1」からの {{SITENAME}} 電子メール',
+'defemailsubject' => '{{SITENAME}} 利用者「$1」からのメール',
 'usermaildisabled' => '利用者メール機能は無効になっています',
 'usermaildisabledtext' => 'このウィキ上で他の利用者へメールを送ることはできません。',
 'noemailtitle' => 'メールアドレスがありません',
 'noemailtext' => 'この利用者は有効なメールアドレスを登録していません。',
-'nowikiemailtitle' => '電子メール不許可',
+'nowikiemailtitle' => 'メールは許可されていません',
 'nowikiemailtext' => 'この利用者は他の利用者からメールを受け取らない設定にしています。',
 'emailnotarget' => '受信者の利用者名が存在しない、あるいは無効です。',
 'emailtarget' => '受信者の利用者名を入力してください',
 'emailusername' => '利用者名:',
 'emailusernamesubmit' => '送信',
-'email-legend' => '{{SITENAME}}の他の利用者に電子メールを送る',
+'email-legend' => '{{SITENAME}} の他の利用者にメールを送信',
 'emailfrom' => '差出人:',
 'emailto' => '宛先:',
 'emailsubject' => '件名:',
@@ -2328,9 +2376,9 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'emailsend' => '送信',
 'emailccme' => '自分宛に控えを送信する。',
 'emailccsubject' => '$1に送信したメールの控え:$2',
-'emailsent' => 'メールを送ました',
-'emailsenttext' => 'ã\83¡ã\83¼ã\83«ã\81¯ç\84¡äº\8bé\80\81ä¿¡ã\81\95ã\82\8cました。',
-'emailuserfooter' => 'この電子メールは$1から$2へ、{{SITENAME}}の「利用者へメールを送信」機能を使って送られました。',
+'emailsent' => 'メールを送信しました',
+'emailsenttext' => 'ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡ã\81\97ました。',
+'emailuserfooter' => 'このメールは {{SITENAME}} の「利用者にメール送信」機能が、「$1」から「$2」に送信したものです。',
 
 # User Messenger
 'usermessage-summary' => 'システムメッセージを残す。',
@@ -2363,13 +2411,13 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'watchmethod-list' => 'ウォッチされているページ内の最近の更新を確認中',
 'watchlistcontains' => 'ウォッチリストには、$1ページが登録されています。',
 'iteminvalidname' => '項目「$1」は問題があります、名前が不正です。',
-'wlnote' => "$3 $4までの{{PLURAL:$2|'''$2'''時間}}になされた'''$1'''件の変更は以下のとおりです。",
+'wlnote' => "$3 $4 までの{{PLURAL:$2|'''$2'''時間}}になされた{{PLURAL:$1|'''$1'''件の変更}}は以下の通りです。",
 'wlshowlast' => '次の期間で表示:$1時間、$2日間、$3',
 'watchlist-options' => 'ウォッチリストのオプション',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'ウォッチリストに追加しています・・・',
-'unwatching' => 'ウォッチリストから除去しています・・・',
+'watching' => 'ウォッチリストに追加中...',
+'unwatching' => 'ウォッチリストから除去中...',
 'watcherrortext' => 'ウォッチリストの「$1」の設定を変更中にエラーが発生しました。',
 
 'enotif_mailer' => '{{SITENAME}} 通知メール',
@@ -2379,12 +2427,12 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'changed' => '変更',
 'created' => '作成',
 'enotif_subject' => '{{SITENAME}}のページ「$PAGETITLE」が$PAGEEDITORによって$CHANGEDORCREATEDされました',
-'enotif_lastvisited' => 'æ\9c\80å¾\8cã\81«é\96²è¦§ã\81\97ã\81\9få¾\8cã\81«è¡\8cã\81ªã\82\8fã\82\8cã\81\9få\85¨ã\81¦ã\81®å¤\89æ\9b´ã\81¯ã\80\81 $1 ã\81§è¦\8bã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99。',
+'enotif_lastvisited' => 'æ\9c\80å¾\8cã\81«é\96²è¦§ã\81\97ã\81¦ä»¥é\99\8dã\81®ã\81\99ã\81¹ã\81¦ã\81®å¤\89æ\9b´ã\81¯ $1 ã\82\92ã\81\94覧ã\81\8fã\81 ã\81\95ã\81\84。',
 'enotif_lastdiff' => 'この変更内容を表示するには $1 をご覧ください。',
-'enotif_anon_editor' => '匿名利用者:$1',
+'enotif_anon_editor' => '匿名利用者「$1」',
 'enotif_body' => '$WATCHINGUSERNAMEさん
 
-{{SITENAME}}のページ$PAGETITLEが$PAGEEDITDATEに、$PAGEEDITORによって$CHANGEDORCREATEDされました。現在の版を見るには $PAGETITLE_URL をご覧ください。
+{{SITENAME}}のページ「$PAGETITLE」が$PAGEEDITDATEに、$PAGEEDITORによって$CHANGEDORCREATEDされました。現在の版を見るには $PAGETITLE_URL をご覧ください。
 
 $NEWPAGE
 
@@ -2419,7 +2467,7 @@ $UNWATCHURL
 'excontentauthor' => '内容:「$1」(投稿者は「[[Special:Contributions/$2|$2]]」のみ)',
 'exbeforeblank' => '白紙化前の内容:「$1」',
 'exblank' => '白紙ページ',
-'delete-confirm' => 'ã\80\8c$1ã\80\8dã\81®削除',
+'delete-confirm' => 'ã\80\8c$1ã\80\8dã\82\92削除',
 'delete-legend' => '削除',
 'historywarning' => "'''警告:'''削除しようとしているページには、約$1版の履歴があります:",
 'confirmdeletetext' => 'ページをすべての履歴とともに削除しようとしています。
@@ -2454,7 +2502,7 @@ $UNWATCHURL
 'cantrollback' => '編集を差し戻せません。
 最後の投稿者が、このページの唯一の作者です。',
 'alreadyrolled' => 'ページ[[:$1]]の[[User:$2|$2]]([[User talk:$2|トーク]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])による編集を巻き戻せません。
-他の利用者が、すでに編集あるいは巻き戻したためです。
+他の利用者が既に編集または巻き戻しを行ったためです。
 
 このページの最後の編集は[[User:$3|$3]]([[User talk:$3|トーク]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])によるものです。',
 'editcomment' => "編集内容の要約:「''$1''」",
@@ -2490,13 +2538,13 @@ $2による最後の版へ変更されました。',
 'protect-unchain-permissions' => '追加保護オプションをロック解除',
 'protect-text' => "ページ「'''$1'''」に対する保護レベルの表示と操作ができます。",
 'protect-locked-blocked' => "ブロック中は、保護レベルを変更できません。
-ページ'''$1'''の現在の状態は以下の通りです:",
+ページ「'''$1'''」の現在の状態は以下の通りです:",
 'protect-locked-dblock' => "データベースのロックが有効なため、保護レベルを変更できません。
-ページ'''$1'''の現在の状態は以下の通りです:",
+ページ「'''$1'''」の現在の状態は以下の通りです:",
 'protect-locked-access' => "アカウントに、ページの保護レベルを変更する権限がありません。
-ページ'''$1'''の現在の状態は以下の通りです:",
-'protect-cascadeon' => 'このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ}}から読み込まれているため、保護されています。
-このページの保護制限を変更することは可能ですが、カスケード保護には影響しません。',
+ページ「'''$1'''」の現在の状態は以下の通りです:",
+'protect-cascadeon' => 'このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、保護されています。
+このページの保護レベルを変更できますが、カスケード保護には影響しません。',
 'protect-default' => 'すべての利用者を許可',
 'protect-fallback' => '「$1」権限が必要',
 'protect-level-autoconfirmed' => '新規利用者と匿名利用者を禁止',
@@ -2541,11 +2589,11 @@ $2による最後の版へ変更されました。',
 'undeletepage' => '削除されたページの表示と復元',
 'undeletepagetitle' => "'''以下は、[[:$1]]の削除された版です'''。",
 'viewdeletedpage' => '削除されたページを表示',
-'undeletepagetext' => '以下の{{PLURAL:$1|ã\83\9aã\83¼ã\82¸}}ã\81¯å\89\8aé\99¤ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\81\8cã\80\81ä¿\9då­\98ç\89\88ã\81«æ®\8bã\81£ã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81復å\85\83ã\81§ã\81\8dã\81¾ã\81\99ã\80\82
+'undeletepagetext' => '以下の{{PLURAL:$1|å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸|å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ç¾¤}}ã\81¯ã\80\81ä¿\9då­\98ç\89\88ã\81«æ®\8bã\81£ã\81¦ã\81\84ã\82\8bã\81\9fã\82\81復å\85\83ã\81§ã\81\8dã\81¾ã\81\99ã\80\82
 保存版は定期的に消去される可能性があります。',
 'undelete-fieldset-title' => '削除された版の復元',
-'undeleteextrahelp' => "ã\81\99ã\81¹ã\81¦ã\81®ç\89\88ã\82\92復å\85\83ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\83\81ã\82§ã\83\83ã\82¯ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92ã\81©ã\82\8cã\82\82é\81¸æ\8a\9eã\81\97ていない状態で'''''{{int:undeletebtn}}'''''をクリックしてください。
\89¹å®\9aã\81®ç\89\88ã\82\92復帰ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81復帰ã\81\99ã\82\8bç\89\88ã\81®ã\83\81ã\82§ã\83\83ã\82¯ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92é\81¸æ\8a\9eã\81\97た状態で'''''{{int:undeletebtn}}'''''をクリックしてください。",
+'undeleteextrahelp' => "ã\81\99ã\81¹ã\81¦ã\81®ç\89\88ã\82\92復å\85\83ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\81©ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\82\82ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cていない状態で'''''{{int:undeletebtn}}'''''をクリックしてください。
\89¹å®\9aã\81®ç\89\88ã\82\92復帰ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81復帰ã\81\99ã\82\8bç\89\88ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cた状態で'''''{{int:undeletebtn}}'''''をクリックしてください。",
 'undeleterevisions' => '$1版が保存されています',
 'undeletehistory' => 'ページの復帰を行うと、すべての版が履歴に復帰します。
 削除されたあとに同じ名前で新しくページが作成されていた場合、復帰した版はそれに先行する履歴として現れます。',
@@ -2554,9 +2602,9 @@ $2による最後の版へ変更されました。',
 'undeletehistorynoadmin' => 'このページは削除されています。
 削除の理由は、削除前にこのページを編集していた利用者の詳細情報と共に、以下に表示されています。
 管理者以外の利用者には、削除された各版の本文への制限がかけられています。',
-'undelete-revision' => '$3によるページ$1の$4$5の削除版:',
-'undeleterevision-missing' => '不正な、あるいは存在しない版です。
-間違ったリンクを辿ったか、この版は既に復帰されたか、もしくは保存版から除去された可能性があります。',
+'undelete-revision' => 'ページ「$1」の、$3 が $4 $5 に削除した版:',
+'undeleterevision-missing' => '正しくないまたは存在しない版です。
+間違ったリンクをたどったか、この版は既に復帰されたか、もしくは保存版から除去された可能性があります。',
 'undelete-nodiff' => 'これより前の版はありません。',
 'undeletebtn' => '復元',
 'undeletelink' => '閲覧/復元',
@@ -2578,8 +2626,8 @@ $2による最後の版へ変更されました。',
 'undelete-search-prefix' => '表示を開始するページ名:',
 'undelete-search-submit' => '検索',
 'undelete-no-results' => '削除の保存版に、一致するページが見つかりませんでした。',
-'undelete-filename-mismatch' => '時刻印$1をもつファイルの版を復帰できません:ファイル名が一致しません',
-'undelete-bad-store-key' => '時刻印$1をもつファイルの版を復帰できません:削除前にファイルが失われています。',
+'undelete-filename-mismatch' => 'ファイルの時刻印$1の版を復帰できません:ファイル名が一致しません。',
+'undelete-bad-store-key' => 'ファイルの時刻印$1の版を復帰できません:削除前にファイルが失われています。',
 'undelete-cleanup-error' => '未使用の保存版のファイル「$1」の削除中にエラーが発生しました。',
 'undelete-missing-filearchive' => 'データベースに存在しないため、ID$1を持つファイルの保存版を復元できません。
 既に復帰されている可能性があります。',
@@ -2594,9 +2642,9 @@ $1',
 # Namespace form on various pages
 'namespace' => '名前空間:',
 'invert' => '選択したものを除く',
-'tooltip-invert' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ï¼\88ã\81\8aã\82\88ã\81³ã\80\81ã\83\81ã\82§ã\83\83ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\80\81é\96¢é\80£ã\81¥ã\81\91ã\82\89ã\82\8cã\81\9få\90\8då\89\8d空é\96\93ï¼\89ã\81®ã\83\9aã\83¼ã\82¸ã\81®å¤\89æ\9b´ã\82\92é\9d\9e表示ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83\81ã\82§ã\83\83ã\82¯ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92ã\82ªã\83³ã\81«ã\81\97ます。',
+'tooltip-invert' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ï¼\88ã\83\81ã\82§ã\83\83ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81\9få\90\8då\89\8d空é\96\93ã\82\82ï¼\89ã\81®ã\83\9aã\83¼ã\82¸ã\81®å¤\89æ\9b´ã\82\92é\9d\9e表示ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cます。',
 'namespace_association' => '対応付けられた名前空間',
-'tooltip-namespace_association' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81¦ã\81\84ã\82\8bã\80\81è­°è«\96ã\83\9aã\83¼ã\82¸ã\81¾ã\81\9fã\81¯å¯¾è±¡ã\81®å\90\8då\89\8d空é\96\93ã\82\82å\90«ã\82\81ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92ã\83\81ã\82§ã\83\83ã\82¯',
+'tooltip-namespace_association' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81¦ã\81\84ã\82\8bã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81¾ã\81\9fã\81¯å¯¾è±¡ã\81®å\90\8då\89\8d空é\96\93ã\82\82å\90«ã\82\81ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cã\82\8b',
 'blanknamespace' => '(標準)',
 
 # Contributions
@@ -2669,7 +2717,7 @@ $1',
 ** 複数アカウントの不正利用
 ** 不適切な利用者名',
 'ipb-hardblock' => 'ログインしている利用者によるこのIPアドレスからの編集を不許可',
-'ipbcreateaccount' => 'アカウント作成を禁止する',
+'ipbcreateaccount' => 'アカウント作成を禁止',
 'ipbemailban' => 'メール送信を防止',
 'ipbenableautoblock' => 'この利用者が最後に使用したIPアドレスと、後に編集しようとしたIPアドレスを自動的にブロック',
 'ipbsubmit' => 'この利用者をブロック',
@@ -2679,21 +2727,21 @@ $1',
 'ipbotherreason' => '他の、または追加の理由:',
 'ipbhidename' => '利用者名を編集履歴や各種一覧から秘匿する',
 'ipbwatchuser' => 'この利用者の利用者ページとトークページをウォッチする',
-'ipb-disableusertalk' => 'この利用者がブロック中に自身のトークページを編集することを不許可',
+'ipb-disableusertalk' => 'この利用者がブロック中に自分のトークページを編集するのを不許可',
 'ipb-change-block' => 'これらの設定で、利用者を再びブロック',
 'ipb-confirm' => 'ブロックの確認',
 'badipaddress' => '不正なIPアドレス',
 'blockipsuccesssub' => 'ブロックしました',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]をブロックしました。<br />
-[[Special:BlockList|投稿ブロック中の利用者やIPアドレス]]を参照してください。',
-'ipb-blockingself' => '自分自身をブロックしようとしています。本当に実行しますか',
-'ipb-confirmhideuser' => '利用者名の秘匿を有効にしてブロックしようとしています。実行すると、すべてのリストやログにおいて利用者名が非表示になります。本当にこれでよろしいですか。',
+[[Special:BlockList|ブロックの一覧]]を参照してください。',
+'ipb-blockingself' => '自分自身をブロックしようとしています。本当に実行しますか?',
+'ipb-confirmhideuser' => '秘匿が有効になっている利用者をブロックしようとしています。実行すると、すべてのリストやログでこの利用者名が表示されません。本当に実行しますか?',
 'ipb-edit-dropdown' => 'ブロック理由を編集する',
 'ipb-unblock-addr' => '$1のブロックを解除',
 'ipb-unblock' => '利用者またはIPアドレスのブロックを解除する',
 'ipb-blocklist' => '現在有効なブロックを表示',
 'ipb-blocklist-contribs' => '$1の投稿の一覧',
-'unblockip' => 'ブロックを解除する',
+'unblockip' => 'ブロックを解除',
 'unblockiptext' => '以下のフォームで利用者またはIPアドレスの投稿ブロックを解除できます。',
 'ipusubmit' => 'この投稿ブロックを解除',
 'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
@@ -2705,8 +2753,8 @@ $1',
 'blocklist-userblocks' => 'アカウントのブロックを非表示',
 'blocklist-tempblocks' => '有期ブロックを非表示',
 'blocklist-addressblocks' => '単一IPのブロックを非表示',
-'blocklist-rangeblocks' => 'レンジブロックを非表示',
-'blocklist-timestamp' => 'タイムスタンプ',
+'blocklist-rangeblocks' => '範囲ブロックを非表示',
+'blocklist-timestamp' => '時刻印',
 'blocklist-target' => '対象',
 'blocklist-expiry' => '期限',
 'blocklist-by' => 'ブロックした管理者',
@@ -2721,14 +2769,14 @@ $1',
 'noautoblockblock' => '自動ブロック無効',
 'createaccountblock' => 'アカウント作成のブロック',
 'emailblock' => 'メール送信のブロック',
-'blocklist-nousertalk' => '自身のトークページ編集禁止',
+'blocklist-nousertalk' => '自分のトークページの編集禁止',
 'ipblocklist-empty' => 'ブロック一覧は空です。',
 'ipblocklist-no-results' => '指定されたIPアドレスまたは利用者名はブロックされていません。',
 'blocklink' => 'ブロック',
 'unblocklink' => 'ブロックを解除',
 'change-blocklink' => '設定を変更',
 'contribslink' => '投稿記録',
-'emaillink' => '電子メールを送る',
+'emaillink' => 'メールを送信',
 'autoblocker' => '使用中のIPアドレスが「[[User:$1|$1]]」に使用されたため、自動ブロックされています。
 $1のブロックの理由は「$2」です。',
 'blocklogpage' => 'ブロック記録',
@@ -2746,7 +2794,7 @@ $1のブロックの理由は「$2」です。',
 'block-log-flags-nocreate' => 'アカウント作成のブロック',
 'block-log-flags-noautoblock' => '自動ブロック無効',
 'block-log-flags-noemail' => 'メール送信のブロック',
-'block-log-flags-nousertalk' => '自のトークページの編集禁止',
+'block-log-flags-nousertalk' => '自のトークページの編集禁止',
 'block-log-flags-angry-autoblock' => '拡張自動ブロック有効',
 'block-log-flags-hiddenname' => '利用者名の秘匿',
 'range_block_disabled' => '範囲ブロックを作成する管理者機能は無効化されています。',
@@ -2754,11 +2802,10 @@ $1のブロックの理由は「$2」です。',
 'ipb_expiry_temp' => '利用者名秘匿のブロックは、無期限ブロックになります。',
 'ipb_hide_invalid' => 'このアカウントを秘匿できません。編集回数が非常に多いためだと思われます。',
 'ipb_already_blocked' => '「$1」は既にブロックされています',
-'ipb-needreblock' => '$1は、すでにブロックされています。
-設定を変更しますか?',
+'ipb-needreblock' => '$1 は既にブロックされています。設定を変更しますか?',
 'ipb-otherblocks-header' => 'その他の{{PLURAL:$1|ブロック}}',
 'unblock-hideuser' => '利用者名が隠されているため、この利用者のブロックを解除できません。',
-'ipb_cant_unblock' => 'エラー:ブロックID$1が見つかりません。
+'ipb_cant_unblock' => 'エラー:ブロック ID $1 がありません。
 ブロックが既に解除されている可能性があります。',
 'ipb_blocked_as_range' => 'エラー:IPアドレス$1は直接ブロックされておらず、ブロックを解除できませんでした。
 ただし、$2の範囲でブロックされており、こちらの設定を変更することでブロック解除できます。',
@@ -2776,28 +2823,28 @@ $1のブロックの理由は「$2」です。',
 'cant-block-while-blocked' => 'ブロック中は、他の利用者をブロックできません。',
 'cant-see-hidden-user' => '投稿ブロックしようとした利用者は、既にブロックされ隠されています。
 hideuser権限を持っていないため、この利用者のブロックを閲覧または編集できません。',
-'ipbblocked' => '自身がブロックされているため、他の利用者のブロックやブロック解除をすることはできません',
-'ipbnounblockself' => 'è\87ªå\88\86è\87ªèº«ã\81«å¯¾ã\81\99ã\82\8bã\83\96ã\83­ã\83\83ã\82¯ã\82\92解é\99¤ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯できません',
+'ipbblocked' => '自分をブロックしているため、他の利用者のブロックやブロック解除はできません',
+'ipbnounblockself' => 'è\87ªå\88\86è\87ªèº«ã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\81¯è§£é\99¤できません',
 
 # Developer tools
-'lockdb' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ロック',
+'lockdb' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ロック',
 'unlockdb' => 'データベースのロック解除',
 'lockdbtext' => 'データベースをロックするとすべての利用者はページの編集や、個人設定の変更、ウォッチリストの編集、その他データベースでの変更を要求する作業ができなくなります。
 本当にデータベースをロックしていいかどうか確認し、メンテナンスが終了したらロックを解除してください。',
 'unlockdbtext' => 'データベースのロックを解除すると、すべての利用者がページの編集や、個人設定の変更、ウォッチリストの編集、その他データベースでの変更を要求する作業ができるようになります。
 本当にデータベースのロックを解除していいかどうか確認してください。',
 'lockconfirm' => '本当にデータベースをロックする。',
-'unlockconfirm' => 'æ\9c¬å½\93ã\81«ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83­ã\83\83ã\82¯ã\82\92解é\99¤ã\81\99ã\82\8b。',
+'unlockconfirm' => 'æ\9c¬å½\93ã\81«ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83­ã\83\83ã\82¯ã\82\92解é\99¤ã\81\97ã\81¾ã\81\99。',
 'lockbtn' => 'データベースをロック',
 'unlockbtn' => 'データベースのロックを解除',
-'locknoconfirm' => '確èª\8dã\83\9cã\83\83ã\82¯ã\82¹ã\81\8cã\83\81ã\82§ã\83\83ã\82¯ã\81\95ã\82\8cていません。',
+'locknoconfirm' => '確èª\8dã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\81\8cå\85¥ã\81£ていません。',
 'lockdbsuccesssub' => 'データベースのロックに成功しました',
 'unlockdbsuccesssub' => 'データベースのロックを除去しました',
 'lockdbsuccesstext' => 'データベースはロックされました。<br />
 メンテナンスが完了したら、忘れずに[[Special:UnlockDB|ロックを除去]]してください。',
 'unlockdbsuccesstext' => 'データベースのロックは解除されました。',
-'lockfilenotwritable' => 'データベースのロックファイルは書き込み不可です。
-データベースをロックまたは解除するには、ウェブサーバーにより書き込み可能である必要があります。',
+'lockfilenotwritable' => 'データベースのロック ファイルが書き込み禁止です。
+データベースをロックまたはロック解除するには、ウェブ サーバーがこれに書き込める必要があります。',
 'databasenotlocked' => 'データベースはロックされていません。',
 'lockedbyandtime' => '($1 が $2 $3 から)',
 
@@ -2809,7 +2856,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 変更前のページへのリダイレクトは自動的に修正することができます。
 自動的な修正を選択しない場合は、[[Special:DoubleRedirects|二重リダイレクト]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。リンクを正しく維持するのはあなたの責任です。
 
-移動先がすでに存在する場合には、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
+移動先が既に存在する場合は、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
 
 '''注意!'''
 よく閲覧されるページや、他の多くのページからリンクされているページを移動すると予期せぬ結果が起こるかもしれません。ページの移動に伴う影響をよく考えてから踏み切るようにしてください。",
@@ -2818,7 +2865,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 自動的な修正を選択しない場合は、[[Special:DoubleRedirects|二重リダイレクト]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。
 つながるべき場所にリンクがつながるよう維持するのは移動した人の責任です。
 
-移動先がすでに存在する場合には、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。
+移動先が既に存在する場合は、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。
 つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
 
 '''警告!'''
@@ -2851,24 +2898,24 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 手動で統合してください。'''",
 'movedto' => '移動先:',
 'movetalk' => '付随するトークページも移動',
-'move-subpages' => '下位ページも移動する($1ページまで)',
-'move-talk-subpages' => 'トークページの下位ページも移動する($1個まで)',
-'movepage-page-exists' => 'ページ$1は既に存在するため、自動的に上書きされませんでした。',
-'movepage-page-moved' => 'ページ$1は$2へ移動されました。',
-'movepage-page-unmoved' => 'ページ$1は$2へ移動できませんでした。',
-'movepage-max-pages' => '自動的に移動できる{{PLURAL:$1|ページ}}は $1件までで、それ以上は移動されません。',
+'move-subpages' => '下位ページも移動($1ページまで)',
+'move-talk-subpages' => 'トークページの下位ページも移動($1個まで)',
+'movepage-page-exists' => 'ページ「$1」は既に存在するため、自動的な上書きはできませんでした。',
+'movepage-page-moved' => 'ページ「$1」は「$2」に移動しました。',
+'movepage-page-unmoved' => 'ページ「$1」は「$2」に移動できませんでした。',
+'movepage-max-pages' => '自動的に移動できるのは $1 {{PLURAL:$1|ページ}}までで、それ以上は移動されません。',
 'movelogpage' => '移動記録',
-'movelogpagetext' => '以下はてのページ移動の一覧です。',
+'movelogpagetext' => '以下はすべてのページ移動の一覧です。',
 'movesubpage' => '{{PLURAL:$1|下位ページ}}',
-'movesubpagetext' => 'このページには、以下に示す$1下位ページがあります。',
+'movesubpagetext' => 'このページには{{PLURAL:$1|下位ページ}}が以下の $1 件あります。',
 'movenosubpage' => 'このページに下位ページはありません。',
 'movereason' => '理由:',
 'revertmove' => '差し戻し',
-'delete_and_move' => '削除して移動する',
+'delete_and_move' => '削除して移動',
 'delete_and_move_text' => '== 削除が必要です ==
 移動先「[[:$1]]」は既に存在しています。
-移å\8b\95ã\81\99ã\82\8bためにこのページを削除しますか?',
-'delete_and_move_confirm' => 'ページを削除します',
+移å\8b\95ã\81®ためにこのページを削除しますか?',
+'delete_and_move_confirm' => 'ã\81¯ã\81\84ã\80\81ã\83\9aã\83¼ã\82¸ã\82\92å\89\8aé\99¤ã\81\97ã\81¾ã\81\99',
 'delete_and_move_reason' => '「[[$1]]」からの移動のために削除',
 'selfmove' => '移動元と移動先のページ名が同じです。
 自分自身へは移動できません。',
@@ -2881,21 +2928,21 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'nonfile-cannot-move-to-file' => 'ファイルでないものを、ファイル名前空間に移動することはできません',
 'imagetypemismatch' => '新しいファイルの拡張子がファイルのタイプと一致していません。',
 'imageinvalidfilename' => '対象ファイル名が不正です',
-'fix-double-redirects' => 'このページへのリダイレクトがあればそのリダイレクトを修正する',
+'fix-double-redirects' => 'このページへのリダイレクトがあればそのリダイレクトを修正',
 'move-leave-redirect' => '移動元にリダイレクトを作成する',
-'protectedpagemovewarning' => "'''警告:'''このページは保護されているため、管理者権限をつ利用者のみが移動できます。
+'protectedpagemovewarning' => "'''警告:'''このページは保護されているため、管理者権限をつ利用者のみが移動できます。
 参考として以下に一番最後の記録を表示します:",
-'semiprotectedpagemovewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81\97ã\81\8b移å\8b\95ã\81§ã\81\8dã\81¾ã\81\9bã\82\93
+'semiprotectedpagemovewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8c移å\8b\95ã\81§ã\81\8dã\81¾ã\81\99
 参考として以下に一番最後の記録を表示します:",
 'move-over-sharedrepo' => '== ファイルが存在します ==
-[[:$1]]は共有リポジトリ上に存在します。ファイルをこの名前に移動すると共有ファイルを上書きします。',
-'file-exists-sharedrepo' => '選ばれたファイル名は既に共有リポジトリー上で使われています。
+[[:$1]]は共有リポジトリ上に存在します。ファイルをこの名前に移動すると共有ファイルを上書きします。',
+'file-exists-sharedrepo' => '選ばれたファイル名は既に共有リポジトリ上で使用されています。
 別の名前を選んでください。',
 
 # Export
 'export' => 'ページの書き出し',
 'exporttext' => 'ここでは単独あるいは複数のページの本文と編集履歴を、XMLの形で書き出すことができます。
-このXMLは、他のMediaWikiを使用しているウィキで[[Special:Import|取り込みページ]]を使て取り込むことができます。
+このXMLは、他のMediaWikiを使用しているウィキで[[Special:Import|取り込みページ]]を使用して取り込むことができます。
 
 ページを書き出すには、下の入力ボックスに一行に一つずつ書き出したいページの名前を記入してください。また、編集履歴とともにすべての過去版を含めて書き出すのか、最新版のみを書き出すのか選択してください。
 
@@ -2911,7 +2958,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'export-addnstext' => '名前空間からページを追加:',
 'export-addns' => '追加',
 'export-download' => 'ファイルとして保存',
-'export-templates' => 'ã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\82\82含める',
+'export-templates' => 'ã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\82\92含める',
 'export-pagelinks' => '以下の階層までのリンク先ページを含める:',
 
 # Namespace 8 related
@@ -2919,8 +2966,8 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'allmessagesname' => '名前',
 'allmessagesdefault' => '既定のメッセージ文',
 'allmessagescurrent' => '現在のメッセージ文',
-'allmessagestext' => 'これはMediaWiki名前空間で利用可能なシステムメッセージの一覧です。
-一般的なMediaWikiの地域化に貢献したい場合は、[//www.mediawiki.org/wiki/Localisation MediaWikiの地域化]や[//translatewiki.net?setlang=ja translatewiki.net]を訪れてみてください。',
+'allmessagestext' => 'これは MediaWiki 名前空間で利用できるシステム メッセージの一覧です。
+MediaWiki 全般のローカライズ(地域化)に貢献したい場合は、[//www.mediawiki.org/wiki/Localisation/ja MediaWiki のローカライズ] や [//translatewiki.net?setlang=ja translatewiki.net] をご覧ください。',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages'''が無効なので、このページを使うことはできません。",
 'allmessages-filter-legend' => '絞り込み',
 'allmessages-filter' => '変更状態により絞り込む:',
@@ -2937,6 +2984,8 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'thumbnail_error' => 'サムネイルの作成中にエラーが発生しました:$1',
 'djvu_page_error' => 'DjVuページが範囲外です',
 'djvu_no_xml' => 'DjVuファイルのXMLデータを取得できません',
+'thumbnail-temp-create' => '一時的なサムネイルファイルを作成できません',
+'thumbnail-dest-create' => 'サムネイルを保存先に保存できません',
 'thumbnail_invalid_params' => 'サムネイル引数が不正です',
 'thumbnail_dest_directory' => '出力ディレクトリを作成できません',
 'thumbnail_image-type' => '対応していない画像形式です',
@@ -2947,8 +2996,8 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'import' => 'ページデータの取り込み',
 'importinterwiki' => 'ウィキ間移動の取り込み',
 'import-interwiki-text' => '取り込むウィキとページ名を選択してください。
-版の日付と編集者ã\81®å\90\8då\89\8dã\81¯ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82
-全てのウィキ間移動取り込みの操作は[[Special:Log/import|取り込み記録]]に記録されます。',
+版の日付と編集者å\90\8dã\81¯ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82
+ウィキ間移動のすべての取り込み操作は[[Special:Log/import|取り込み記録]]に記録されます。',
 'import-interwiki-source' => '取り込み元のウィキ/ページ:',
 'import-interwiki-history' => 'このページのすべての版を複製する',
 'import-interwiki-templates' => 'すべてのテンプレートを含める',
@@ -2956,12 +3005,12 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'import-interwiki-namespace' => '目的の名前空間:',
 'import-upload-filename' => 'ファイルの名前:',
 'import-comment' => 'コメント:',
-'importtext' => '元のウィキで[[Special:Export|書き出し機能]]を使てファイルに書き出してください。
+'importtext' => '元のウィキで[[Special:Export|書き出し機能]]を使用してファイルに書き出してください。
 それをコンピューターに保存した後、こちらへアップロードしてください。',
-'importstart' => 'ã\83\9aã\83¼ã\82¸ã\82\92å\8f\96ã\82\8aè¾¼ã\82\93ã\81§ã\81\84ã\81¾ã\81\99ã\83»ã\83»ã\83»',
+'importstart' => 'ã\83\9aã\83¼ã\82¸ã\82\92å\8f\96ã\82\8aè¾¼ã\81¿ä¸­...',
 'import-revision-count' => '$1版',
 'importnopages' => '取り込むページがありません。',
-'imported-log-entries' => '$1件の{{PLURAL:$1|記録項目}}を取り込みました。',
+'imported-log-entries' => '$1 件の{{PLURAL:$1|記録項目}}を取り込みました。',
 'importfailed' => '取り込みに失敗しました:<nowiki>$1</nowiki>',
 'importunknownsource' => '取り込み元のタイプが不明です',
 'importcantopen' => '取り込みファイルが開けませんでした',
@@ -2972,7 +3021,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'importnosources' => 'ウィキ間移動の取り込み元が定義されていないため、履歴の直接アップロードは無効になっています。',
 'importnofile' => 'ファイルがアップロードされませんでした',
 'importuploaderrorsize' => '取り込みファイルのアップロードに失敗しました。
\83\95ã\82¡ã\82¤ã\83«ã\81¯ã\80\81ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89å\8f¯è\83½ã\81ªサイズを超えています。',
\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\80\81ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\8dã\82\8bサイズを超えています。',
 'importuploaderrorpartial' => '取り込みファイルのアップロードに失敗しました。
 ファイルの一部のみアップロードされました。',
 'importuploaderrortemp' => '取り込みファイルのアップロードに失敗しました。
@@ -2987,6 +3036,9 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'import-invalid-interwiki' => '指定されたウィキから取り込めませんでした。',
 'import-error-edit' => 'あなたにそのページを編集する許可がないため、ページ「$1」は取り込まれませんでした。',
 'import-error-create' => 'あなたにそのページを作成する許可がないため、ページ「$1」は取り込まれませんでした。',
+'import-error-interwiki' => '名前が外部リンク (interwiki) に予約されているためページ「$1」をインポートしませんでした。',
+'import-error-special' => 'ページ「$1」は、ページが許可されない特別名前空間に属しているためインポートしません。',
+'import-error-invalid' => '名前が正しくないため、ページ「$1」をインポートしませんでした。',
 
 # Import log
 'importlogpage' => '取り込み記録',
@@ -2999,6 +3051,13 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 # JavaScriptTest
 'javascripttest' => 'JavaScript をテスト中',
 'javascripttest-disabled' => 'この機能はこのウィキでは有効にされていません。',
+'javascripttest-title' => '$1 のテストの実行',
+'javascripttest-pagetext-noframework' => 'このページは JavaScript のテストを実行するために予約されています。',
+'javascripttest-pagetext-unknownframework' => '未知のテストフレームワーク「$1」。',
+'javascripttest-pagetext-frameworks' => '次のテストフレームワークからひとつを選択してください:$1',
+'javascripttest-pagetext-skins' => 'テストを実行する外装を選択してください:',
+'javascripttest-qunit-intro' => 'mediawiki.org上の[$1 テストのドキュメント]を参照してください。',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit テストスイート',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => '自分の利用者ページ',
@@ -3011,9 +3070,9 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'tooltip-pt-login' => 'ログインすることが推奨されます。ただし、必須ではありません。',
 'tooltip-pt-anonlogin' => 'ログインすることが推奨されます。ただし、必須ではありません。',
 'tooltip-pt-logout' => 'ログアウト',
-'tooltip-ca-talk' => '記事についての議論',
-'tooltip-ca-edit' => 'このページを編集できます。保存する前にプレビューボタンを使てください。',
-'tooltip-ca-addsection' => '新しい節を開始する',
+'tooltip-ca-talk' => '本文ページについての議論',
+'tooltip-ca-edit' => 'このページを編集できます。保存する前にプレビューボタンを使用してください。',
+'tooltip-ca-addsection' => '新しい節を開始',
 'tooltip-ca-viewsource' => 'このページは保護されています。
 ページのソースを閲覧できます。',
 'tooltip-ca-history' => 'このページの過去の版',
@@ -3040,12 +3099,12 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'tooltip-feed-rss' => 'このページのRSSフィード',
 'tooltip-feed-atom' => 'このページのAtomフィード',
 'tooltip-t-contributions' => 'この利用者の投稿の一覧を表示',
-'tooltip-t-emailuser' => 'この利用者に電子メールを送信',
+'tooltip-t-emailuser' => 'この利用者にメールを送信',
 'tooltip-t-upload' => 'ファイルをアップロード',
 'tooltip-t-specialpages' => '特別ページの一覧',
 'tooltip-t-print' => 'このページの印刷用ページ',
 'tooltip-t-permalink' => 'このページのこの版への固定リンク',
-'tooltip-ca-nstab-main' => '本文を表示',
+'tooltip-ca-nstab-main' => '本文を閲覧',
 'tooltip-ca-nstab-user' => '利用者ページを表示',
 'tooltip-ca-nstab-media' => 'メディアページを表示',
 'tooltip-ca-nstab-special' => 'これは特別ページです。編集することはできません。',
@@ -3054,11 +3113,11 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'tooltip-ca-nstab-mediawiki' => 'システムメッセージを表示',
 'tooltip-ca-nstab-template' => 'テンプレートを表示',
 'tooltip-ca-nstab-help' => 'ヘルプページを表示',
-'tooltip-ca-nstab-category' => 'カテゴリページを表示',
-'tooltip-minoredit' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92ç´°é\83¨ã\81®å¤\89æ\9b´ã\81¨ã\83\9eã\83¼ã\82¯',
+'tooltip-ca-nstab-category' => 'カテゴリページを閲覧',
+'tooltip-minoredit' => 'ã\81\93ã\81®ç·¨é\9b\86ã\81«ç´°é\83¨ã\81®å¤\89æ\9b´ã\81®å\8d°ã\82\92ä»\98ã\81\91ã\82\8b',
 'tooltip-save' => '変更を保存',
 'tooltip-preview' => '変更をプレビューで確認できます。保存前に使用してください!',
-'tooltip-diff' => 'æ\96\87ç« ã\81«å\8a ã\81\88ã\81\9få¤\89æ\9b´ã\82\92表示ã\81\97ã\81¾ã\81\99',
+'tooltip-diff' => 'æ\96\87ç« ã\81¸ã\81®å¤\89æ\9b´ã\82\92表示',
 'tooltip-compareselectedversions' => '選択された二つの版の差分を表示します。',
 'tooltip-watch' => 'このページをウォッチリストへ追加します',
 'tooltip-watchlistedit-normal-submit' => 'タイトルを削除',
@@ -3106,16 +3165,16 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'group-bureaucrat.js' => '/* ここにあるすべてのJavaScriptは、ビューロクラットのみに対して読み込まれます */',
 
 # Metadata
-'notacceptable' => 'ウィキサーバーは、使用中のクライアントが読める形式での情報を、提供できません。',
+'notacceptable' => 'ウィキサーバーは、ご使用中のクライアントが読める形式では情報を提供できません。',
 
 # Attribution
 'anonymous' => '{{SITENAME}}の匿名{{PLURAL:$1|利用者}}',
-'siteuser' => '{{SITENAME}}の利用者$1',
-'anonuser' => '{{SITENAME}}の匿名利用者$1',
+'siteuser' => '{{SITENAME}}の利用者 $1',
+'anonuser' => '{{SITENAME}}の匿名利用者 $1',
 'lastmodifiedatby' => 'このページの最終更新は $1 $2 に $3 によって行われました。',
-'othercontribs' => 'また、最終更新前に $1 が編集しました。',
+'othercontribs' => 'また、最終更新より前に $1 が編集しました。',
 'others' => 'その他',
-'siteusers' => '{{SITENAME}}の{{PLURAL:$2|利用者}}$1',
+'siteusers' => '{{SITENAME}}の{{PLURAL:$2|利用者}} $1',
 'anonusers' => '{{SITENAME}}の匿名{{PLURAL:$2|利用者}} $1',
 'creditspage' => 'ページの帰属表示',
 'nocredits' => 'このページに対する帰属情報がありません。',
@@ -3124,7 +3183,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'spamprotectiontitle' => 'スパム防御フィルター',
 'spamprotectiontext' => '保存しようとした文章はスパムフィルターによってブロックされました。
 これはおそらく、ブラックリストにある外部サイトへのリンクが原因で発生します。',
-'spamprotectionmatch' => '以ä¸\8bã\81¯ã\80\81ã\82¹ã\83\91ã\83 ã\83\95ã\82£ã\83«ã\82¿ã\83¼ã\81\8cç\99ºå\8b\95ã\81\97ã\81\9fæ\96\87ç« です:$1',
+'spamprotectionmatch' => '以ä¸\8bã\81®æ\96\87ç« ã\81¯ã\82¹ã\83\91ã\83 ã\83\95ã\82£ã\83«ã\82¿ã\83¼ã\81\8cç\99ºå\8b\95ã\81\97ã\81\9fã\82\82ã\81®です:$1',
 'spambot_username' => 'MediaWikiスパム除去',
 'spam_reverting' => '$1へのリンクを含まない最新の版に差し戻し',
 'spam_blanking' => 'すべての版が$1へのリンクを含んでいます。白紙化します。',
@@ -3161,8 +3220,8 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'rcpatroldisabled' => '最近の更新の巡回は無効です',
 'rcpatroldisabledtext' => '最近の更新の巡回機能は現在無効になっています。',
 'markedaspatrollederror' => '巡回済みにできません。',
-'markedaspatrollederrortext' => 'å·¡å\9b\9eæ¸\88ã\81¿ã\81«ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\81¯ã\81©ã\81®ç\89\88ã\81\8bを指定する必要があります。',
-'markedaspatrollederror-noautopatrol' => '自分自身による編集を巡回済みにする権限がありません。',
+'markedaspatrollederrortext' => 'å·¡å\9b\9eæ¸\88ã\81¿ã\81«ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\81¯ã\80\81ç\89\88を指定する必要があります。',
+'markedaspatrollederror-noautopatrol' => '自分編集を巡回済みにする権限がありません。',
 
 # Patrol log
 'patrol-log-page' => '巡回記録',
@@ -3190,28 +3249,28 @@ $1',
 'imagemaxsize' => "画像のサイズ制限:<br />''(ファイルページに対する)''",
 'thumbsize' => 'サムネイルの大きさ:',
 'widthheight' => '$1 × $2',
-'widthheightpage' => '$1×$2、$3ページ',
+'widthheightpage' => '$1×$2、$3 {{PLURAL:$3|ページ}}',
 'file-info' => 'ファイルサイズ:$1、MIMEタイプ:$2',
-'file-info-size' => '$1×$2ピクセル、ファイルサイズ:$3、MIMEタイプ:$4',
-'file-info-size-pages' => '$1 × $2 ピクセル、ファイルサイズ: $3、MIMEタイプ: $4、$5ページ{{PLURAL:$5}}。',
+'file-info-size' => '$1×$2 ピクセル、ファイルサイズ:$3、MIMEタイプ:$4',
+'file-info-size-pages' => '$1×$2 ピクセル、ファイルサイズ:$3、MIMEタイプ:$4、$5 {{PLURAL:$5|ページ}}',
 'file-nohires' => '高解像度版はありません。',
-'svg-long-desc' => 'SVGファイル、$1×$2ピクセル、ファイルサイズ:$3',
+'svg-long-desc' => 'SVG ファイル、$1×$2 ピクセル、ファイルサイズ:$3',
 'show-big-image' => '高解像度での画像',
-'show-big-image-preview' => 'このプレビューのサイズ$1。',
-'show-big-image-other' => 'その他の{{PLURAL:$2|解像度}}$1。',
-'show-big-image-size' => '$1 × $2 ピクセル',
+'show-big-image-preview' => 'このプレビューのサイズ$1。',
+'show-big-image-other' => 'その他の{{PLURAL:$2|解像度}}$1。',
+'show-big-image-size' => '$1×$2 ピクセル',
 'file-info-gif-looped' => 'ループします',
-'file-info-gif-frames' => '$1フレーム',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|フレーム}}',
 'file-info-png-looped' => '繰り返し',
-'file-info-png-repeat' => '$1回再生しました',
-'file-info-png-frames' => '$1フレーム',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|回再生しました}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|フレーム}}',
 
 # Special:NewFiles
 'newimages' => '新しいファイルのギャラリー',
-'imagelisttext' => "以下は、$2で並び替えられた'''$1'''ファイルの一覧です。",
-'newimages-summary' => 'この特別ページでは最近、アップロードされたファイルを表示します。',
+'imagelisttext' => "以下は、'''$1'''ファイルの$2で並び替えられた一覧です。",
+'newimages-summary' => 'この特別ページでは、最近アップロードされたファイルを表示します。',
 'newimages-legend' => '絞り込み',
-'newimages-label' => 'ã\83\95ã\82¡ã\82¤ã\83«å\90\8dï¼\88ã\82\82ã\81\97ã\81\8fはその一部):',
+'newimages-label' => 'ã\83\95ã\82¡ã\82¤ã\83«å\90\8dï¼\88ã\81¾ã\81\9fはその一部):',
 'showhidebots' => '(ボットを$1)',
 'noimages' => '表示できるものがありません。',
 'ilsubmit' => '検索',
@@ -3220,10 +3279,10 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1、 $2 × $3',
-'seconds' => '{{PLURAL:$1|$1秒}}',
+'seconds' => '{{PLURAL:$1|$1 秒}}',
 'minutes' => '{{PLURAL:$1|$1分}}',
 'hours' => '{{PLURAL:$1|$1時間}}',
-'days' => '{{PLURAL:$1|$1日}}',
+'days' => '{{PLURAL:$1|$1 日}}',
 'ago' => '$1前',
 
 # Bad image list
@@ -3285,11 +3344,11 @@ Variants for Chinese language
 
 # Metadata
 'metadata' => 'メタデータ',
-'metadata-help' => 'このファイルには、追加情報があります(おそらく、作成やデジタル化する際に使われたデジタルカメラやスキャナーによって追加されたものです)。
+'metadata-help' => 'このファイルには、追加情報があります(おそらく、作成やデジタル化する際に使用したデジタルカメラやスキャナーが追加したものです)。
 このファイルが元の状態から変更されている場合、いくつかの項目は、修正されたファイルを完全に反映していないかもしれません。',
 'metadata-expand' => '拡張項目を表示',
 'metadata-collapse' => '拡張項目を非表示',
-'metadata-fields' => 'ã\81\93ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81«ã\81\82ã\82\8bEXIFã\83¡ã\82¿ã\83\87ã\83¼ã\82¿ã\83\95ã\82£ã\83¼ã\83«ã\83\89ã\81¯ã\80\81ã\83¡ã\82¿ã\83\87ã\83¼ã\82¿è¡¨ã\81\8cæ\8a\98ã\82\8aã\81\9fã\81\9fã\81¾ã\82\8cã\81¦ã\81\84ã\82\8b状態のときに画像ページに読み込まれます。
+'metadata-fields' => 'ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81«ã\81\82ã\82\8bEXIFã\83¡ã\82¿ã\83\87ã\83¼ã\82¿ã\83\95ã\82£ã\83¼ã\83«ã\83\89ã\81¯ã\80\81ã\83¡ã\82¿ã\83\87ã\83¼ã\82¿è¡¨ã\82\92æ\8a\98ã\82\8aç\95³ã\82\93ã\81 状態のときに画像ページに読み込まれます。
 他のものは既定では非表示です。
 * make
 * model
@@ -3466,17 +3525,17 @@ Variants for Chinese language
 'exif-usageterms' => '使用条件',
 'exif-webstatement' => 'オンライン上の著作権文',
 'exif-originaldocumentid' => '元文書の一意な識別子',
-'exif-licenseurl' => '著作権ライセンスの URL',
+'exif-licenseurl' => '著作権ライセンスのURL',
 'exif-morepermissionsurl' => '代替ライセンス情報',
 'exif-attributionurl' => 'この作品を再利用する際に、次のURLにリンクしてください',
-'exif-preferredattributionname' => 'この作品を再利用する際に、次の帰属表示を使てください',
+'exif-preferredattributionname' => 'この作品を再利用する際に、次の帰属表示を使用してください',
 'exif-pngfilecomment' => 'PNGファイルのコメント',
 'exif-disclaimer' => '免責事項',
 'exif-contentwarning' => 'コンテンツに関する警告',
 'exif-giffilecomment' => 'GIFファイルのコメント',
 'exif-intellectualgenre' => '項目の種類',
 'exif-subjectnewscode' => '主題コード',
-'exif-scenecode' => 'IPTC シーンコード',
+'exif-scenecode' => 'IPTCシーンコード',
 'exif-event' => '映っている事象',
 'exif-organisationinimage' => '映っている組織',
 'exif-personinimage' => '映っている人物',
@@ -3591,7 +3650,7 @@ Variants for Chinese language
 'exif-scenecapturetype-2' => '人物',
 'exif-scenecapturetype-3' => '夜景',
 
-'exif-gaincontrol-0' => 'し',
+'exif-gaincontrol-0' => 'し',
 'exif-gaincontrol-1' => '弱い増感',
 'exif-gaincontrol-2' => '強い増感',
 'exif-gaincontrol-3' => '弱い減感',
@@ -3624,16 +3683,16 @@ Variants for Chinese language
 
 # Pseudotags used for GPSAltitudeRef
 'exif-gpsaltitude-above-sealevel' => '海抜 $1 {{PLURAL:$1|メートル}}',
-'exif-gpsaltitude-below-sealevel' => 'æµ·æ\8a\9cã\83\9eã\82¤ã\83\8aã\82¹ $1 {{PLURAL:$1|メートル}}',
+'exif-gpsaltitude-below-sealevel' => 'æ°´é\9d¢ä¸\8b $1 {{PLURAL:$1|メートル}}',
 
 'exif-gpsstatus-a' => '測位中',
-'exif-gpsstatus-v' => '未測位(中断中)',
+'exif-gpsstatus-v' => '未測位(中断中)',
 
-'exif-gpsmeasuremode-2' => '2次元測位中',
-'exif-gpsmeasuremode-3' => '3次元測位中',
+'exif-gpsmeasuremode-2' => '2 次元測位中',
+'exif-gpsmeasuremode-3' => '3 次元測位中',
 
 # Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'キロメール/時',
+'exif-gpsspeed-k' => 'ã\82­ã\83­ã\83¡ã\83¼ã\83\88ã\83«/æ\99\82',
 'exif-gpsspeed-m' => 'マイル/時',
 'exif-gpsspeed-n' => 'ノット',
 
@@ -3648,7 +3707,7 @@ Variants for Chinese language
 'exif-gpsdop-fair' => '中程度 ($1)',
 'exif-gpsdop-poor' => '劣悪 ($1)',
 
-'exif-objectcycle-a' => '午前のみ',
+'exif-objectcycle-a' => '午前のみ',
 'exif-objectcycle-p' => '午後のみ',
 'exif-objectcycle-b' => '午後と午前の両方',
 
@@ -3670,11 +3729,11 @@ Variants for Chinese language
 
 'exif-rating-rejected' => '却下',
 
-'exif-isospeedratings-overflow' => '65535 より大きい',
+'exif-isospeedratings-overflow' => '65535より大きい',
 
 'exif-iimcategory-ace' => '芸術、文化、娯楽',
 'exif-iimcategory-clj' => '犯罪と法律',
-'exif-iimcategory-dis' => 'ç\81½å®³ã\83»事故',
+'exif-iimcategory-dis' => 'ç\81½å®³ã\80\81事故',
 'exif-iimcategory-fin' => '経済とビジネス',
 'exif-iimcategory-edu' => '教育',
 'exif-iimcategory-evn' => '環境',
@@ -3691,12 +3750,12 @@ Variants for Chinese language
 'exif-iimcategory-wea' => '天気',
 
 'exif-urgency-normal' => '通常 ($1)',
-'exif-urgency-low' => '低 ($1)',
-'exif-urgency-high' => '高 ($1)',
+'exif-urgency-low' => '低 ($1)',
+'exif-urgency-high' => '高 ($1)',
 'exif-urgency-other' => '利用者定義の優先度 ($1)',
 
 # External editor support
-'edit-externally' => '外部アプリケーションを使ってこのファイルを編集する',
+'edit-externally' => '外部アプリケーションを使用してこのファイルを編集',
 'edit-externally-help' => '(詳しい情報は[//www.mediawiki.org/wiki/Manual:External_editors 設定手順]をご覧ください)',
 
 # 'all' in various places, this might be different for inflected languages
@@ -3714,7 +3773,7 @@ Variants for Chinese language
 そのリンクをブラウザーで読み込んで、メールアドレスの正当性を確認してください。',
 'confirmemail_pending' => '確認メールは既に送信されています。
 このアカウントを作成したばかりであれば、メールが届くまで数分ほど待たなければならないかもしれません。',
-'confirmemail_send' => '確認用コードを送信する',
+'confirmemail_send' => '確認用コードを送信',
 'confirmemail_sent' => '確認メールを送信しました。',
 'confirmemail_oncreate' => 'メールアドレスの正当性を確認するためのコードを含んだメールを送信しました。
 この確認を行わなくてもログインはできますが、確認するまでメール通知の機能は無効化されます。',
@@ -3744,34 +3803,34 @@ $3
 $5
 
 この確認用コードは、$4に期限切れになります。',
-'confirmemail_body_changed' => 'だれかが、IPアドレス$1から
-{{SITENAME}}でアカウント「$2」の電子メールアドレスをこのアドレスに変更しました。
+'confirmemail_body_changed' => '誰か(おそらくあなた)が IP アドレス $1 から、
+{{SITENAME}} のアカウント「$2」のメール アドレスをこのアドレスに変更しました。
 
-このアカウントが本当に自分のものであるならば
-{{SITENAME}}のメール機能を再び有効化にするために、以下のURLをブラウザーで開いてください:
+このアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて
+{{SITENAME}} のメール機能を再び有効にしてください:
 
 $3
 
-もし自分のアカウントでない場合は、
-次のURLをブラウザーで開いて、電子メール確認を中止してください:
+もしあなたのアカウント *ではない* 場合は、
+ブラウザーで以下のリンクを開いて、メール アドレスの確認をキャンセルしてください:
 
 $5
 
-この確認用コードは$4に期限切れになります。',
-'confirmemail_body_set' => 'だれかが、IPアドレス$1から
-{{SITENAME}}でアカウント「$2」の電子メールアドレスをこのアドレスに設定しました。
+この確認コードは $4 に期限切れになります。',
+'confirmemail_body_set' => '誰か(おそらくあなた)が IP アドレス $1 から
+{{SITENAME}} のアカウント「$2」のメール アドレスをこのアドレスに設定しました。
 
-このアカウントが本当に自分のものであるならば
-{{SITENAME}}のメール機能を再び有効化にするために、以下のURLをブラウザーで開いてください:
+このアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて
+{{SITENAME}} のメール機能を再び有効にしてください。
 
 $3
 
-もし自分のアカウントでない場合は、
-次のURLをブラウザーで開いて、電子メール確認を中止してください:
+もしあなたのアカウントでない場合は、
+次のリンクをブラウザーで開いて、メール アドレスの確認をキャンセルしてください:
 
 $5
 
-この確認用コードは$4に期限切れになります。',
+この確認コードは $4 に期限切れになります。',
 'confirmemail_invalidated' => 'メールアドレスの確認が中止されました',
 'invalidateemail' => 'メールアドレスの認証中止',
 
@@ -3805,7 +3864,7 @@ $5
 'colon-separator' => ':',
 'pipe-separator' => '&#32;|&#32;',
 'word-separator' => '',
-'parentheses' => '($1)',
+'parentheses' => '($1)',
 
 # Multipage image navigation
 'imgmultipageprev' => '&larr;前ページ',
@@ -3838,8 +3897,8 @@ $5
 'size-gigabytes' => '$1ギガバイト',
 
 # Live preview
-'livepreview-loading' => '読み込み中・・・',
-'livepreview-ready' => '読み込み中・・・完了!',
+'livepreview-loading' => '読み込み中...',
+'livepreview-ready' => '読み込み中...完了!',
 'livepreview-failed' => 'ライブプレビューが失敗しました!
 通常のプレビューを試してください。',
 'livepreview-error' => '接続に失敗しました:$1「$2」。
@@ -3851,20 +3910,20 @@ $5
 
 # Watchlist editor
 'watchlistedit-numitems' => 'ウォッチリストには、$1件のページ名が含まれています(トークページは除く)。',
-'watchlistedit-noitems' => 'ウォッチリストにはページ名が1つも含まれていません。',
+'watchlistedit-noitems' => 'ウォッチリストにはページ名が1つもありません。',
 'watchlistedit-normal-title' => 'ウォッチリストの編集',
 'watchlistedit-normal-legend' => 'ウォッチリストからページ名を除去',
-'watchlistedit-normal-explain' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«å\85¥ã\81£ã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸å\90\8dã\81\8c以ä¸\8bã\81«è¡¨ç¤ºã\81\95ã\82\8cています。
-ページ名を除去するには、横にあるボックスにチェックを入れ、「{{int:watchlistedit-normal-submit}}」をクリックしてください。
\81¾ã\81\9fã\80\81[[Special:EditWatchlist/raw|ã\81\9dã\81®ã\81¾ã\81¾ã\81®ä¸\80覧ã\81§ç·¨é\9b\86]]ã\81\99ã\82\8bã\81\93ã\81¨ã\82\82できます。',
-'watchlistedit-normal-submit' => 'ã\83\9aã\83¼ã\82¸ã\81®除去',
-'watchlistedit-normal-done' => 'ウォッチリストから $1{{PLURAL:$1|件}}を削除しました:',
+'watchlistedit-normal-explain' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«å\85¥ã\81£ã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸å\90\8dã\82\92以ä¸\8bã\81«è¡¨ç¤ºã\81\97ています。
+ページ名を除去するには、隣のボックスにチェックを入れて「{{int:watchlistedit-normal-submit}}」をクリックしてください。
\81¾ã\81\9fã\80\81[[Special:EditWatchlist/raw|ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\81\9dã\81®ã\81¾ã\81¾ç·¨é\9b\86]]ã\82\82使ç\94¨できます。',
+'watchlistedit-normal-submit' => 'ã\83\9aã\83¼ã\82¸ã\82\92除去',
+'watchlistedit-normal-done' => 'ウォッチリストから $1 {{PLURAL:$1|件}}を削除しました:',
 'watchlistedit-raw-title' => 'ウォッチリストをそのまま編集',
 'watchlistedit-raw-legend' => 'ウォッチリストをそのまま編集',
-'watchlistedit-raw-explain' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«å\90«ã\81¾ã\82\8cã\82\8bã\83\9aã\83¼ã\82¸å\90\8dã\81\8c以ä¸\8bã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\8aã\82\8aã\80\81ã\81\93ã\81®ä¸\80覧ã\81\8bã\82\89追å\8a ã\82\84é\99¤å\8e»できます。
+'watchlistedit-raw-explain' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«å\90«ã\81¾ã\82\8cã\82\8bã\83\9aã\83¼ã\82¸å\90\8dã\82\92以ä¸\8bã\81«è¡¨ç¤ºã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82ã\81\93ã\81®ä¸\80覧ã\81§è¿½å\8a ã\81¾ã\81\9fã\81¯é\99¤å\8e»ã\81\8cできます。
 1行に1ページ名です。
 完了したら、「{{int:Watchlistedit-raw-submit}}」をクリックしてください。
-[[Special:EditWatchlist|標準の編集ページ]]も用できます。',
+[[Special:EditWatchlist|標準の編集ページ]]も使用できます。',
 'watchlistedit-raw-titles' => 'ページ名:',
 'watchlistedit-raw-submit' => 'ウォッチリストを更新',
 'watchlistedit-raw-done' => 'ウォッチリストを更新しました。',
@@ -3948,7 +4007,7 @@ $5
 'version-parserhooks' => '構文解析フック',
 'version-variables' => '変数',
 'version-antispam' => 'スパム対策',
-'version-skins' => 'スキン',
+'version-skins' => '外装',
 'version-other' => 'その他',
 'version-mediahandlers' => 'メディアハンドラー',
 'version-hooks' => 'フック',
@@ -3969,6 +4028,11 @@ MediaWikiは、有用であることを期待して配布されていますが
 'version-software' => 'インストール済みソフトウェア',
 'version-software-product' => '製品',
 'version-software-version' => 'バージョン',
+'version-entrypoints' => 'エントリー ポイントの URL',
+'version-entrypoints-header-entrypoint' => 'エントリー ポイント',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 記事のパス]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath スクリプト パス]',
 
 # Special:FilePath
 'filepath' => 'ファイルパス',
@@ -3983,10 +4047,10 @@ MediaWikiは、有用であることを期待して配布されていますが
 'fileduplicatesearch-legend' => '重複の検索',
 'fileduplicatesearch-filename' => 'ファイル名:',
 'fileduplicatesearch-submit' => '検索',
-'fileduplicatesearch-info' => '$1×$2ピクセル<br />ファイルサイズ:$3<br />MIMEタイプ:$4',
+'fileduplicatesearch-info' => '$1×$2 ピクセル<br />ファイルサイズ:$3<br />MIMEタイプ:$4',
 'fileduplicatesearch-result-1' => 'ファイル「$1」と重複するファイルはありません。',
 'fileduplicatesearch-result-n' => 'ファイル「$1」は$2件のファイルと重複しています。',
-'fileduplicatesearch-noresults' => 'ã\80\8c$1ã\80\8dã\81¨ã\81\84ã\81\86å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81¿ã\81¤ã\81\8bりません。',
+'fileduplicatesearch-noresults' => 'ã\80\8c$1ã\80\8dã\81¨ã\81\84ã\81\86å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯ã\81\82りません。',
 
 # Special:SpecialPages
 'specialpages' => '特別ページ',
@@ -4032,16 +4096,16 @@ MediaWikiは、有用であることを期待して配布されていますが
 'tags-description-header' => '詳細な意味の説明',
 'tags-hitcount-header' => 'タグが付与された変更',
 'tags-edit' => '編集',
-'tags-hitcount' => '$1回の変更',
+'tags-hitcount' => '$1 {{PLURAL:$1|回の変更}}',
 
 # Special:ComparePages
 'comparepages' => 'ページの比較',
 'compare-selector' => 'ページの版を比較',
-'compare-page1' => 'ページ1',
-'compare-page2' => 'ページ2',
-'compare-rev1' => '版1',
-'compare-rev2' => '版2',
-'compare-submit' => '比較する',
+'compare-page1' => 'ページ 1',
+'compare-page2' => 'ページ 2',
+'compare-rev1' => '版 1',
+'compare-rev2' => '版 2',
+'compare-submit' => '比較',
 'compare-invalid-title' => '指定したページ名は使用できません。',
 'compare-title-not-exists' => '指定されたページは存在しません。',
 'compare-revision-not-exists' => '指定された版は存在しません。',
@@ -4075,13 +4139,13 @@ MediaWikiは、有用であることを期待して配布されていますが
 # New logging system
 'logentry-delete-delete' => '$1 がページ「$3」を削除しました',
 'logentry-delete-restore' => '$1 がページ「$3」を復帰しました',
-'logentry-delete-event' => '$1 が$3で{{PLURAL:$5|記録項目|$5件の記録項目}}の閲覧レベルを変更しました: $4',
-'logentry-delete-revision' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81§{{PLURAL:$5|ç\89\88|$5å\80\8bã\81®ç\89\88}}ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\97ã\81\9f$4',
-'logentry-delete-event-legacy' => '$1 が$3で記録項目の閲覧レベルを変更しました',
+'logentry-delete-event' => '$1が$3の{{PLURAL:$5|記録項目| $5 件の記録項目}}の閲覧レベルを変更しました:$4',
+'logentry-delete-revision' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81®{{PLURAL:$5|ç\89\88| $5 å\80\8bã\81®ç\89\88}}ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9a$4',
+'logentry-delete-event-legacy' => '$1 が「$3」の記録項目の閲覧レベルを変更しました',
 'logentry-delete-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを変更しました',
 'logentry-suppress-delete' => '$1 がページ「$3」を隠蔽しました',
-'logentry-suppress-event' => '$1 が$3で{{PLURAL:$5|記録項目|$5件の記録項目}}の閲覧レベルを見えない形で変更しました: $4',
-'logentry-suppress-revision' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81§{{PLURAL:$5|ç\89\88|$5å\80\8bã\81®ç\89\88}}ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\82\92è¦\8bã\81\88ã\81ªã\81\84å½¢ã\81§å¤\89æ\9b´ã\81\97ã\81¾ã\81\97ã\81\9f$4',
+'logentry-suppress-event' => '$1 が「$3」の{{PLURAL:$5|記録項目| $5 件の記録項目}}の閲覧レベルを見えない形で変更しました:$4',
+'logentry-suppress-revision' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81®{{PLURAL:$5|ç\89\88| $5 å\80\8bã\81®ç\89\88}}ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\82\92è¦\8bã\81\88ã\81ªã\81\84å½¢ã\81§å¤\89æ\9b´ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9a$4',
 'logentry-suppress-event-legacy' => '$1 が$3で記録項目の閲覧レベルを見えない形で変更しました',
 'logentry-suppress-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを見えない形で変更しました',
 'revdelete-content-hid' => '本文の不可視化',
@@ -4092,17 +4156,17 @@ MediaWikiは、有用であることを期待して配布されていますが
 'revdelete-uname-unhid' => '利用者名の可視化',
 'revdelete-restricted' => '管理者に対する制限の適用',
 'revdelete-unrestricted' => '管理者に対する制限の除去',
-'logentry-move-move' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\80\8c$4ã\80\8dã\81¸ã\81¨移動しました',
-'logentry-move-move-noredirect' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\80\8c$4ã\80\8dã\81¸ã\81¨、リダイレクトを残さずに移動しました',
-'logentry-move-move_redir' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\80\8c$4ã\80\8dã\81¸ã\81¨移動しました',
-'logentry-move-move_redir-noredirect' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\80\8c$4ã\80\8dã\81¸ã\81¨、リダイレクトを残さずに移動しました',
-'logentry-patrol-patrol' => '$1 がページ「$3」の版 $4をパトロール済みとしました',
-'logentry-patrol-patrol-auto' => '$1 がページ「$3」の版 $4を自動的にパトロール済みとしました',
+'logentry-move-move' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\80\8c$4ã\80\8dã\81«移動しました',
+'logentry-move-move-noredirect' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\80\8c$4ã\80\8dã\81«、リダイレクトを残さずに移動しました',
+'logentry-move-move_redir' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\80\8c$4ã\80\8dã\81«移動しました',
+'logentry-move-move_redir-noredirect' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\80\8c$4ã\80\8dã\81«、リダイレクトを残さずに移動しました',
+'logentry-patrol-patrol' => '$1 がページ「$3」の版 $4 をパトロール済みとしました',
+'logentry-patrol-patrol-auto' => '$1 が自動的にページ「$3」の版 $4 をパトロール済みとしました',
 'logentry-newusers-newusers' => '$1 が利用者アカウントを作成しました',
 'logentry-newusers-create' => '$1 が利用者アカウントを作成しました',
 'logentry-newusers-create2' => '$1 が利用者アカウント「$3」を作成しました',
 'logentry-newusers-autocreate' => 'アカウント「$1」が自動的に作成されました',
-'newuserlog-byemail' => 'パスワードを電子メールで送信しました',
+'newuserlog-byemail' => 'パスワードをメールで送信しました',
 
 # Feedback
 'feedback-bugornote' => '技術的な問題の詳細をご説明する準備ができているなら[$1 バグを報告]してください。それ以外の場合、下の簡易フォームを使用すれば、あなたのコメントが"[$3 $2]"にあなたの利用者名と使用中のブラウザ名と共に追加されます。',
@@ -4116,17 +4180,17 @@ MediaWikiは、有用であることを期待して配布されていますが
 'feedback-error3' => 'エラー:APIからの応答がありません',
 'feedback-thanks' => 'ありがとうございます。あなたのフィードバックは「[$2 $1]」のページに投稿されました。',
 'feedback-close' => '完了',
-'feedback-bugcheck' => 'Great!  [$1 既出のバグ]にすでに含まれていないかチェックしてください。',
+'feedback-bugcheck' => 'Great! [$1 既出のバグ]に既に含まれていないか確認してください。',
 'feedback-bugnew' => 'チェック済み。バグを報告する。',
 
 # API errors
 'api-error-badaccess-groups' => 'このウィキへのファイルのアップロードが許可されていません。',
 'api-error-badtoken' => '内部エラー:トークンが不正です。',
 'api-error-copyuploaddisabled' => 'URLによるアップロードはこのサーバーでは無効になっています。',
-'api-error-duplicate' => '当ウェブサイト上には、既に同じ内容の[$2 別ファイル]が存在しています{{PLURAL:$1|}}。',
-'api-error-duplicate-archive' => '同じ内容で既に削除済みの{{PLURAL:$1|[$2 別のファイルが]|[$2 別のファイルがいくつか]}}サイト上にあります。',
-'api-error-duplicate-archive-popup-title' => 'すでに削除された重複{{PLURAL:$1|ファイル|ファイル}}',
-'api-error-duplicate-popup-title' => 'é\87\8dè¤\87ã\83\95ã\82¡ã\82¤ã\83«{{PLURAL:$1|}}',
+'api-error-duplicate' => '当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|[$2 他のファイル]が|[$2 他のファイルがいくつか]}}存在しています。',
+'api-error-duplicate-archive' => '同じ内容で既に削除済みの{{PLURAL:$1|[$2 他のファイル]が|[$2 他のファイルがいくつか]}}サイト上にあります。',
+'api-error-duplicate-archive-popup-title' => '重複した{{PLURAL:$1|ファイル|ファイル群}}は削除済みです。',
+'api-error-duplicate-popup-title' => 'é\87\8dè¤\87ã\81\97ã\81\9f{{PLURAL:$1|ã\83\95ã\82¡ã\82¤ã\83«|ã\83\95ã\82¡ã\82¤ã\83«ç¾¤}}',
 'api-error-empty-file' => '送信されたファイルは空でした。',
 'api-error-emptypage' => '内容がないページの新規作成は許可されていません。',
 'api-error-fetchfileerror' => '内部エラー:ファイルの取得中に問題が発生しました。',
@@ -4152,9 +4216,20 @@ MediaWikiは、有用であることを期待して配布されていますが
 'api-error-unclassified' => '不明なエラーが発生しました。',
 'api-error-unknown-code' => '不明なエラー:「$1」',
 'api-error-unknown-error' => '内部エラー:ファイルのアップロードの途中で問題が発生しました。',
-'api-error-unknown-warning' => '原因不明の警告:$1',
-'api-error-unknownerror' => '原因不明のエラー: 「$1」',
+'api-error-unknown-warning' => '不明な警告:「$1」',
+'api-error-unknownerror' => '不明なエラー:「$1」',
 'api-error-uploaddisabled' => 'このウィキではアップロードは無効になっています。',
 'api-error-verification-error' => 'このファイルは壊れているか、間違った拡張子になっています。',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|秒}}',
+'duration-minutes' => '$1 {{PLURAL:$1|分}}',
+'duration-hours' => '$1 {{PLURAL:$1|時間}}',
+'duration-days' => '$1 {{PLURAL:$1|日}}',
+'duration-weeks' => '$1 {{PLURAL:$1|週間}}',
+'duration-years' => '$1 {{PLURAL:$1|年}}',
+'duration-decades' => '$1{{PLURAL:$1|0 年}}',
+'duration-centuries' => '$1 {{PLURAL:$1|世紀}}',
+'duration-millennia' => '$1{{PLURAL:$1|,000 年}}',
+
 );
index c8bf0cd..0eb091e 100644 (file)
@@ -838,7 +838,8 @@ $2
 'updated' => '(განახლდა)',
 'note' => "'''შენიშვნა:'''",
 'previewnote' => "'''დაიმახსოვრეთ, ეს მხოლოდ წინასწარი გადახედვაა.'''
-თქვენი ცვლილებები ჯერ არ შენახულა! [[#editform|→ რედაქტირების გაგრძელება]]",
+თქვენი ცვლილებები ჯერ არ შენახულა!",
+'continue-editing' => 'რედაქტირების გაგრძელება',
 'previewconflict' => 'შავი ნიმუში უჩვენებს ტექსტს ზედა რედაქტირების ფანჯარაში, როგორც ის გამოჩნდება თუ თქვენ მას შეინახავთ.',
 'session_fail_preview' => "'''უკაცრავად! ვერ შევძელით თქვენი რედაქტირების შენახვა სესიის მონაცემთა დაკარგვის გამო.
 გთხოვთ ისევ სცადოთ.
@@ -851,7 +852,7 @@ $2
 'token_suffix_mismatch' => "'''თქვენი შესწორება გაუქმდა რადგანაც პროგრამა არასწორედ აღიქვამს პუნქტუაციის ნიშნებს რედაქტირების ფანჯარაში. შესწრება გაუქმდა სტატიის არ გაფუჭების მიზნით. შესაძლოა ეს გამოწვეულია გაფუჭებული ვებ პროქსის გამოყენებით.'''",
 'edit_form_incomplete' => "'''რედაქტირებების ნაწილმა სერვერამდე ვერ მიაღწია; გთხოვთ, შეამოწმეთ თქვენი რედაქტირებების სრულყოფილება და სცადეთ განმეორებით.'''",
 'editing' => 'რედაქტირება: $1',
-'creating' => 'იქმნება $1',
+'creating' => 'იქმნება: „$1“',
 'editingsection' => 'რედაქტირება - $1 (სექცია)',
 'editingcomment' => 'რედაქტირება: $1 (ახალი სექცია)',
 'editconflict' => 'რედაქტირების კონფლიქტი: $1',
@@ -1076,7 +1077,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'დამალვათა ჟურნალი',
 'suppressionlogtext' => 'ქვემოთ მოცემულია წაშლისა და ბლოკირებების სია, რომელიც მოიცავს ადმინისტრატორებისაგან დაფარულ მასალებს.
-იხილეთ [[Special:BlockList|IP ბლოკირებების სიაში]] მიმდინარე ბლოკირებები.',
+იხილეთ [[Special:BlockList|ბლოკირებების სიაში]] მიმდინარე ბლოკირებები.',
 
 # History merging
 'mergehistory' => 'გვერდების ისტორიის შერწყმა',
@@ -2012,6 +2013,11 @@ $1',
 'allpages-bad-ns' => '{{SITENAME}} "$1" არ აქვს სახელთა სივრცე.',
 'allpages-hide-redirects' => 'გადამისამართებების დამალვა',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'თქვენ ნახულობთ გვერდის ქეშირებულ ვერსიას, ის შეიძლება განახლდა $1 წინ.',
+'cachedspecial-viewing-cached-ts' => 'თქვენ ნახულობთ ამ გვერდის ქეშირებულ ვერსიას, რომელიც შესაძლოა მნიშვნელოვნად განსხვავდებოდეს მიმდინარე ვერსისაგან.',
+'cachedspecial-refresh-now' => 'ბოლო ვერსიის ხილვა.',
+
 # Special:Categories
 'categories' => 'კატეგორიები',
 'categoriespagetext' => 'შემდეგი {{PLURAL:$1|კატეგორია შეიცავს|კატეგორია შეიცავს}} გვერდს ან მედიას.
@@ -2455,7 +2461,7 @@ $1',
 'badipaddress' => 'არასწორი IP მისამართი',
 'blockipsuccesssub' => 'ბლოკირება შესრულებულია',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ბლოკირებულ იქნა.<br />
\83\98á\83®á\83\98á\83\9aá\83\94á\83\97 [[Special:BlockList|á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\98 IP á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\94á\83\91á\83\98á\83¡ á\83¡á\83\98á\83\90]].',
+იხილეთ [[Special:BlockList|ბლოკირებების სია]].',
 'ipb-blockingself' => 'თქვენ აპირებთ დაბლოკოთ საკუთარი თავი! დარწმუნებული ხართ, რომ გსურთ ამის გაკეთება?',
 'ipb-confirmhideuser' => 'თქვენ აპირებთ მომხმარებლის დაბლოკვას და ჩართული გაქვთ ოპცია „დამალე მომხმარებელი“. ასეთი ქმედება აღკვეთს მომხმარებლის სახელს ყველა სიიდან და ჟურნალების ჩანაწერებიდან. დარწმუნებული ხართ, რომ ამის გაკეთება გსურთ?',
 'ipb-edit-dropdown' => 'დაბლოკვის მიზეზების რედაქტირება',
@@ -2507,7 +2513,9 @@ $1',
 დაბლოკვათა ჟურნალი ქვემოთ მოყვანილია:',
 'blocklogentry' => 'დაიბლოკა [[$1]]. ბლოკირების ვადა $2 $3.',
 'reblock-logentry' => 'შეასწორა ბლოკირების კონფიგურაცია [[$1]]-სთვის, ვადა გასდის $2 $3',
-'blocklogtext' => 'ეს არის მომხმარებლების დაბლოკვის და განბლოკვის ჟურნალი. ავტომატურად დაბლოკილი IP მისამართები არაა ჩამოთვლილი. იხილეთ [[Special:BlockList|IP ბლოკირების სია]] მიმდინარე დაბლოკვებისთვის.',
+'blocklogtext' => 'ეს არის მომხმარებლების დაბლოკვის და განბლოკვის ჟურნალი. 
+ავტომატურად დაბლოკილი IP მისამართები არაა ჩამოთვლილი. 
+იხილეთ [[Special:BlockList|ბლოკირებების სია]] მიმდინარე დაბლოკვებისთვის.',
 'unblocklogentry' => 'ბლოკი მოხსნილია $1',
 'block-log-flags-anononly' => 'მხოლოდ ანონიმური მომხმარებლები',
 'block-log-flags-nocreate' => 'ანგარიშის შექმნა გამორთულია',
@@ -3654,6 +3662,11 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'version-software' => 'დაინსტალირებული პროგრამული უზრუნველყოფა',
 'version-software-product' => 'პროდუქტი',
 'version-software-version' => 'ვერსია',
+'version-entrypoints' => 'შესვლის წერტილის URL-ები',
+'version-entrypoints-header-entrypoint' => 'შესვლის წერტილი',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath გზა სტატიისაკენ]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath გზა სკრიპტისაკენ]',
 
 # Special:FilePath
 'filepath' => 'გზა ფაილისდამი',
@@ -3838,4 +3851,15 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'api-error-uploaddisabled' => 'ატვირთვის მექანიზმი ამ ვიკიზე გამორთულია',
 'api-error-verification-error' => 'ეს ფაილი ან რაიმე შეცდომას შეიცავს, ან არ აქვს სახელის გაფართოება.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|წამი|წამი}}',
+'duration-minutes' => '$1 {{PLURAL:$1|წუთი|წუთი}}',
+'duration-hours' => '$1 {{PLURAL:$1|საათი|საათი}}',
+'duration-days' => '$1 {{PLURAL:$1|დღე|დღე}}',
+'duration-weeks' => '$1 {{PLURAL:$1|კვირა|კვირა}}',
+'duration-years' => '$1 {{PLURAL:$1|წელი|წელი}}',
+'duration-decades' => '$1 {{PLURAL:$1|დეკადა|დეკადა}}',
+'duration-centuries' => '$1 {{PLURAL:$1|საუკუნე|საუკუნე}}',
+'duration-millennia' => '$1 {{PLURAL:$1|ათასწლეული|ათასწლეული}}',
+
 );
index befc719..bc34b44 100644 (file)
@@ -52,7 +52,7 @@ $messages = array(
 'tog-editsection' => 'Eǧǧ abeddel n umur s yizdayen [beddel]',
 'tog-editsectiononrightclick' => 'Eǧǧ abeddel n umur mi wekkiɣ ɣef uyeffus<br /> ɣef yizwal n umur (JavaScript)',
 'tog-showtoc' => 'Ssken agbur (i isebtar i yesɛan kter n 3 izwalen)',
-'tog-rememberpassword' => 'Cfu ɣef yisem n wemseqdac inu di uselkim-agi (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-rememberpassword' => 'Cfu ɣef yisem n umseqdac inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})',
 'tog-watchcreations' => 'Rnu isebtar i xelqeɣ deg wumuɣ n uɛessi inu',
 'tog-watchdefault' => 'Rnu isebtar i ttbeddileɣ deg wumuɣ n uɛessi inu',
 'tog-watchmoves' => 'Rnu isebtar i smimḍeɣ deg wumuɣ n uɛessi inu',
@@ -60,13 +60,13 @@ $messages = array(
 'tog-minordefault' => 'Rcem akk ibeddlen am ibeddlen ifessasen d ameslugen',
 'tog-previewontop' => 'Ssken pre-timeẓriwt uqbel tankult ubeddel',
 'tog-previewonfirst' => 'Ssken pre-timeẓriwt akk d ubeddel amezwaru',
-'tog-nocache' => 'Kkes lkac n usebter',
+'tog-nocache' => 'Ekkes lkac n usebter',
 'tog-enotifwatchlistpages' => "Azen-iyi-d e-mail m'ara yettubeddel asebter i ttɛassaɣ",
 'tog-enotifusertalkpages' => 'Azen-iyi-d e-mail asmi sɛiɣ izen amaynut',
 'tog-enotifminoredits' => 'Azen-iyi-d e-mail ma llan ibeddlen ifessasen',
 'tog-enotifrevealaddr' => 'Ssken e-mail inu asmi yettwazen email n talɣut',
 'tog-shownumberswatching' => 'Ssken geddac yellan n yimseqdacen iɛessasen',
-'tog-fancysig' => 'Eǧǧ azmul am yettili (mebla azday otomatik)',
+'tog-fancysig' => 'ǧǧ azmul am yettili (war azday awurman)',
 'tog-externaleditor' => 'Sseqdec ambeddel n berra d ameslugen',
 'tog-externaldiff' => 'Sseqdec ambeddel n berra iwakken ad ẓreɣ imgerraden',
 'tog-showjumplinks' => 'Eǧǧ izdayen "neggez ar"',
@@ -145,7 +145,10 @@ $messages = array(
 'hidden-category-category' => 'Taggayin yeffren',
 'category-subcat-count' => 'Taggayt agi tesɛa {{PLURAL:$2|adu-taggayt|$2 adu-taggayin, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}}}} ddaw agi.',
 'category-subcat-count-limited' => 'Taggayt agi tesɛa {{PLURAL:$1|adu-taggayt agi|tid $1 adu-taggayin agi}} ddaw-agi.',
-'category-article-count' => 'Taggayt agi tesɛa {{PLURAL:$2|asebter agi|$2 isetar, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.',
+'category-article-count' => 'Taggayt agi tesɛa {{PLURAL:$2|asebter agi|$2 isebtaren, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.',
+'category-file-count' => 'Taggayt agi tesɛa {{PLURAL:$2|afaylu agi|$2 ifuyla, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.',
+'listingcontinuesabbrev' => 'asartu',
+'noindex-category' => 'Asebter agi ur d-yerna ara deg umatar',
 
 'about' => 'Awal ɣef...',
 'article' => 'Ayen yella deg usebter',
@@ -169,6 +172,20 @@ $messages = array(
 'faq' => 'Isteqsiyen',
 'faqpage' => 'Project:Isteqsiyen',
 
+# Vector skin
+'vector-action-addsection' => 'Rnud ameggay',
+'vector-action-delete' => 'Mḥu',
+'vector-action-move' => 'Smimeḍ',
+'vector-action-protect' => 'Mmesten',
+'vector-view-create' => 'Snulfu',
+'vector-view-edit' => 'Ẓẓiẓreg',
+'vector-view-history' => 'Ẓeṛ amazray',
+'vector-view-view' => 'Ɣer',
+'vector-view-viewsource' => 'Ẓer aɣbalu',
+'actions' => 'Tigawtin',
+'namespaces' => 'Talluntin n isemawen',
+'variants' => 'Tineḍwa',
+
 'errorpagetitle' => 'Agul',
 'returnto' => 'Uɣal ar $1.',
 'tagline' => 'Seg {{SITENAME}}',
@@ -184,6 +201,7 @@ $messages = array(
 'permalink' => 'Azday ur yettbeddil ara',
 'print' => 'Imprimi',
 'edit' => 'Beddel',
+'create' => 'Snulfu',
 'editthispage' => 'Beddel asebter-agi',
 'delete' => 'Mḥu',
 'deletethispage' => 'Mḥu asebter-agi',
@@ -191,8 +209,8 @@ $messages = array(
 'protect' => 'Ḥrez',
 'protect_change' => 'beddel tiḥḥerzi',
 'protectthispage' => 'Ḥrez asebter-agi',
-'unprotect' => 'fakk tiḥḥerzi',
-'unprotectthispage' => 'Fakk tiḥḥerzi n usebter-agi',
+'unprotect' => 'Beddel amesten',
+'unprotectthispage' => 'Beddel amesten n usebter-agi',
 'newpage' => 'Asebter amaynut',
 'talkpage' => 'Mmeslay ɣef usebter-agi',
 'talkpagelinktext' => 'Mmeslay',
@@ -225,6 +243,7 @@ $messages = array(
 'aboutsite' => 'Awal ɣef {{SITENAME}}',
 'aboutpage' => 'Project:Awal ɣef...',
 'copyright' => 'Tzemreḍ ad twaliḍ ayen yella deg $1.',
+'copyrightpage' => '{{ns:project}}:Izerfanɣel',
 'currentevents' => 'Isallen',
 'currentevents-url' => 'Project:Isallen',
 'disclaimers' => 'Iɣtalen',
@@ -253,6 +272,8 @@ $messages = array(
 'youhavenewmessagesmulti' => 'Tesɛiḍ iznan imaynuten deg $1',
 'editsection' => 'beddel',
 'editold' => 'beddel',
+'viewsourceold' => 'ẓeṛ aɣbalu',
+'editlink' => 'beddel',
 'viewsourcelink' => 'ẓeṛ aɣbalu',
 'editsectionhint' => 'Beddel amur: $1',
 'toc' => 'Agbur',
@@ -263,13 +284,15 @@ $messages = array(
 'restorelink' => '{{PLURAL:$1|Yiwen abeddel yettumḥan|$1 Ibeddlen yettumḥan}}',
 'feedlinks' => 'Asuddem:',
 'feed-invalid' => 'Anaw n usuddem mačči ṣaḥiḥ.',
+'site-atom-feed' => 'Taneflit Atom n $1',
+'page-atom-feed' => 'Taneflit Atom n "$1"',
 'red-link-title' => '$1 (ulac asebter)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Amagrad',
 'nstab-user' => 'Asebter n wemseqdac',
 'nstab-media' => 'Asebter n media',
-'nstab-special' => 'Uslig',
+'nstab-special' => 'Asebter uslig',
 'nstab-project' => 'Awal ɣef...',
 'nstab-image' => 'Afaylu',
 'nstab-mediawiki' => 'Izen',
@@ -303,6 +326,13 @@ MySQL yerra-d agul "$3: $4"',
 'readonlytext' => 'Database d tamsekkert, ahat tettuseggem, qrib ad tuɣal-d.
 
 Win (anedbal) isekker-itt yenna-d: $1',
+'missing-article' => 'Taffa n isefka ur t-ufa ara aḍris n yiwen usebter ilaq at af, s-isem « $1 » $2.
+
+Umata, wagi yeḍra mi neḍfeṛ azday ɣer yiwen diff aqbur naɣ ɣer amazray n usebter yemḥan.
+
+Ma mačči d-tajṛut agi, ihi d-taniwit deg uhil.
+Ilaq ad εeggenem yiwen [[Special:ListUsers/sysop|anedbal]] war ad ttum asefkem URL n uzday.',
+'missingarticle-rev' => '(uṭṭun n lqem : $1)',
 'readonly_lag' => 'Database d tamsekkert (weḥdes) axaṭer kra n serveur ɛeṭṭlen',
 'internalerror' => 'Agul zdaxel',
 'filecopyerror' => 'Ur yezmir ara ad yexdem alsaru n ufaylu "$1" ar "$2".',
@@ -340,7 +370,7 @@ Isem n wemseqdac inek yettwaxleq. Ur tettuḍ ara ad tbeddleḍ Isemyifiyen n {{
 'yourname' => 'Isem n wemseqdac',
 'yourpassword' => 'Awal n tbaḍnit',
 'yourpasswordagain' => 'Ɛiwed ssekcem awal n tbaḍnit',
-'remembermypassword' => 'Cfu ɣef wawal n tbaḍnit inu di uselkim-agi (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'remembermypassword' => 'Cfu ɣef wawal n tbaḍnit inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})',
 'yourdomainname' => 'Taɣult inek',
 'externaldberror' => 'Yella ugul aberrani n database neɣ ur tettalaseḍ ara ad tbeddleḍ isem an wemseqdac aberrani inek.',
 'login' => 'Kcem',
@@ -350,11 +380,12 @@ Isem n wemseqdac inek yettwaxleq. Ur tettuḍ ara ad tbeddleḍ Isemyifiyen n {{
 'logout' => 'Ffeɣ',
 'userlogout' => 'Ffeɣ',
 'notloggedin' => 'Ur tekcimeḍ ara',
-'nologin' => "Ur tesɛiḍ ara isem n wemseqdac? '''$1'''.",
+'nologin' => "Ur tesɛiḍ ara isem n umseqdac? '''$1'''.",
 'nologinlink' => 'Xleq isem n wemseqdac',
 'createaccount' => 'Xleq isem n wemseqdac',
 'gotaccount' => "Tesɛiḍ yagi isem n wemseqdac? '''$1'''.",
 'gotaccountlink' => 'Kcem',
+'userlogin-resetlink' => 'Ettuḍ tilɣa n tuqqna ?',
 'createaccountmail' => 's e-mail',
 'badretype' => 'Awal n tbaḍnit amezwaru d wis sin mačči d kif-kif.',
 'userexists' => 'Isem n wemseqdac yeddem-as amdan wayeḍ. Fren yiwen nniḍen.',
@@ -469,6 +500,9 @@ Akken ad txelqeḍ asebter-nni, aru deg tenkult i tella deg ukessar
 Ma tɣelṭeḍ, wekki kan ɣef tqeffalt "Back/Précédent" n browser/explorateur inek.',
 'anontalkpagetext' => "----''Wagi d asebter n umyennan n wemseqdac adrig. Ihi, yessef ad as nefk ID, nesseqdac tansa IP ines akken a t-neɛqel. Tansa IP nni ahat tettuseqdac sɣur aṭṭas n yimdanen. Lukan ula d kečč aqla-k amseqdac adrig u ur tebɣiḍ ara ad tettwabcreḍ izen am wigini, ihi [[Special:UserLogin|xleq isem n wemseqdac neɣ kcem]].''",
 'noarticletext' => 'Ulac aḍris deg usebter-agi, tzemreḍ ad [[Special:Search/{{PAGENAME}}|tnadiḍ ɣef wezwel n usebter-agi]] deg isebtar wiyaḍ neɣ [{{fullurl:{{FULLPAGENAME}}|action=edit}} tettbeddileḍ asebter-agi].',
+'noarticletext-nopermission' => 'Imira ulac aḍris deg usebter agi.
+Tzemreḍ [[Special:Search/{{PAGENAME}}|ad nadiḍ ɣef azwel agi]] deg isebtaren nniḍen,
+naɣ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|asebter={{FULLPAGENAMEE}}}} ad nadiḍ deg iɣmisen iqqenen]</span>.',
 'clearyourcache' => "'''Tamawt:''' Beɛd asmekti, ahat yessefk ad temḥuḍ lkac n browser/explorateur inek akken teẓriḍ ibeddlen. '''Mozilla / Firefox / Safari:''' qqim twekkiḍ ''Shift'' u wekki ɣef ''Reload/Recharger'', neɣ wekki ɣef ''Ctrl-Shift-R'' (''Cmd-Shift-R'' deg Apple Mac); '''IE:''' qqim twekkiḍ ɣef ''Ctrl'' u wekki ɣef ''Refresh/Actualiser'', neɣ wekki ɣef ''Ctrl-F5''; '''Konqueror:''': wekki kan ɣef taqeffalt ''Reload'', neɣ wekki ɣef ''F5''; '''Opera''' yessefk ad tesseqdceḍ ''Tools→Preferences/Outils→Préférences'' akken ad temḥud akk lkac.",
 'usercssyoucanpreview' => "'''Tixidest:''' Sseqdec taqeffalt 'Ssken pre-timeẓriwt' iwakken ad tɛerḍeḍ CSS amynut inek uqbel ad tesmektiḍ.",
 'userjsyoucanpreview' => "'''Tixidest:''' Sseqdec taqeffalt 'Ssken pre-timeẓriwt' iwakken ad tɛerḍeḍ JS amynut inek uqbel ad tesmektiḍ.",
@@ -477,7 +511,10 @@ Ma tɣelṭeḍ, wekki kan ɣef tqeffalt "Back/Précédent" n browser/explorateu
 'userinvalidcssjstitle' => '\'\'\'Aɣtal:\'\'\' Aglim "$1" ulac-it. Ur tettuḍ ara belli isebtar ".css" d ".js" i txedmeḍ sseqdacen azwel i yesɛan isekkilen imecṭuḥen, s umedya: {{ns:user}}:Foo/vector.css akk d {{ns:user}}:Foo/Vector.css.',
 'updated' => '(Yettubeddel)',
 'note' => "'''Tamawt:'''",
-'previewnote' => "'''Tagi d pre-timeẓriwt kan, ibeddlen mazal ur ttusmektin ara!'''",
+'previewnote' => "'''Ttagi d azar-timeẓriwt kan, ibeddlen mazal ur ttusmektin ara!'''
+
+'''Cfut, ttagi d azar-timeẓriwt kan.'''
+Ibeddlen mazal ur ttusmektin ara!",
 'previewconflict' => 'Pre-timeẓriwt-agi tesskan aḍris i yellan deg usawen lemmer tebɣiḍ a tt-tesmektiḍ.',
 'session_fail_preview' => "'''Suref-aɣ! ur nezmir ara a nesmekti abeddil inek axaṭer yella ugur.
 G leɛnayek ɛreḍ tikelt nniḍen. Lukan mazal yella ugur, ffeɣ umbeɛd kcem.'''",
@@ -514,15 +551,27 @@ deg afaylu nniḍen akken tesseqdceḍ-it umbeɛd.'''",
 'protectedpagewarning' => "'''AƔTAL:  Asebter-agi yettwaḥrez, ala inedbalen zemren a t-beddlen'''",
 'semiprotectedpagewarning' => "'''Tamawt:''' Asebter-agi yettwaḥrez, ala imseqdacen i yesɛan isem n wemseqdac zemren a t-beddlen.",
 'cascadeprotectedwarning' => "'''Aɣtal:''' Asebter-agi iɛekkel iwakken ad zemren ala inedbalen a t-beddlen, axaṭer yettwassekcem deg isebtar i yettwaḥerzen agi (acercur):",
-'templatesused' => 'Talɣiwin ttuseqdacen deg usebter-agi:',
+'templatesused' => '{{PLURAL:$1|Talɣa i seqdacen|Tilɣatin i seqdacen}} deg usebter agi :',
 'templatesusedpreview' => 'Talɣiwin ttuseqdacen deg pre-timeẓriwt-agi:',
 'templatesusedsection' => 'Talɣiwin ttuseqdacen deg amur-agi:',
 'template-protected' => '(yettwaḥrez)',
 'template-semiprotected' => '(nnefṣ-yettwaḥrez)',
+'hiddencategories' => 'Asebter agi yella deg {{PLURAL:$1|Taggayt i ffren|Tiggayin i ffren}} agi :',
 'edittools' => '<!-- Aḍris yettbanen-d seddaw talɣa n ubeddil d uzen. -->',
 'nocreatetitle' => 'Axleq n isebtar meḥdud',
 'nocreatetext' => 'Adeg n internet agi iḥedded axleq n isebtar imaynuten.
 Tzemreḍ a d-uɣaleḍ u tbeddleḍ asebter i yellan, neɣ ad [[Special:UserLogin|tkecmeḍ neɣ ad txelqeḍ isem n wemseqdac]].',
+'permissionserrorstext-withaction' => 'Ur sɛiḍ ara ttesriḥ af $2, i {{PLURAL:$1|taɣẓint|tiɣẓinin}} agi :',
+'recreate-moveddeleted-warn' => "'''Ɣur-wet : asebter agi i tebɣam ad snulfum, yetwekkes uqbel.'''
+
+Ilaq ad snulfum asebter agi haca ma i xater. Aɣmis n isebtaren i twekkesen yella ddaw-agi :",
+'moveddeleted-notice' => 'Asebter agi yetwekkes. Aɣmis n isebtaren i twekkesen yella ddaw agi.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Ɣur-wet : Asebter agi yesɛa aṭas tilɣatin. Kra n tilɣatin ur zemrent ara ad seqdacent.',
+'post-expand-template-inclusion-category' => 'Isebtaren i sɛan aṭas tilɣatin',
+'post-expand-template-argument-warning' => "'''Ɣur-wet''' : Asebter agi yesɛa tuccḍa deg aɣewwar n yiwet talɣa.",
+'post-expand-template-argument-category' => 'Isebtaren i sɛan iɣewwaren n talɣa ur skazelen ara',
 
 # "Undo" feature
 'undo-success' => 'Tzemreḍ ad tessefsuḍ abeddil. Ssenqed asidmer akken ad tessneḍ ayen tebɣiḍ ad txdmeḍ d ṣṣeḥ, umbeɛd smekti ibeddlen u tkemmleḍ ad tessefsuḍ abeddil.',
@@ -536,6 +585,7 @@ Tzemreḍ a d-uɣaleḍ u tbeddleḍ asebter i yellan, neɣ ad [[Special:UserLog
 'viewpagelogs' => 'Ẓer aɣmis n usebter-agi',
 'nohistory' => 'Ulac amezruy n yibeddlen i usebter-agi.',
 'currentrev' => 'Tasiwelt n tura',
+'currentrev-asof' => 'Azmez n lqem taneggarut d  $1',
 'revisionasof' => 'Tasiwelt n wass $1',
 'revision-info' => 'Tasiwelt n wass $1 sɣur $2',
 'previousrevision' => '←Tasiwelt taqdimt',
@@ -549,6 +599,8 @@ Tzemreḍ a d-uɣaleḍ u tbeddleḍ asebter i yellan, neɣ ad [[Special:UserLog
 'histlegend' => 'Axtiri n umgerrad: rcem tankulin akken ad teẓreḍ imgerraden ger tisiwal u wekki ɣef enter/entrée neɣ ɣef taqeffalt deg ukessar.<br />
 Tabadut: (tura) = amgirred akk d tasiwelt n tura,
 (amgirred) = amgirred akk d tasiwelt ssabeq, M = abeddel afessas.',
+'history-fieldset-title' => 'Inig deg umazray',
+'history-show-deleted' => 'Ekkes kan',
 'histfirst' => 'Tikkin timezwura',
 'histlast' => 'Tikkin tineggura',
 'historysize' => '($1 bytes/octets)',
@@ -594,16 +646,24 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'revdelete-submit' => 'Eg-it i tasiwelt tettwafren',
 'revdelete-success' => "'''Asekkud n tasiwelt yettuxdem.'''",
 'logdelete-success' => "'''Asekkud n tamirt yettuxdem.'''",
+'revdel-restore' => 'beddel timezrit',
+'revdel-restore-deleted' => 'allas iqḍeεen',
+'revdel-restore-visible' => 'allas i nezmer an ẓeṛ',
+
+# Merge log
+'revertmerge' => 'Fru',
 
 # Diffs
+'history-title' => 'Amazray n allasen n "$1"',
 'difference' => '(Imgerraden ger tisiwal)',
 'lineno' => 'Ajerriḍ $1:',
 'compareselectedversions' => 'Ẓer imgerraden ger tisiwal i textareḍ',
 'editundo' => 'ssefsu',
-'diff-multi' => '({{PLURAL:$1|Yiwen tasiwelt tabusarit|$1 n tisiwal tibusarin}} ur ttumlalent ara.)',
+'diff-multi' => '({{PLURAL:$1|Yiwet tasiwelt tabusarit|$1 n tisiwal tibusarin}} af {{PLURAL:$2|amseqdac|$2 imseqdacen}} {{PLURAL:$1|ur ttumlal ara|ur ttumlalent ara}})',
 
 # Search results
 'searchresults' => 'Igmad n unadi',
+'searchresults-title' => 'Igmad n unadi i "$1"',
 'searchresulttext' => 'Akken ad tessneḍ amek ara tnadiḍ deg {{SITENAME}}, ẓer [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => "Tnadiḍ ɣef '''[[:$1]]'''",
 'searchsubtitleinvalid' => "Tnadiḍ ɣef '''$1'''",
@@ -613,15 +673,38 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'notextmatches' => 'ulac ayen yecban azwel n usebter',
 'prevn' => '{{PLURAL:$1|$1}} ssabeq',
 'nextn' => '{{PLURAL:$1|$1}} ameḍfir',
+'prevn-title' => '$1 {{PLURAL:$1|agmud n uqbel|igmad n uqbel}}',
+'nextn-title' => '$1 {{PLURAL:$1|agmud n sakin|igmad n sakin}}',
+'shown-title' => 'Beqqeḍ $1 {{PLURAL:$1|agmud|igmad}} s usebter',
 'viewprevnext' => 'Ẓer ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-exists' => "'''Yella asebter s isem \"[[:\$1]]\" deg wiki agi.'''",
+'searchmenu-new' => "'''Snulfud asebter « [[:$1|$1]] » deg wiki agi !'''",
 'searchhelp-url' => 'Help:Agbur',
+'searchprofile-articles' => 'Isebtaren n ugbur',
+'searchprofile-project' => 'Isebtaren n tallat dɣa n usenfa',
+'searchprofile-images' => 'Agetmedia',
+'searchprofile-everything' => 'Akk',
+'searchprofile-advanced' => 'Anadi anemhal',
+'searchprofile-articles-tooltip' => 'Nadi deg $1',
+'searchprofile-project-tooltip' => 'Nadi deg $1',
+'searchprofile-images-tooltip' => 'Nadi  ifuyla agetmedia',
+'searchprofile-everything-tooltip' => 'Nadi deg akk usmel (ula deg isebtaren n umyannan)',
+'searchprofile-advanced-tooltip' => 'Fren ideggen n isemawen i unadi',
 'search-result-size' => '$1 ({{PLURAL:$2|1 awal|$2 awalen}})',
+'search-result-category-size' => '$1 {{PLURAL:$1|amseqdac|imseqdacen}} $2 ({{PLURAL:$2|adu-taggayt|adu-tiggayin}}, $3 {{PLURAL:$3|afaylu|ifuyla}})',
+'search-redirect' => '(asemmimeḍ $1)',
+'search-section' => '(tigezmi $1)',
+'search-suggest' => 'D awal $1 i tnadiḍ ?',
+'searchrelated' => 'ineqqes',
+'searchall' => 'akk',
 'showingresults' => "Tamuli n {{PLURAL:$1|'''Yiwen''' wegmud|'''$1''' n yigmad}} seg  #'''$2'''.",
 'showingresultsnum' => "Tamuli n {{PLURAL:$3|'''Yiwen''' wegmud|'''$3''' n yigmad}} seg  #'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Agmud '''$1'''|Igmad '''$1–$2'''}} n '''$3''' i '''$4'''",
 'nonefound' => "'''Tamawt''': S umata, asmi ur tufiḍ acemma
 d ilmen awalen am \"ala\" and \"seg\",
 awalen-agi mačči deg tasmult, neɣ tefkiḍ kter n yiwen n wawal (ala isebtar
 i yesɛan akk awalen i banen-d).",
+'search-nonefound' => 'Ulac igmad i usuter agi.',
 'powersearch' => 'Nadi',
 'searchdisabled' => 'Anadi deg {{SITENAME}} yettwakkes. Tzemreḍ ad tnadiḍ s Google. Meɛna ur tettuḍ ara, tasmult n google taqdimt.',
 
@@ -677,6 +760,7 @@ i yesɛan akk awalen i banen-d).",
 'badsig' => 'Azmul mačči d ṣaḥiḥ; Ssenqed tags n HTML.',
 'prefs-help-realname' => '* Isem n ṣṣeḥ (am tebɣiḍ): ma textareḍ a t-tefkeḍ, ad yettuseqdac iwakken ad snen medden anwa yura tikkin inek.',
 'prefs-help-email' => '* E-mail (am tebɣiḍ): Teǧǧi imseqdacen wiyaḍ a k-aznen email mebla ma ẓren tansa email inek.',
+'prefs-help-email-others' => 'Zemreḍ ad eǧǧeḍ wiyeḍ nniḍen ak(akem) cceqɛen izen deg usebter-ik (im) n umyannan war ad effekeḍ tamagit-ik (im).',
 
 # User rights
 'userrights' => 'Laɛej iserfan n wemseqdac',
@@ -704,15 +788,24 @@ i yesɛan akk awalen i banen-d).",
 'rightslogentry' => 'Yettubeddel izerfan n wemseqdac $1 seg $2 ar $3',
 'rightsnone' => '(ulaḥedd)',
 
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'beddel asebter agi',
+
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Abeddel|Ibeddlen}}',
 'recentchanges' => 'Ibeddlen imaynuten',
+'recentchanges-legend' => 'Tifranin n ibeddilen imaynuten',
 'recentchangestext' => 'Ḍfer ibeddilen imaynuten n {{SITENAME}}.',
 'recentchanges-feed-description' => 'Ḍfer ibeddilen imaynuten n wiki-yagi deg usuddem-agi.',
-'rcnote' => "Deg ukessar {{PLURAL:$1|yella '''yiwen''' ubeddel aneggaru|llan '''$1''' n yibeddlen ineggura}} deg {{PLURAL:$2|wass aneggaru|'''$2''' wussan ineggura}}, deg uzemz $3.",
+'recentchanges-label-newpage' => 'Abeddel agi ad yesnulfu asebter amaynut',
+'recentchanges-label-minor' => 'Wagi d-abeddel amectuḥ',
+'recentchanges-label-bot' => 'D-arubut id yeseqdacen abeddel agi',
+'recentchanges-label-unpatrolled' => 'Abeddel agi mazal yesɛa aselken.',
+'rcnote' => "Deg ukessar {{PLURAL:$1|yella '''yiwen''' ubeddel aneggaru|llan '''$1''' n yibeddlen ineggura}} deg {{PLURAL:$2|wass aneggaru|'''$2''' wussan ineggura}}, deg uzemz $5 ass n $4.",
 'rcnotefrom' => "Deg ukessar llan ibeddlen seg wasmi '''$2''' (ar '''$1''').",
 'rclistfrom' => 'Ssken ibeddlen imaynuten seg $1',
 'rcshowhideminor' => '$1 ibeddlen ifessasen',
+'rcshowhidebots' => '$1 irubuten',
 'rcshowhideliu' => '$1 n yimseqdacen i ikecmen',
 'rcshowhideanons' => '$1 n yimseqdacen udrigen',
 'rcshowhidepatr' => '$1 n yibeddlen yettwassenqden',
@@ -722,15 +815,24 @@ i yesɛan akk awalen i banen-d).",
 'hist' => 'Amezruy',
 'hide' => 'Ffer',
 'show' => 'Ssken',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[$1 aɛessas/iɛessasen]',
 'rc_categories' => 'Ḥedded i taggayin (ferreq s "|")',
 'rc_categories_any' => 'Ulayɣer',
+'rc-enhanced-expand' => 'Ẓeṛ tilɣa (yeḥwaǧ JavaScript)',
+'rc-enhanced-hide' => 'Ffer tilɣa',
 
 # Recent changes linked
 'recentchangeslinked' => 'Ibeddlen imaynuten n isebtar myezdin',
 'recentchangeslinked-feed' => 'Ibeddlen imaynuten n isebtar myezdin',
 'recentchangeslinked-toolbox' => 'Ibeddlen imaynuten n isebtar myezdin',
+'recentchangeslinked-title' => 'Tiḍefri n isebtaren iqqenen ar « $1 »',
 'recentchangeslinked-noresult' => 'Ulac abeddel deg isebtar myezdin deg tawala i textareḍ.',
+'recentchangeslinked-summary' => "Asebter uslig agi i sekned ibeddlen imaynuten ɣef isebtaren iqqenen. Isebtaren n [[Special:Watchlist|umuɣ n uḍfar]] llan s '''ufuyan'''.",
+'recentchangeslinked-page' => 'Isen n usebter :',
+'recentchangeslinked-to' => 'Beqqeḍ ibeddilen n isebtareb i sɛan azday ɣer asebter nni wala anemgal',
 
 # Upload
 'upload' => 'Azen afaylu',
@@ -822,12 +924,22 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 
 # File description page
 'file-anchor-link' => 'Afaylu',
+'filehist' => 'Amazray n tugna',
+'filehist-help' => 'Senned ɣef yiwen azmez d usrag iwakken ad ẓṛeḍ afaylu aken yella deg imir nni.',
+'filehist-revert' => 'Uɣal ar tasiwelt ssabeq',
 'filehist-current' => 'Lux a',
+'filehist-datetime' => 'Azmez/Asrag',
+'filehist-thumb' => 'Tugna tamecṭuḥt',
+'filehist-thumbtext' => 'Tugna tamectuḥt i lqem n $1',
 'filehist-user' => 'Amseqdac',
+'filehist-dimensions' => 'Iseggiwen',
+'filehist-comment' => 'Awennit',
 'imagelinks' => 'Izdayen',
-'linkstoimage' => 'isebtar-agi sɛan azday ar afaylu-agi',
+'linkstoimage' => '{{PLURAL:$1|Asebter agi teseqdac|$1 isebtaren agi teseqdacen}} afaylu agi :',
 'nolinkstoimage' => 'Ulaḥedd seg isebtar sɛan azday ar afaylu-agi.',
 'sharedupload' => 'Afaylu-yagi yettuseqdac sɣur wiki tiyaḍ.',
+'sharedupload-desc-here' => 'Afaylu agi yusad seg : $1. Ahat yeseqdec deg isenfaṛen nniḍen.
+Aglam-is ɣef [$2 asebter n aglam] ye beqqeḍ ddaw-agi.',
 'uploadnewversion-linktext' => 'tazneḍ tasiwelt tamaynut n ufaylu-yagi',
 
 # MIME search
@@ -898,7 +1010,7 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 'mostcategories' => 'Isebtar i yesɛan aṭṭas taggayin',
 'mostimages' => 'Tugniwin myezdin aṭas',
 'mostrevisions' => 'Isebtar i yettubedlen aṭas',
-'prefixindex' => 'Akk isebtar s yisekkilen imezwura',
+'prefixindex' => 'Akk isebtaren s yisekkilen imezwura',
 'shortpages' => 'isebtar imecṭuḥen',
 'longpages' => 'Isebtar imeqqranen',
 'deadendpages' => 'isebtar mebla izdayen',
@@ -907,6 +1019,7 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 'protectedpagestext' => 'isebtar-agi yettwaḥerzen seg ubeddel neɣ asemmimeḍ',
 'protectedpagesempty' => 'isebtar-agi ttwaḥerzen s imsektayen -agi.',
 'listusers' => 'Umuɣ n yimseqdacen',
+'usercreated' => '{{GENDER:$3|Yesnulfu-d}} ass n $1 ar $2',
 'newpages' => 'isebtar imaynuten',
 'newpages-username' => 'Isem n wemseqdac:',
 'ancientpages' => 'isebtar iqdimen',
@@ -916,6 +1029,8 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 'unusedcategoriestext' => 'Taggayin-agi weǧden meɛna ulac isebtar neɣ taggayin i sseqdacen-iten.',
 'notargettitle' => 'Ulac nnican',
 'notargettext' => 'Ur textareḍ ara asebter d nnican neɣ asebter n wemseqdac d nnican.',
+'pager-newer-n' => '{{PLURAL:$1|amaynut|$1 imaynuten}}',
+'pager-older-n' => '{{PLURAL:$1|aqbur|$1 iqburen}}',
 
 # Book sources
 'booksources' => 'Iɣbula n yidlisen',
@@ -955,11 +1070,20 @@ Tzemreḍ ad textareḍ cwiṭ seg-sen ma tebɣiḍ.',
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
+# Special:LinkSearch
+'linksearch-line' => '$1 yeqqen seg $2',
+
 # Special:ListUsers
 'listusersfrom' => 'Ssken imseqdacen seg:',
 'listusers-submit' => 'Ssken',
 'listusers-noresult' => 'Ur yufi ḥedd (amseqdac).',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Aɣmis n isnulfan n  imiḍanen n imseqdacen',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(umuɣ n imseqdacen)',
+
 # E-mail user
 'mailnologin' => 'Ur yufi ḥedd (tansa)',
 'mailnologintext' => 'Yessefk ad [[Special:UserLogin|tkecmeḍ]] u tesɛiḍ tansa e-mail ṭaṣhiḥt deg [[Special:Preferences|isemyifiyen]] inek
@@ -987,6 +1111,7 @@ deg « Expéditeur» n izen inek iwakken amseqdac-nni yezmer a k-yerr.',
 # Watchlist
 'watchlist' => 'Umuɣ n uɛessi inu',
 'mywatchlist' => 'Umuɣ n uɛessi inu',
+'watchlistfor2' => 'I $1 $2',
 'nowatchlist' => 'Umuɣ n uɛessi inek d ilem.',
 'watchlistanontext' => 'G leɛnaya-k $1 iwakken ad twalaḍ neɣ tbeddleḍ iferdas deg wumuɣ n uɛessi inek.',
 'watchnologin' => 'Ur tekcimeḍ ara',
@@ -1003,7 +1128,7 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'unwatchthispage' => 'Fakk aɛassi',
 'notanarticle' => 'Mačči d amagrad',
 'watchnochange' => 'Ulaḥedd n yiferdas n wumuɣ n uɛessi inek ma yettubeddel deg tawala i textareḍ.',
-'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtar}} mebla isebtar "amyannan".',
+'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
 'wlheader-enotif' => '* Yeǧǧa Email n talɣut.',
 'wlheader-showupdated' => "* Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s '''uḍris aberbuz'''",
 'watchmethod-recent' => 'yessenqed ibeddlen imaynuten n isebtar i ttɛasseɣ',
@@ -1012,6 +1137,7 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'iteminvalidname' => "Agnu akk d uferdis '$1', isem mačči ṣaḥiḥ...",
 'wlnote' => "Deg ukessar {{PLURAL:$1|yella yiwen ubeddel aneggaru|llan '''$1''' n yibeddlen ineggura}} deg {{PLURAL:$2|saɛa taneggarut|'''$2''' swayeɛ tineggura}}.",
 'wlshowlast' => 'Ssken $1 n swayeɛ $2 n wussan neɣ $3 ineggura',
+'watchlist-options' => 'Tifranin n umuɣ n uɛessi',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Ad iɛass...',
@@ -1058,6 +1184,7 @@ Tadhelt:
 'exblank' => 'asebter yella d ilem',
 'historywarning' => 'Aɣtal: Asebter i ara temḥuḍ yesɛa amezruy:',
 'actioncomplete' => 'Axdam yekfa',
+'actionfailed' => 'Tigawt agi texser',
 'deletedtext' => '"$1" yettumḥa.
 Ẓer $2 i aɣmis n yimḥayin imaynuten.',
 'dellogpage' => 'Aɣmis n umḥay',
@@ -1067,6 +1194,7 @@ Tadhelt:
 'deletecomment' => 'Ayɣer',
 
 # Rollback
+'rollbacklink' => 'semmet',
 'cantrollback' => 'Ur yezmir ara ad yessuɣal; yella yiwen kan amseqdac iwumi ibeddel/yexleq asebter-agi.',
 'editcomment' => "Agzul n ubeddel yella: \"''\$1''\".",
 'revertpage' => 'Yessuɣal ibeddlen n [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]]); yettubeddel ɣer tasiwelt taneggarut n [[User:$1|$1]]',
@@ -1095,6 +1223,8 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 
 # Undelete
 'viewdeletedpage' => 'Ẓer isebtar yettumḥan',
+'undeletelink' => 'ẓeṛ/uɣaled',
+'undeleteviewlink' => 'ẓeṛ',
 'undeletecomment' => 'Awennit:',
 'undelete-header' => 'Ẓer [[Special:Log/delete|aɣmis n umḥay]] i isebtar ttumḥan tura.',
 'undelete-search-box' => 'Nadi ɣef isebtar yettumḥan',
@@ -1109,42 +1239,63 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 
 # Contributions
 'contributions' => 'Tikkin n wemseqdac',
+'contributions-title' => 'Umuɣ n tikkin n umseqdac $1',
 'mycontris' => 'Tikkin inu',
 'contribsub2' => 'n $1 ($2)',
 'nocontribs' => 'Ur yufi ara abddel i tebɣiḍ.',
 'uctop' => '(taneggarut)',
+'month' => 'Seg uggur (d wid uqbel) :',
+'year' => 'Seg useggwas (d wid uqbel) :',
 
 'sp-contributions-newbies' => 'Ssken tikkin n yimseqdacen imaynuten kan',
 'sp-contributions-newbies-sub' => 'I yisem yimseqdacen imaynuten',
 'sp-contributions-blocklog' => 'Aɣmis n uɛeṭṭil',
+'sp-contributions-uploads' => 'izdamen',
+'sp-contributions-logs' => 'iɣmisen',
 'sp-contributions-talk' => 'Mmeslay',
-'sp-contributions-userrights' => 'Laɛej iserfan n wemseqdac',
+'sp-contributions-userrights' => 'Laɛej iserfan n umseqdac',
 'sp-contributions-search' => 'Nadi i tikkin',
 'sp-contributions-username' => 'Tansa IP neɣ isem n wemseqdac:',
+'sp-contributions-toponly' => 'Sekned kan imagraden i beddeleɣ nekk d-aneggaru',
 'sp-contributions-submit' => 'Nadi',
 
 # What links here
 'whatlinkshere' => 'Ayen i d-yettawi ɣer da',
+'whatlinkshere-title' => 'Isebtaren i sɛan azday ɣer « $1 »',
+'whatlinkshere-page' => 'Asebter :',
 'linkshere' => "Isebtar-agi sɛan azday ɣer '''[[:$1]]''':",
 'nolinkshere' => "Ulac asebter i yesɛan azday ɣer '''[[:$1]]'''.",
 'nolinkshere-ns' => "Ulac asebter i yesɛan azday ɣer '''[[:$1]]''' deg yisem n taɣult i textareḍ.",
 'isredirect' => 'Asebter n usemmimeḍ',
 'istemplate' => 'asekcam',
+'isimage' => 'azday ɣer afaylu',
 'whatlinkshere-prev' => '{{PLURAL:$1|ssabeq|$1 ssabeq}}',
 'whatlinkshere-next' => '{{PLURAL:$1|ameḍfir|$1 imeḍfiren}}',
 'whatlinkshere-links' => '← izdayen',
+'whatlinkshere-hideredirs' => '$1 aceggeε ɣer',
+'whatlinkshere-hidetrans' => '$1 aseddu',
+'whatlinkshere-hidelinks' => '$1 izdayen',
+'whatlinkshere-hideimages' => '$1 tugniwin i qqenen',
+'whatlinkshere-filters' => 'Tistaytin',
 
 # Block/unblock
 'blockip' => 'Ɛekkel amseqdac',
 'ipadressorusername' => 'Tansa IP neɣ isem n wemseqdac',
 'ipbreason' => 'Ayɣer',
 'ipbsubmit' => 'Ɛekkel amseqdac-agi',
+'ipboptions' => '2 isragen:2 hours,1 ass:1 day,3 ussan:3 days,1 imalas:1 week,2  imulas:2 weeks,1 aggur:1 month,3 igguren:3 months,6 igguren:6 months,1 aseggwas:1 year,afdi:infinite',
 'ipbotheroption' => 'nniḍen',
 'badipaddress' => 'Tansa IP mačči d ṣaḥiḥ',
+'ipblocklist' => 'imseqdacen isewḥelen',
 'ipblocklist-submit' => 'Nadi',
 'blocklink' => 'ɛekkel',
+'unblocklink' => 'ekkes asewḥel',
+'change-blocklink' => 'beddel asewḥel',
 'contribslink' => 'tikkin',
+'blocklogpage' => 'Aɣmis n isewḥelen',
+'blocklogentry' => 'yesewḥel [[$1]] ; alama : $2 $3',
 'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
+'block-log-flags-nocreate' => 'asnulfu n umiḍan yessegdel',
 'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
 'proxyblocksuccess' => 'D ayen.',
 'sorbsreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy" deg DNSBL yettuseqdac da.',
@@ -1209,6 +1360,7 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'allmessagestext' => 'Wagi d umuɣ n izen n system i yellan deg yisem n taɣult.
 Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' ut yezmir ara ad yettuseqdac axaṭer '''\$wgUseDatabaseMessages''' yettwakkes.",
+'allmessages-language' => 'Tutlayt :',
 
 # Thumbnails
 'thumbnail-more' => 'Ssemɣer',
@@ -1243,9 +1395,9 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'import-logentry-interwiki-detail' => '$1 tasiwelt(tisiwal) seg $2',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Asebter n wemseqdac inu',
+'tooltip-pt-userpage' => 'Asebter n umseqdac inu',
 'tooltip-pt-anonuserpage' => 'Asebter n wemseqdac n IP wukud tekkiḍ',
-'tooltip-pt-mytalk' => 'Asebter n wemyannan inu',
+'tooltip-pt-mytalk' => 'Asebter n umyannan inu',
 'tooltip-pt-anontalk' => 'Amyannan ɣef yibeddlen n tansa ip-yagi',
 'tooltip-pt-preferences' => 'Isemyifiyen inu',
 'tooltip-pt-watchlist' => 'Umuɣ n uɛessi n isebtar i ttɛessaɣ',
@@ -1265,9 +1417,11 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-ca-watch' => 'Rnu asebter-agi i wumuɣ n uɛessi inek',
 'tooltip-ca-unwatch' => 'Kkes asebter-agi seg wumuɣ n uɛessi inek',
 'tooltip-search' => 'Nadi {{SITENAME}}',
+'tooltip-search-go' => 'Ṛuḥ ɣer usebter i sɛan isem agi ma yella.',
 'tooltip-search-fulltext' => 'Nadi isebtar i sɛan aḍris agi',
 'tooltip-p-logo' => 'Asebter amenzawi',
 'tooltip-n-mainpage' => 'Ẓer asebter amenzawi',
+'tooltip-n-mainpage-description' => 'Rzu asebter amenzawi',
 'tooltip-n-portal' => 'Ɣef usenfar, ayen tzemrḍ ad txedmeḍ, anda tafeḍ tiɣawsiwin',
 'tooltip-n-currentevents' => 'Af ayen yeḍran tura',
 'tooltip-n-recentchanges' => 'Umuɣ n yibeddlen imaynuten deg wiki.',
@@ -1281,6 +1435,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-t-emailuser' => 'Azen e-mail i wemseqdac-agi',
 'tooltip-t-upload' => 'Azen ifuyla',
 'tooltip-t-specialpages' => 'Umuɣ n akk isebtar usligen',
+'tooltip-t-print' => 'Lqem tasiggezt n usebter agi',
+'tooltip-t-permalink' => 'Azday ameɣlal ɣer lqem agi n usebter',
 'tooltip-ca-nstab-main' => 'Ẓer ayen yellan deg usebter',
 'tooltip-ca-nstab-user' => 'Ẓer asebter n wemseqdac',
 'tooltip-ca-nstab-media' => 'Ẓer asebter n media',
@@ -1298,6 +1454,9 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-compareselectedversions' => 'Ẓer amgirred ger snat tisiwlini (i textareḍ) n usebter-agi.',
 'tooltip-watch' => 'Rnu asebter-agi i wumuɣ n uɛessi inu',
 'tooltip-recreate' => 'Ɛiwed xleq asebter ɣas akken yettumḥu',
+'tooltip-rollback' => '« Semmet » yesemmet s-yiwen asenned akk d-acu amseqdac aneggaru yebeddel deg usebter',
+'tooltip-undo' => '« Ssefsu » yesemmet abeddel agi dɣa i ldi asfaylu n ubeddel deg uskar n azaraskan. I ɛemmed an uɣal ar lqem n uqbel dɣa an rnu taɣẓint deg tanaka n ugzul.',
+'tooltip-summary' => 'Sekcem agzul awezzlan',
 
 # Attribution
 'anonymous' => 'Amseqdac udrig (Imseqdacen udrigen) n {{SITENAME}}',
@@ -1344,6 +1503,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'file-info' => 'tiddi n ufaylu: $1, anaw n MIME: $2',
 'file-info-size' => '$1 × $2 pixel, tiddi n ufaylu: $3, anaw n MIME: $4',
 'file-nohires' => 'Ulac resolution i tameqqrant fell-as.',
+'svg-long-desc' => 'Afaylu SVG, tabadut n $1 × $2 pixel, lqedd : $3',
 'show-big-image' => 'Resolution tameqqrant',
 
 # Special:NewFiles
@@ -1360,6 +1520,24 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 Ala umuɣen n ismiwar (i bdun s *) ddemen s amiḍan. Azday amezwaru n ujerriḍ ilaq ad yilli win n tugna icmeten.
 Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna tezmer at illi.',
 
+# Metadata
+'metadata' => 'Adferisefka',
+'metadata-help' => 'Afaylu agi, yesɛa tilɣa tisutay, ahat d-tamsaknewt id ernan tilɣa agi. Ma afaylu yebeddel seg addad-is amezwaru, ahat kra n tilɣa ur zemrent ara ad illint d-timekdant s-ufaylu amiran.',
+'metadata-fields' => 'Urtan n adferisefka n tugniwin yellan deg umuɣ n izen agi, ad seddun deg usebter n aglam n tugna mi ṭabla n adferisefka at illi tesemẓi. Urtan nniḍen ad illin ffren m-ulac.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
 # EXIF tags
 'exif-imagewidth' => 'Tehri',
 
@@ -1485,10 +1663,27 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'watchlisttools-edit' => 'Ẓer u beddel umuɣ n uɛessi',
 'watchlisttools-raw' => 'Beddel umuɣ n uɛessi (raw)',
 
+# Core parser functions
+'duplicate-defaultsort' => 'Ɣur-wet : tasarut n ufran m-ulac « $2 » atsefεej tasarut n uqbel « $1 ».',
+
 # Special:Version
 'version' => 'Tasiwelt',
+'version-specialpages' => 'isebtar usligen',
 
 # Special:SpecialPages
 'specialpages' => 'isebtar usligen',
 
+# External image whitelist
+'external_image_whitelist' => ' #Eǧǧ ajeṛṛiḍ agi aken yella.<pre>
+#Inid tifersa n tinfaliyin timeɣẓanin (ala tama yellan gar //) ddaw-agi.
+#Ad qqenen s URL n tugniwin timniriyin.
+#Tid i qqenen ad beqqeḍent am tugniwin, m-ulac ad i beqqeḍ kan azday ɣer tugna.
+#Ijeṛṛiḍen i bdun s yiwen # ad ilin εqelen am iwenniten.
+#Umuɣ agi ur yeseqdac ara aselken n isekkilen.
+
+#Ger akk tifersa n tinfaliyin timeɣẓanin nnig ajeṛṛiḍ  agi. Eǧǧ ajeṛṛiḍ agi aken yella.</pre>',
+
+# Special:Tags
+'tag-filter' => 'Astay n [[Special:Tags|ticraḍ]] :',
+
 );
index a9ce9e3..06fc6b7 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Erdemaslancan
  * @author Mirzali
  */
 
@@ -390,9 +391,9 @@ Kerem kerê, deqêna oncia bıcerrebnê.",
 'protectedpagetext' => 'Na pele vurnaisu rê qapan biya.',
 'viewsourcetext' => 'Sıma şikinê çımê na pele bıvênê u kopya kerê:',
 'protectedinterface' => "Na pele ''software'' rê meqalunê caunê bırnau dana, u qapana ke suıstımalu rê engel bo.",
-'editinginterface' => "'''Teme:''' Sıma hao jü pela ke serba ''software'' meqalunê caunê bırnau dana, vurnenê.
+'editinginterface' => "'''Teme:''' Sıma hao jü pela ke serba nustê meqalunê caunê bırnau dana, vurnenê.
 Vurnaisê na pele karberunê binu rê serpela karberi kena ke bıasno.
-Serba çarnais, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]yê procê dos-kerdene rê diqet kerê.",
+Serba çarnaişi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]i ra procêdoskerdene rê diqet kerê.",
 'sqlhidden' => '(Persê SQLi nımıteo)',
 'cascadeprotected' => 'Na pele esterıtene ra sıtar biya, çıke na zerrê {{PLURAL:$1|pela ke|pelunê ke}} dera/derê be "cascading" opsiyoni kılit biya, $2 de bena ra.',
 'namespaceprotected' => "'''$1''' ''namespace'' de desturê sıma be vurnaisê pelu çino.",
index e7ee7a2..18742c8 100644 (file)
@@ -8,6 +8,8 @@
  * @file
  *
  * @author AlefZet
+ * @author Alibek Kisybay
+ * @author Daniyar
  * @author GaiJin
  * @author Kaztrans
  * @author Urhixidur
@@ -368,35 +370,35 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Тексерілген беттерді жаңа беттер тізімінде көрсетпеу',
 'tog-extendwatchlist' => 'Бақылау тізімді ұлғайту (барлық жарамды өзгерістерді көрсету)',
 'tog-usenewrc' => 'Кеңейтілген жуықтағы өзгерістер (JavaScript)',
-'tog-numberheadings' => 'Бас жолдарды өздіктік номірле',
-'tog-showtoolbar' => 'Өңдеу қуралдар жолағын көрсет (JavaScript)',
+'tog-numberheadings' => 'Бас жолдарды дағдылы нөмірле',
+'tog-showtoolbar' => 'Өңдеу құралдары жолағын көрсет (JavaScript)',
 'tog-editondblclick' => 'Қос шерту арқылы бетті өңдеу (JavaScript)',
 'tog-editsection' => 'Бөлімдерді [өңдеу] сілтемесімен өңдеуін қос',
 'tog-editsectiononrightclick' => 'Бөлім тақырыбын оң нұқумен өңдеуін қос (JavaScript)',
-'tog-showtoc' => 'Мазмұнын көрсет (3-тен арта бөлімі барыларға)',
-'tog-rememberpassword' => 'Ð\9aÑ\96Ñ\80генÑ\96мдÑ\96 Ð¾Ñ\81Ñ\8b ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82ерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
-'tog-watchcreations' => 'Ð\9cен Ð±Ð°Ñ\81Ñ\82аÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchdefault' => 'Ð\9cен Ó©Ò£Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchmoves' => 'Ð\9cен Ð¶Ñ\8bлжÑ\8bÑ\82Ò\9bан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchdeletion' => 'Ð\9cен Ð¶Ð¾Ð¹Ò\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
+'tog-showtoc' => 'Мазмұнын көрсет (3-тен арта бөлімі барларға)',
+'tog-rememberpassword' => 'ТÑ\96Ñ\80келгÑ\96мдÑ\96 Ð¾Ñ\81Ñ\8b Ð±Ñ\80аÑ\83зерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
+'tog-watchcreations' => 'Ð\9cен Ð±Ð°Ñ\81Ñ\82аÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchdefault' => 'Ð\9cен Ó©Ò£Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchmoves' => 'Ð\9cен Ð¶Ñ\8bлжÑ\8bÑ\82Ò\9bан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchdeletion' => 'Ð\9cен Ð¶Ð¾Ð¹Ò\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
 'tog-minordefault' => 'Әдепкіден барлық өңдемелерді шағын деп белгіле',
-'tog-previewontop' => 'Қарап шығу аумағы кірістіру орны алдында',
+'tog-previewontop' => 'Қарап шығу аумағын кірістіру орнының алдында',
 'tog-previewonfirst' => 'Бірінші өңдегенде қарап шығу',
 'tog-nocache' => 'Бет бүркемелеуін өшір',
-'tog-enotifwatchlistpages' => 'Ð\91аÒ\9bÑ\8bлаÑ\83Ñ\8bÒ£Ñ\8bздаÒ\93Ñ\8b Ð±ÐµÑ\82 Ó©Ð·Ð³ÐµÑ\80генде Ðµ-паштаға хабарлама жіберу',
+'tog-enotifwatchlistpages' => 'Ð\91аÒ\9bÑ\8bлаÑ\83Ñ\8bÒ£Ñ\8bздаÒ\93Ñ\8b Ð±ÐµÑ\82 Ó©Ð·Ð³ÐµÑ\80генде Ðµ-поштаға хабарлама жіберу',
 'tog-enotifusertalkpages' => 'Талқылауым өзгергенде маған хат жібер',
 'tog-enotifminoredits' => 'Шағын өңдеме туралы да маған хат жібер',
 'tog-enotifrevealaddr' => 'Е-поштамның мекенжайын ескерту хаттарда аш',
 'tog-shownumberswatching' => 'Бақылап тұрған қатысушылардың санын көрсет',
 'tog-oldsig' => 'Ағымдағы қолтаңбаңыз:',
-'tog-fancysig' => 'Қам қолтаңба (өздіктік сілтемесіз)',
+'tog-fancysig' => 'Қам қолтаңба (дағдылы сілтемесіз)',
 'tog-externaleditor' => 'Шеттік өңдеуішті әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
 'tog-externaldiff' => 'Шеттік айырмағышты әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
 'tog-showjumplinks' => '«Өтіп кету» қатынау сілтемелерін қос',
 'tog-uselivepreview' => 'Тура қарап шығуды қолдану (JavaScript) (Сынақтама)',
 'tog-forceeditsummary' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
-'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімнен жасыр',
-'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімнен жасыр',
+'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жасыр',
+'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімінен жасыр',
 'tog-watchlisthideminor' => 'Шағын өңдемелерді бақылау тізімінде көрсетпеу',
 'tog-watchlisthideliu' => 'Бақылау тізіміндегі қатысушылардың өңдеулерін көрсетпеу',
 'tog-watchlisthideanons' => 'Бақылау тізіміндегі жасырын қатысушылардың өңдеулерін көрсетпеу',
@@ -415,7 +417,7 @@ $messages = array(
 # Font style option in Special:Preferences
 'editfont-style' => 'Өңдеу жолындағы қаріптің түрі',
 'editfont-default' => 'Негізгі браузер',
-'editfont-monospace' => 'Ð\9cоноенді қаріп',
+'editfont-monospace' => 'Ð\91Ñ\96Ñ\80енді қаріп',
 'editfont-sansserif' => 'Ноқатсыз қаріп',
 'editfont-serif' => 'Ноқатты қаріп',
 
@@ -498,7 +500,7 @@ $messages = array(
 'mypage' => 'Жеке бетім',
 'mytalk' => 'Талқылауым',
 'anontalk' => 'IP талқылауы',
-'navigation' => 'Ð\9dавигаÑ\86иÑ\8f',
+'navigation' => 'Ð\91аÒ\93Ñ\8bÑ\82Ñ\82аÑ\83',
 'and' => '&#32;және',
 
 # Cologne Blue skin
@@ -524,9 +526,9 @@ $messages = array(
 'vector-view-edit' => 'Өңдеу',
 'vector-view-history' => 'Тарихы',
 'vector-view-view' => 'Оқу',
-'vector-view-viewsource' => 'Қайнар көзін қарау',
+'vector-view-viewsource' => 'Қайнарын қарау',
 'actions' => 'Әрекеттер',
-'namespaces' => 'Ð\95Ñ\81Ñ\96м Ð°Ñ\8fÑ\81Ñ\8b',
+'namespaces' => 'Ð\95Ñ\81Ñ\96м ÐºÐµÒ£Ñ\96Ñ\81Ñ\82Ñ\96гÑ\96',
 'variants' => 'Нұсқалар',
 
 'errorpagetitle' => 'Қате',
@@ -534,7 +536,7 @@ $messages = array(
 'tagline' => '{{SITENAME}} жобасынан',
 'help' => 'Анықтама',
 'search' => 'Іздеу',
-'searchbutton' => 'Іздеу',
+'searchbutton' => 'Іздеу...',
 'go' => 'Өту',
 'searcharticle' => 'Өту',
 'history' => 'Бет тарихы',
@@ -563,7 +565,7 @@ $messages = array(
 'specialpage' => 'Арнайы бет',
 'personaltools' => 'Жеке құралдар',
 'postcomment' => 'Жаңа бөлім',
-'articlepage' => 'Мағлұмат бетін қарау',
+'articlepage' => 'Мәлімет бетін қарау',
 'talk' => 'Талқылау',
 'views' => 'Көрініс',
 'toolbox' => 'Құралдар',
@@ -582,22 +584,22 @@ $messages = array(
 'viewcount' => 'Бұл бет $1 рет қатыналған.',
 'protectedpage' => 'Қорғалған бет',
 'jumpto' => 'Мында өту:',
-'jumptonavigation' => 'шарлау',
+'jumptonavigation' => 'Бағыттау',
 'jumptosearch' => 'іздеу',
-'view-pool-error' => 'Кешіріңіз, қазір серверлер шектен тыс жүктеулі.
+'view-pool-error' => 'Кешіріңіз, қазір серверлер шектен тыс жүктелуде.
 Осы бетті қарауға өте көп сұраныс жасалды.
-Өтініш,  күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.
+Өтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.
 
 $1',
 'pool-timeout' => 'Бұғатталу уақытын күту мерзімі өтті',
-'pool-queuefull' => 'Сұранымдар жинақтауышы толы',
+'pool-queuefull' => 'Сұранымдар жинақтауышысы толық',
 'pool-errorunknown' => 'Белгісіз қате',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}} туралы',
 'aboutpage' => 'Project:Жоба туралы',
-'copyright' => 'Мағлұмат $1 шартымен жетімді.',
-'copyrightpage' => '{{ns:project}}:Авторлық құқықтар',
+'copyright' => 'Мәлімет $1 шартымен жетімді.',
+'copyrightpage' => '{{ns:project}}:Ауторлық құқықтар',
 'currentevents' => 'Ағымдағы оқиғалар',
 'currentevents-url' => 'Project:Ағымдағы оқиғалар',
 'disclaimers' => 'Жауапкершіліктен бас тарту',
@@ -614,31 +616,31 @@ $1',
 'privacypage' => 'Project:Жеке құпиясын сақтау',
 
 'badaccess' => 'Рұқсат беру қатесі',
-'badaccess-group0' => 'СұÑ\80аÑ\82Ñ\8bлÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\96Ò£Ñ\96здÑ\96 Ð¶ÐµÐ³Ñ\83Ñ\96Ò£Ñ\96зге рұқсат етілмейді.',
+'badaccess-group0' => 'СұÑ\80аÑ\82Ñ\8bлÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\96Ò£Ñ\96здÑ\96 Ð¾Ñ\80Ñ\8bндаÑ\83Ò\93а рұқсат етілмейді.',
 'badaccess-groups' => 'Аталған әрекетті тек {{PLURAL:$2|топтардың|топтың}} $1 қатысушылары ғана атқара алады.',
 
 'versionrequired' => 'MediaWiki $1 нұсқасы керек',
 'versionrequiredtext' => 'Бұл бетті қолдану үшін MediaWiki $1 нұсқасы керек. [[Special:Version|Жүйе нұсқасы бетін]] қараңыз.',
 
-'ok' => 'OK',
+'ok' => 'Жарайды',
 'pagetitle' => '$1 — {{SITENAME}}',
 'retrievedfrom' => '«$1» бетінен алынған',
-'youhavenewmessages' => 'СÑ\96зге $1 бар ($2).',
-'newmessageslink' => 'жаңа хабарлар',
-'newmessagesdifflink' => 'соңғы өзгерісіне',
-'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарлар бар',
+'youhavenewmessages' => 'СÑ\96зде $1 бар ($2).',
+'newmessageslink' => 'жаңа хабарламалар',
+'newmessagesdifflink' => 'соңғы өзгер',
+'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарламалар бар',
 'editsection' => 'өңдеу',
 'editold' => 'өңдеу',
-'viewsourceold' => 'қайнар көзін қарау',
+'viewsourceold' => 'қайнарын қарау',
 'editlink' => 'өңдеу',
-'viewsourcelink' => 'қайнар көзін қарау',
-'editsectionhint' => 'Ð\9cÑ\8bна Ð±өлімді өңдеу: $1',
+'viewsourcelink' => 'қайнарын қарау',
+'editsectionhint' => 'Ð\91өлімді өңдеу: $1',
 'toc' => 'Мазмұны',
-'showtoc' => 'көрсет',
-'hidetoc' => 'жасыр',
+'showtoc' => 'көрсету',
+'hidetoc' => 'жасыру',
 'collapsible-collapse' => 'Түру',
 'collapsible-expand' => 'Жазу',
-'thisisdeleted' => '$1 қарайсыз ба, не қалпына келтіресіз бе?',
+'thisisdeleted' => '$1 қарайсыз ба, немесе қалпына келтіресіз бе?',
 'viewdeleted' => '$1 қарайсыз ба?',
 'restorelink' => 'Жойылған $1 өңдемені',
 'feedlinks' => 'Арна:',
@@ -655,21 +657,21 @@ $1',
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Мақала',
 'nstab-user' => 'Жеке бет',
-'nstab-media' => 'ТаÑ\81па беті',
+'nstab-media' => 'Ð\9cедиа беті',
 'nstab-special' => 'Арнайы бет',
 'nstab-project' => 'Жоба беті',
 'nstab-image' => 'Файл беті',
-'nstab-mediawiki' => 'Хабар',
+'nstab-mediawiki' => 'Хабарлама',
 'nstab-template' => 'Үлгі',
 'nstab-help' => 'Анықтама',
 'nstab-category' => 'Санат',
 
 # Main script and global functions
-'nosuchaction' => 'Мынадай еш әрекет жоқ',
+'nosuchaction' => 'Мұндай әрекет жоқ',
 'nosuchactiontext' => 'URL-дегі көрсетілген әрекет қате.
-Бәлкім, сіз URL теру барысында қате жібердіңіз немесе қате сілтеме бойынша өттіңіз.
+Бәлкім, Сіз URL теру барысында қате жібердіңіз немесе қате сілтеме бойынша өттіңіз.
 Бұл сондай-ақ {{SITENAME}} жобасында қателікті көрсетуі мүмкін.',
-'nosuchspecialpage' => 'Мынадай еш арнайы бет жоқ',
+'nosuchspecialpage' => 'Мұндай арнайы бет жоқ',
 'nospecialpagetext' => '<strong>Сіздің сұраған арнайы бетіңіз жоқ.</strong>
 
 Бар арнайы беттер тізімі: [[Special:SpecialPages|{{int:specialpages}}]].',
@@ -687,9 +689,9 @@ $1',
 «$1»
 мына «$2» функциясынан болды .
 Дерекқор "$3: $4" қатесін қайтарды.',
-'laggedslavemode' => 'Құлақтандыру: Бетте жуықтағы жаңалаулар болмауы мүмкін.',
+'laggedslavemode' => "'''Ескерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
 'readonly' => 'Дерекқоры құлыпталған',
-'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз',
+'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз.',
 'readonlytext' => 'Бұл дерекқор жаңадан жазу және басқа өзгерістер жасаудан ағымда құлыпталынған, мүмкін күнде-күн дерекқорды баптау үшін, бұны бітіргеннен соң қалыпты іске қайтарылады.
 
 Құлыптаған әкімші бұны былай түсіндіреді: $1',
@@ -698,13 +700,13 @@ $1',
 Бұл ескірген айырма сілтемесіне немесе жойылған бет тарихы сілтемесіне ергеннен бола береді.
 
 Егер бұл орынды болмаса, бағдарламалық жасақтамадағы қатеге тап болуыңыз мүмкін.
-Бұл туралы нақты URL жайына аңғартпа жасап, әкімшіге баянаттаңыз.',
-'missingarticle-rev' => '(түзету н: $1)',
-'missingarticle-diff' => '(Ð\90йÑ\80м.: $1, $2)',
-'readonly_lag' => 'Жетек дерекқор серверлер басқысымен қадамланғанда осы дерекқор өздіктік құлыпталынған',
+Бұл туралы нақты URL жайына аңғартпа жасап, [[Special:ListUsers/sysop|әкімшіге]] баяндаңыз.',
+'missingarticle-rev' => '(түзету нұсқасы: $1)',
+'missingarticle-diff' => '(Ð\90йÑ\8bÑ\80Ñ\8bм: $1, $2)',
+'readonly_lag' => 'Жетек дерекқор серверлер басқасымен қадамланғанда осы дерекқор өздіктік құлыпталынған',
 'internalerror' => 'Ішкі қате',
 'internalerror_info' => 'Ішкі қатесі: $1',
-'fileappenderrorread' => 'Толықтыру кезінде «$1» оқылмады',
+'fileappenderrorread' => 'Толықтыру кезінде «$1» оқылмады.',
 'fileappenderror' => '«$2» -ге  "$1" -ді қосу мүмкін болмады.',
 'filecopyerror' => '«$1» файлы «$2» файлына көшірілмеді.',
 'filerenameerror' => '«$1» файл атауы «$2» атауына өзгертілмеді.',
@@ -727,13 +729,13 @@ $1',
 'wrong_wfQuery_params' => 'wfQuery() функциясы үшін бұрыс бапталымдары бар<br />
 Жете: $1<br />
 Сұраным: $2',
-'viewsource' => 'Қайнар көзін қарау',
+'viewsource' => 'Қайнарын қарау',
 'viewsource-title' => '$1 бетінің бастапқы мәтінін қарау',
 'actionthrottled' => 'Әрекет бәсеңдетілді',
 'actionthrottledtext' => 'Спамға қарсы күрес есебінде, осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді, және бұл шектеу шамасынан асып кеткенсіз.
 Бірнеше минуттан қайта байқап көріңіз.',
 'protectedpagetext' => 'Өңдеуді қақпайлау үшін бұл бет құлыпталынған.',
-'viewsourcetext' => 'Бұл беттің қайнар көзін қарауыңызға және көшіріп алуыңызға болады:',
+'viewsourcetext' => 'Бұл беттің қайнарын қарауыңызға және көшіріп алуыңызға болады:',
 'viewyourtext' => 'Осы бет арқылы "өзіңіз жасаған өңдеулердің" бастапқы мәтінін көруге және көшіруге мүмкіндігіңіз болады.',
 'protectedinterface' => 'Бұл бет бағдарламалық жасақтаманың тілдесу мәтінін жетістіреді, сондықтан қиянатты қақпайлау үшін өзгертуі құлыпталған.',
 'editinginterface' => "'''Құлақтандыру:''' Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.
@@ -748,6 +750,8 @@ $2',
 'ns-specialprotected' => '{{ns:special}} есім аясындағы беттер өңделінбейді',
 'titleprotected' => "Бұл тақырып аты бастаудан [[{{ns:user}}:$1|$1]] қорғады.
 Келтірілген себебі: ''$2''.",
+'filereadonlyerror' => "«$2» сақтамасы «тек қана оқу» тәртіптемесінде тұрғасын, «$1» файлын өзгерту мүмкін емес.
+Бұл тәртіптемені қондырған әкімші келесі түсіндірмені қалдырды: «''$3''»",
 
 # Virus scanner
 'virus-badscanner' => 'Баптау қателігі. Белгісіз вирус сканері: $1',
@@ -757,15 +761,15 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Жүйеден шықтыңыз.'''
 
-Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз; немесе баяғы не өзге қатысушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
-Аңғартпа: Кейбір беттер шолғышыңыздың кешін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
+Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз, немесе баяғы не өзге қатысушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
+Аңғартпа: Кейбір беттер шолғышыңыздың кэшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
 'welcomecreation' => '== Қош келдіңіз, $1! ==
 Жаңа тіркелгіңіз жасалды.
 Өзіңіздің [[Special:Preferences|жеке баптауларыңызды]] өзгертуді ұмытпаңыз.',
-'yourname' => 'Қатысушы атыңыз:',
-'yourpassword' => 'Құпия сөзіңіз:',
+'yourname' => 'Қатысушы аты:',
+'yourpassword' => 'Құпия сөз:',
 'yourpasswordagain' => 'Құпия сөзді қайталаңыз:',
-'remembermypassword' => 'Ð\9cенÑ\96Ò£ ÐºÑ\96Ñ\80генÑ\96мдÑ\96 Ð±Ò±Ð» ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82ерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
+'remembermypassword' => 'ТÑ\96Ñ\80келгÑ\96мдÑ\96 Ð¾Ñ\81Ñ\8b Ð±Ñ\80аÑ\83зерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
 'securelogin-stick-https' => 'Кіргеннен кейін HTTPS бойынша байланысты жалғастыру',
 'yourdomainname' => 'Желі үйшігіңіз:',
 'externaldberror' => 'Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.',
@@ -777,18 +781,19 @@ $2',
 'logout' => 'Шығу',
 'userlogout' => 'Шығу',
 'notloggedin' => 'Кірмегенсіз',
-'nologin' => "Ð\90ккаÑ\83нÑ\82Ñ\8bÒ£Ñ\8bз бар ма? '''$1'''.",
+'nologin' => "ТÑ\96Ñ\80келгÑ\96Ò£Ñ\96з бар ма? '''$1'''.",
 'nologinlink' => 'Тіркеліңіз',
 'createaccount' => 'Жаңа тіркелгі',
 'gotaccount' => "Бұған дейін тіркеліп пе едіңіз бе? '''$1'''.",
 'gotaccountlink' => 'Кіріңіз',
 'userlogin-resetlink' => 'Қатысушы атын не құпия сөзді ұмыттыңыз ба?',
-'createaccountmail' => 'е-поштамен',
+'createaccountmail' => 'Ð\95-поштамен',
 'createaccountreason' => 'Себебі:',
-'badretype' => 'Енгізген құпия сөздеріңіз бір біріне сәйкес емес.',
+'badretype' => 'Енгізген құпия сөздеріңіз бір-біріне сәйкес емес.',
 'userexists' => 'Енгізген қатысушы атыңыз әлдеқашан пайдалануда.
 Өзге атауды таңдаңыз.',
 'loginerror' => 'Кіру қатесі',
+'createaccounterror' => 'Тіркелгіні жасау мүмкін емес: $1',
 'nocookiesnew' => 'Жаңа қатысушы тіркелгісі жасалды, бірақ кірмегенсіз.
 Қатысушы кіру үшін {{SITENAME}} торабында «cookie» файлдары қолданылады.
 Сізде «cookies» өшірілген.
@@ -796,27 +801,30 @@ $2',
 'nocookieslogin' => 'Қатысушы кіру үшін {{SITENAME}} торабында «cookies» деген қолданылады.
 Сізде «cookies» өшірілген.
 Соны қосыңыз да кіруді қайта байқап көріңіз.',
+'nocookiesfornew' => 'Оның қайнарын растай алмағандықтан қатысушының аккаунты тіркелмеді. «Cookies» қосылып тұрғанына көз жеткізіңіз, бетті қайта жаңартыңыз және тағы байқап көріңіз.',
 'noname' => 'Жарамды қатысушы атын енгізбедіңіз.',
 'loginsuccesstitle' => 'Кіруіңіз сәтті өтті',
 'loginsuccess' => "'''Сіз енді {{SITENAME}} жобасына «$1» ретінде кіріп отырсыз.'''",
-'nosuchuser' => 'Мында «$1» деп аталған қатысушы жоқ.
-Емлеңізді тексеріңіз, не жаңа тіркелгі жасаңыз.',
+'nosuchuser' => '«$1» деген қатысушы тіркелмеген.
+Емлеңізді тексеріңіз, немесе жаңа тіркелгі жасаңыз.',
 'nosuchusershort' => 'Мында «$1» деп аталған қатысушы жоқ.
 Емлеңізді тексеріңіз.',
 'nouserspecified' => 'Қатысушы атын келтіруіңіз жөн.',
+'login-userblocked' => 'Бұл қатысушы бұғатталған. Жүйеге кiру рұқсат етiлмеген.',
 'wrongpassword' => 'Бұрыс құпия сөз енгізілген. Қайта байқап көріңіз.',
 'wrongpasswordempty' => 'Құпия сөз бос болған. Қайта байқап көріңіз.',
-'passwordtooshort' => 'Құпия сөзіңіз жарамсыз не тым қысқа.
+'passwordtooshort' => 'Құпия сөзіңіз жарамсыз немесе тым қысқа.
 Бұнда ең кемінде $1 таңба болуы және де қатысушы атыңыздан өзге болуы жөн.',
-'mailmypassword' => 'Құпия сөзімді хатпен жібер',
+'password-name-match' => 'Енгізген құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.',
+'password-login-forbidden' => 'Бұл қатысушы аты мен құпия сөзін пайдалануға тыйым салынған.',
+'mailmypassword' => 'Құпия сөзімді электронды поштама жібер',
 'passwordremindertitle' => '{{SITENAME}} үшін жаңа уақытша құпия сөз',
-'passwordremindertext' => 'Кейбіреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз)
-сізге {{SITENAME}} үшін жаңа құпия сөз жөнелетуін бізден сұраған ($4).
-«$2» қатысушының құпия сөзі «$3» болды енді.
-Қазір кіруіңіз және құпия сөзді өзгертуіңіз керек.
+'passwordremindertext' => 'Біреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз) {{SITENAME}} үшін жаңа құпия сөз жөнелету сұранымын жасаған ($4).
+Қатысушы «$2» үшін уақытша құпия сөз жасалды: «$3». Егер бұл Сіздің сұранымыңыз болса, жүйеге кіріп құпия сөзді өзгертуіңіз керек. Сіздің уақытша құпия сөзіңіз $5 дейін белсенді болады.
 
\95геÑ\80 Ð±Ò±Ð» Ñ\81Ò±Ñ\80анÑ\8bмдÑ\8b Ð±Ð°Ñ\81Ò\9bа Ð±Ñ\96Ñ\80еÑ\83 Ñ\96Ñ\81Ñ\82еÑ\81е, Ð½Ðµ Ò\9bұпиÑ\8f Ñ\81өздÑ\96 ÐµÑ\81ке Ñ\82Ò¯Ñ\81Ñ\96Ñ\80Ñ\81Ñ\96п ÐµÐ½Ð´Ñ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82кÑ\96Ò£Ñ\96з ÐºÐµÐ»Ð¼ÐµÑ\81е, ÐµÑ\81кÑ\96 Ò\9bұпиÑ\8f Ñ\81өз Ò\9bолданÑ\83Ñ\8bн Ð¶Ð°ғастырып осы хатқа аңғармауыңызға да болады.',
\95геÑ\80 Ð±Ò±Ð» Ñ\81Ò±Ñ\80анÑ\8bмдÑ\8b Ð¡Ñ\96з Ð¶Ð°Ñ\81амаÑ\81Ñ\8bÒ£Ñ\8bз, Ð½Ðµ Ò\9bұпиÑ\8f Ñ\81өздÑ\96 ÐµÑ\81ке Ñ\82Ò¯Ñ\81Ñ\96Ñ\80Ñ\96п ÐµÐ½Ð´Ñ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82кÑ\96Ò£Ñ\96з ÐºÐµÐ»Ð¼ÐµÑ\81е, ÐµÑ\81кÑ\96 Ò\9bұпиÑ\8f Ñ\81өздÑ\96 Ò\9bолданÑ\83дÑ\8b Ð¶Ð°Ð»ғастырып осы хатқа аңғармауыңызға да болады.',
 'noemail' => 'Осы арада «$1» қатысушының е-пошта мекенжайы жоқ.',
+'noemailcreate' => 'Сізге нақты электрондық пошта есімін көрсету керек.',
 'passwordsent' => 'Жаңа құпия сөз «$1» үшін тіркелген е-пошта мекенжайына жөнелтілді.
 Қабылдағаннан кейін кіргенде соны енгізіңіз.',
 'blocked-mailpassword' => 'IP мекенжайыңыздан өңдеу бұғатталған, сондықтан қиянатты қақпайлау үшін құпия сөзді қалпына келтіру жетесін қолдануына рұқсат етілмейді.',
@@ -825,15 +833,17 @@ $2',
 'throttled-mailpassword' => 'Соңғы {{PLURAL:$1|сағатта|$1 сағатта}} құпия сөз ескерту хаты алдақашан жөнелтілді.
 Қиянатты қақпайлау үшін, {{PLURAL:$1|сағат|$1 сағат}} сайын тек бір ғана құпия сөз ескерту хаты жөнелтіледі.',
 'mailerror' => 'Хат жөнелту қатесі: $1',
-'acct_creation_throttle_hit' => 'Ғафу етіңіз, сіз алдақашан $1 рет тіркелгі жасапсыз.
\9eнан Ð°Ñ\80Ñ\82Ñ\8bÒ\9b Ñ\96Ñ\81Ñ\82ей Ð°Ð»Ð¼Ð°Ð¹Ñ\81Ñ\8bз.',
-'emailauthenticated' => 'Е-пошта мекенжайыңыз расталған кезі: $1.',
+'acct_creation_throttle_hit' => 'Ғафу етіңіз, сіз алдақашан $1 рет тіркелгі жасапсыз. Онан артық жасай алмайсыз.
\9dÓ\99Ñ\82ижеÑ\81Ñ\96нде, Ð¾Ñ\81Ñ\8b IP-мекенжаймен ÐºÑ\96Ñ\80Ñ\83Ñ\88Ñ\96леÑ\80 Ð´Ó\99л Ò\9bазÑ\96Ñ\80гÑ\96 Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а Ð±Ñ\96Ñ\80неÑ\88е Ñ\82Ñ\96Ñ\80келгÑ\96 Ð¶Ð°Ñ\81ай Ð°Ð»Ð¼Ð°Ð¹Ð´Ñ\8b.',
+'emailauthenticated' => 'Е-пошта мекенжайыңыз расталған кезі: $3, $2.',
 'emailnotauthenticated' => 'Е-пошта мекенжайыңыз әлі расталған жоқ.
 Келесі әрбір мүмкіндіктер үшін еш хат жөнелтілмейді.',
 'noemailprefs' => 'Осы мүмкіндіктер істеуі үшін е-пошта мекенжайыңызды енгізіңіз.',
 'emailconfirmlink' => 'Е-пошта мекенжайыңызды құптаңыз',
-'invalidemailaddress' => 'Осы е-пошта мекенжайында жарамсыз пішім болған, қабыл етілмейді.
-Дұрыс пішімделген мекенжайды енгізіңіз, не аумақты бос қалдырыңыз.',
+'invalidemailaddress' => 'Бұл е-пошта есімі пішімге сәйкес келмегендіктен қабылданбайды.
+Дұрыс пішімделген е-пошта есімін енгізіңіз, немесе аумақты бос қалдырыңыз.',
+'cannotchangeemail' => 'Тіркелгінің е-поштасының мекен-жайы бұл уикиде өзгертілмейді.',
+'emaildisabled' => 'Бұл сайт е-поштаның хабарламасын жібере алмайды.',
 'accountcreated' => 'Жаңа тіркелгі жасалды',
 'accountcreatedtext' => '$1 үшін жаңа қатысушы тіркелгісі жасалды.',
 'createaccount-title' => '{{SITENAME}} үшін тіркелу',
@@ -841,7 +851,15 @@ $2',
 Жобаға кіріуіңіз және құпия сөзіңізді өзгертуіңіз тиісті.
 
 Егер бұл тіркелгі қателікпен жасалса, осы хабарға елемеуіңіз мүмкін.',
+'usernamehasherror' => 'Қатысушы есіміне тор белгі нышаны енгізілмейді.',
+'login-throttled' => 'Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз. Өтінемін, қайта кірмес бұрын кішкене күте тұрыңыз.',
+'login-abort-generic' => 'Жүйеге кіру үшін сәтсіз талпыныс жасадыңыз.',
 'loginlanguagelabel' => 'Тіл: $1',
+'suspicious-userlogout' => 'Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені, бұл жарамсыз браузер немесе кэштеуші проксидің сұранымына ұқсайды.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Mail() PHP-функциясындағы белгісіз қате.',
+'user-mail-no-addy' => 'Е-пошта есімінсіз хабарлама жіберуге талпынды.',
 
 # Change password dialog
 'resetpass' => 'Тіркелгінің құпия сөзін өзгерту',
@@ -853,11 +871,42 @@ $2',
 'retypenew' => 'Жаңа құпия сөзіңізді қайталаңыз:',
 'resetpass_submit' => 'Құпия сөзді қойыңыз да кіріңіз',
 'resetpass_success' => 'Құпия сөзіңіз сәтті өзгертілді! Енді кіріңіз…',
-'resetpass_forbidden' => '{{SITENAME}} жобасында құпия сөздер өзгертілмейді',
+'resetpass_forbidden' => 'Құпия сөз өзгертілмейді',
+'resetpass-no-info' => 'Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.',
 'resetpass-submit-loggedin' => 'Құпия сөзді өзгерту',
+'resetpass-submit-cancel' => 'Болдырмау',
+'resetpass-wrong-oldpass' => 'Уақытша немесе ағымдағы құпия сөзіңіз дұрыс емес.
+Мүмкін Сіз құпия сөзді сәтті өзгерткенсіз, немесе жаңа уақытша құпия сөзге сұраным жасағансыз.',
+'resetpass-temp-password' => 'Уақытша құпия сөз:',
 
 # Special:PasswordReset
+'passwordreset' => 'Құпия сөзді қайтару',
+'passwordreset-text' => 'Сіздің тіркелгіңіздің баптаулары туралы хабарламаларды алу үшін мына пішінді толтырыңыз.',
+'passwordreset-legend' => 'Құпия сөзді қайтару',
+'passwordreset-disabled' => 'Бұл уикиде құпия сөзді қайтару ажыратылған.',
+'passwordreset-pretext' => '{{PLURAL:$1||Төменде көрсетілгендердің ішіндегі біреуін жазыңыз}}',
 'passwordreset-username' => 'Қатысушы аты:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Келген хатты қарау керек пе?',
+'passwordreset-capture-help' => 'Егер Сіз берілген белгішені қондырсаңыз, қатысушыға жіберілетін уақытша құпия сөз жазылған хат көрсетіледі.',
+'passwordreset-email' => 'Е-поштаның мекен-жайы:',
+'passwordreset-emailtitle' => '{{SITENAME}} тіркелгісі туралы анықтама',
+'passwordreset-emailelement' => 'Қатысушы есімі: $1
+Уақытша құпия сөз: $2',
+'passwordreset-emailsent' => 'Электронды пошта арқылы ескертпе жөнелтілді.',
+'passwordreset-emailsent-capture' => 'Жөнелтілген ескертпе-хат төменде көрсетілген.',
+'passwordreset-emailerror-capture' => 'Жазылған ескертпе-хат төменде көрсетілген, оның жөнелтілмеу себебі: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Е-пошта мекен-жайын өзгерту',
+'changeemail-header' => 'Е-пошта мекен-жайының өзгертілуі',
+'changeemail-text' => 'Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін Сізге құпия сөзді енгізу керек.',
+'changeemail-no-info' => 'Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.',
+'changeemail-oldemail' => 'Е-поштаның ағымдағы мекен-жайы:',
+'changeemail-newemail' => 'Е-поштаның жаңа мекен жайы:',
+'changeemail-none' => '(ешкім)',
+'changeemail-submit' => 'Е-поштаны өзгерту',
+'changeemail-cancel' => 'Болдырмау',
 
 # Edit page toolbar
 'bold_sample' => 'Жуан мәтін',
@@ -866,7 +915,7 @@ $2',
 'italic_tip' => 'Қиғаш мәтін',
 'link_sample' => 'Сілтеме тақырыбының аты',
 'link_tip' => 'Ішкі сілтеме',
-'extlink_sample' => 'http://www.example.com сілтеме тақырыбын аты',
+'extlink_sample' => 'http://www.example.com сілтеме тақырыбының аты',
 'extlink_tip' => 'Шеттік сілтеме (алдынан http:// енгізуін ұмытпаңыз)',
 'headline_sample' => 'Бас жол мәтіні',
 'headline_tip' => '2-ші деңгейлі бас жол',
@@ -878,22 +927,23 @@ $2',
 'hr_tip' => 'Дерелей сызық (үнемді қолданыңыз)',
 
 # Edit pages
-'summary' => 'Түйіндемесі:',
+'summary' => 'Өзгертпе мазмұны:',
 'subject' => 'Тақырыбы/бас жолы:',
-'minoredit' => 'Ð\91ұл Ñ\88ағын өңдеме',
+'minoredit' => 'Шағын өңдеме',
 'watchthis' => 'Бетті бақылау',
-'savearticle' => 'Бетті сақта!',
+'savearticle' => 'Бетті сақтау',
 'preview' => 'Қарап шығу',
-'showpreview' => 'Қарап шық',
-'showlivepreview' => 'ТÑ\83Ñ\80а Ò\9bаÑ\80ап Ñ\88Ñ\8bÒ\9b',
+'showpreview' => 'Алдын ала қарау',
+'showlivepreview' => 'Ð\96Ñ\8bлдам Ò\9bаÑ\80аÑ\83',
 'showdiff' => 'Өзгерістерді көрсет',
-'anoneditwarning' => "'''Құлақтандыру:''' Сіз жүйеге кірмегенсіз.
-IP мекенжайыңыз бұл беттің түзету тарихында жазылып алынады.",
+'anoneditwarning' => "'''Ескертпе:''' Сіз жүйеге кірмегенсіз.
+IP-мекенжайыңыз бұл беттің түзету тарихында жазылып алынады.",
+'anonpreviewwarning' => '"Сіз жүйеге кірмегенсіз. IP-мекенжайыңыз бұл беттің түзету тарихында жазылып алынады."',
 'missingsummary' => "'''Ескертпе:''' Өңдеменің қысқаша мазмұндамасын енгізбепсіз.
 «Сақтау» түймесін тағы бассаңыз, өңденмеңіз мәндемесіз сақталады.",
 'missingcommenttext' => 'Мәндемеңізді төменде енгізіңіз.',
-'missingcommentheader' => "'''Ескертпе:''' Бұл мәндемеге тақырып/басжол жетістірмепсіз.
-Егер тағы да Сақтау түймесін нұқысаңыз, өңдемеңіз солсыз сақталады.",
+'missingcommentheader' => "'''Ескертпе:''' Өңдеменің қысқаша мазмұндамасын енгізбепсіз.
+«Сақтау» түймесін тағы бассаңыз, өңденмеңіз мәндемесіз сақталады.",
 'summary-preview' => 'Қысқаша мазмұндамасын қарап шығу:',
 'subject-preview' => 'Тақырыбын/бас жолын қарап шығу:',
 'blockedtitle' => 'Қатысушы бұғатталған',
@@ -909,26 +959,25 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 [[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын ұсынып және де оны пайдаланудан бұғатталмаған жағдайыңызда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.
 Ағымдық IP мекенжайыңыз: $3, және бұғатау нөмірі: $5.
 Сұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
-'autoblockedtext' => "$1 деген бұрын өзге қатысушы пайдаланған болғасын осы IP мекенжайыңыз өздіктік бұғатталған.
-Келтірілген себебі:
-
-:''$2''
+'autoblockedtext' => "'''Қатысушы атыңыз не IP-мекенжайыңыз бұғатталған.'''
 
-* Бұғаттау басталғаны: $8
-* Бұғаттау бітетіні: $6
-
-Осы бұғаттауды талқылау үшін $1 дегенмен, не басқа [[{{{{ns:mediawiki}}:grouppage-sysop}}|әкімшімен]] қатынасуыңызға болады.
+Осы бұғаттауды $1 істеген. Келтірілген себебі: ''$2''.
 
-Аңғартпа: [[{{#special:Preferences}}|Пайдаланушылық бапталымдарыңызды]] қолданып жарамды е-пошта мекенжайын енгізгенше дейін және бұны пайдалануы бұғатталмағанша дейін «Қатысушыға хат жазу» мүмкіндігін қолдана алмайсыз.
+* Бұғаттаудың басталғаны: $8
+* Бұғаттаудың бітетіні: $6
+* Бұғаттау нысанасы: $7
 
-Бұғатау нөміріңіз: $5.
-Бұл нөмірді әрбір сұранымыңыздарға кірістіріңіз.",
+Осы бұғаттауды талқылау үшін $1, не өзге [[{{MediaWiki:Grouppage-sysop}}|әкімшімен]] қатынасуыңызға болады.
+[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын ұсынып және де оны пайдаланудан бұғатталмаған жағдайыңызда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.
+Ағымдық IP мекенжайыңыз: $3, және бұғатау нөмірі: $5.
+Сұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
 'blockednoreason' => 'еш себебі келтірілмеген',
 'whitelistedittext' => 'Беттерді өңдеу үшін $1 жөн.',
 'confirmedittext' => 'Беттерді өңдеу үшін алдын ала Е-пошта мекенжайыңызды құптауыңыз жөн.
 Е-пошта мекенжайыңызды [[{{#special:Preferences}}|пайдаланушылық бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.',
-'nosuchsectiontitle' => 'Осындай еш бөлім жоқ',
-'nosuchsectiontext' => 'Жоқ бөлімді өңдеуді талап етіпсіз.',
+'nosuchsectiontitle' => 'Бұл бөлімді табу мүмкін емес',
+'nosuchsectiontext' => 'Сіз бұрын болмаған бөлімді өзгертпекшісіз.
+Мүмкін бұл бетті жылжытылған немесе жойылған.',
 'loginreqtitle' => 'Кіруіңіз керек',
 'loginreqlink' => 'кіру',
 'loginreqpagetext' => 'Басқа беттерді көру үшін сіз $1 болуыңыз жөн.',
@@ -936,15 +985,21 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 'accmailtext' => '$2 жайына «$1» құпия сөзі жөнелтілді.',
 'newarticle' => '(Жаңа)',
 'newarticletext' => 'Сілтемеге еріп әлі басталмаған бетке келіпсіз.
\91еÑ\82Ñ\82Ñ\96 Ð±Ð°Ñ\81Ñ\82аÑ\83 Ò¯Ñ\88Ñ\96н, Ñ\82өмендегÑ\96 ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80нÑ\8bнда Ð¼Ó\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96 Ñ\82еÑ\80Ñ\96Ò£Ñ\96з (көбÑ\96Ñ\80ек Ð°Ò\9bпаÑ\80аÑ\82 Ò¯Ñ\88Ñ\96н [[{{{{ns:mediawiki}}:helppage}}|анықтама бетін]] қараңыз).
-Егер жаңылғаннан осында келген болсаңыз, шолғышыңыздың «Артқа» деген батырмасын нұқыңыз.',
\91еÑ\82Ñ\82Ñ\96 Ð±Ð°Ñ\81Ñ\82аÑ\83 Ò¯Ñ\88Ñ\96н, Ñ\82өменгÑ\96 Ñ\82еÑ\80езеде Ð¼Ó\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96 Ñ\82еÑ\80Ñ\96Ò£Ñ\96з (көбÑ\96Ñ\80ек Ð°Ò\9bпаÑ\80аÑ\82 Ò¯Ñ\88Ñ\96н [[{{MediaWiki:Helppage}}|анықтама бетін]] қараңыз).
+Егер жаңылғаннан осында келген болсаңыз, браузердің «артқа» деген батырмасын басыңыз.',
 'anontalkpagetext' => "----''Бұл тіркелгісіз (немесе тіркелгісін қолданбаған) қатысушы талқылау беті. Осы қатысушыны біз тек сандық IP мекенжайымен теңдестіреміз.
 Осындай IP мекенжай бірнеше қатысушыға ортақтастырылған болуы мүмкін.
 Егер сіз тіркелгісіз қатысушы болсаңыз және сізге қатыссыз мәндемелер жіберілгенін сезсеңіз, басқа тіркелгісіз қатысушылармен араластырмауы үшін [[{{#special:Userlogin}}|тіркеліңіз не кіріңіз]].''",
-'noarticletext' => 'Бұл бетте ағымда еш мәтін жоқ, дегенмен басқа беттерден [[{{#special:Search}}/{{PAGENAME}}|бұл бет тақырыбы атын іздей]] не [{{fullurl:{{FULLPAGENAME}}|action=edit}} бұл бетті өңдей] аласыз.',
+'noarticletext' => "Ағымда бұл бетте еш мәтін жоқ.
+* Басқа беттерден [[Special:Search/{{PAGENAME}}|бұл бет атауын іздеу]],
+* <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Журналдардан бұл бетке қатысты сәйкес жазбаларды табу]</span>,
+* <span class=\"plainlinks\">'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Бұл бетті жаңадан бастау]'''</span>.",
 'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» қатысушы тіркелгісі жазып алынбаған. Бұл бетті бастау/өңдеу талабыңызды тексеріп шығыңыз.',
-'clearyourcache' => "'''Аңғартпа:''' Сақтағаннан кейін, өзгерістерді көру үшін шолғыш бүркемесін орағыту ықтимал. '''Mozilla / Firefox / Safari:''' ''Қайта жүктеу'' батырмасын нұқығанда ''Shift'' тұтыңыз, не ''Ctrl-Shift-R'' басыңыз (Apple Mac — ''Cmd-Shift-R''); '''IE:''' ''Жаңарту'' батырмасын нұқығанда ''Ctrl'' тұтыңыз, не ''Ctrl-F5'' басыңыз; '''Konqueror:''': ''Жаңарту'' батырмасын жай нұқыңыз, не ''F5'' басыңыз; '''Opera''' пайданушылары ''Құралдар→Бапталымдар'' дегенге барып бүркемесін толық тазарту жөн.",
-'usercssyoucanpreview' => "'''Ақыл-кеңес:''' Жаңа CSS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
+'userpage-userdoesnotexist-view' => '«$1» қатысушы есімі тіркелмеген.',
+'blocked-notice-logextract' => 'Бұл қатысушы қазіргі уақытта  бұғатталған.
+Төменде бұғаттау журналындағы соңғы жазбалар көрсетілген.',
+'clearyourcache' => "'''Ескертпе:''' Сақтағаннан кейін, өзгерістерді көру үшін шолғыш бүркемесін орағыту ықтимал. '''Mozilla / Firefox / Safari:''' ''Қайта жүктеу'' батырмасын нұқығанда ''Shift'' тұтыңыз, не ''Ctrl-Shift-R'' басыңыз (Apple Mac — ''Cmd-Shift-R''); '''IE:''' ''Жаңарту'' батырмасын нұқығанда ''Ctrl'' тұтыңыз, не ''Ctrl-F5'' басыңыз; '''Konqueror:''': ''Жаңарту'' батырмасын жай нұқыңыз, не ''F5'' басыңыз; '''Opera''' пайданушылары ''Құралдар→Бапталымдар'' дегенге барып бүркемесін толық тазарту жөн.",
+'usercssyoucanpreview' => "'''Кеңес:''' Жаңа CSS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
 'userjsyoucanpreview' => "'''Ақыл-кеңес:''' Жаңа JS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
 'usercsspreview' => "'''Мынау CSS мәтінін тек қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
 'userjspreview' => "'''Мынау JavaScript қатысушы бағдарламасын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
@@ -953,6 +1008,7 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 'updated' => '(Жаңартылған)',
 'note' => "'''Аңғартпа:'''",
 'previewnote' => "Бұл тек '''қарап шығу''' екенін ұмытпаңыз, өзгерістер әлі сақталған жоқ!",
+'continue-editing' => 'Өңдемені жалғастыру',
 'previewconflict' => 'Бұл қарап шығу беті жоғарғы кірістіру орнындағы мәтінді қамтиды да және сақталғандағы өңді көрсетпек.',
 'session_fail_preview' => "'''Ғафу етіңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.
 Қайта байқап көріңіз. Егер бұл әлі істелмесе, шығуды және қайта кіруді байқап көріңіз.'''",
@@ -965,9 +1021,10 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 Бет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.
 Бұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.'''",
 'editing' => 'Өңделуде: $1',
+'creating' => 'Бастау: $1',
 'editingsection' => 'Өңделуде: $1 (бөлімі)',
 'editingcomment' => 'Өңделуде: $1 (мәндемесі)',
-'editconflict' => 'Өңдеме қақтығысы: $1',
+'editconflict' => 'Өңдемелер қақтығысы: $1',
 'explainconflict' => "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.
 Жоғарғы кірістіру орнында беттің ағымдық мәтіні бар.
 Төменгі кірістіру орнында сіз өзгерткен мәтіні көрсетіледі.
@@ -991,28 +1048,34 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 Бұл сақтай алынбайды.'''",
 'readonlywarning' => "'''ҚҰЛАҚТАНДЫРУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.
 Кейін қолдану үшін мәтәнді қйып алып және қойып, мәтін файлына сақтауңызға болады.'''",
-'protectedpagewarning' => "'''ҚҰЛАҚТАНДЫРУ: Бұл бет қорғалған. Тек әкімші құқықтары бар қатысушылар өңдей алады.'''",
+'protectedpagewarning' => "'''Ескертпе: Бұл бет қорғалған. Тек әкімші құқықтары бар қатысушылар өңдей алады.'''",
 'semiprotectedpagewarning' => "'''Аңғартпа:''' Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.",
 'cascadeprotectedwarning' => "'''Құлақтандыру''': Бұл бет құлыпталған, енді тек әкімші құқықтары бар қатысушылар бұны өңдей алады.Бұның себебі: бұл бет «баулы қорғауы» бар келесі {{PLURAL:$1|беттің|беттердің}} кірікбеті:",
-'titleprotectedwarning' => "'''ҚҰЛАҚТАНДЫРУ:  Бұл бет құлыпталған, сондықтан тек бірқатар қатысушылар бұны бастай алады.'''",
-'templatesused' => 'Бұл бетте қолданылған үлгілер:',
-'templatesusedpreview' => 'Ð\91ұнÑ\8b Ò\9bаÑ\80ап Ñ\88Ñ\8bÒ\93Ñ\83Ò\93а Ò\9bолданÑ\8bлÒ\93ан Ò¯Ð»Ð³Ñ\96леÑ\80:',
-'templatesusedsection' => 'Бұл бөлімде қолданылған үлгілер:',
+'titleprotectedwarning' => "'''Ескертпе: Бұл бет құлыпталған, сондықтан тек бірқатар қатысушылар бұны бастай алады.'''",
+'templatesused' => 'Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
+'templatesusedpreview' => 'Ð\91ұл Ð±ÐµÑ\82Ñ\82е Ò\9bолданÑ\8bлÒ\93ан {{PLURAL:$1|үлгÑ\96|үлгÑ\96леÑ\80}}:',
+'templatesusedsection' => 'Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
 'template-protected' => '(қорғалған)',
 'template-semiprotected' => '(жартылай қорғалған)',
 'hiddencategories' => 'Бұл бет $1 жасырын санаттың мүшесі:',
 'nocreatetitle' => 'Бетті бастау шектелген',
 'nocreatetext' => '{{SITENAME}} жобасында жаңа бет бастауы шектелген.
 Кері қайтып бар бетті өңдеуіңізге болады, немесе [[Special:UserLogin|кіруіңізге не тіркелуіңізге]] болады.',
-'nocreate-loggedin' => '{{SITENAME}} жобасында жаңа бет бастау рұқсатыңыз жоқ.',
+'nocreate-loggedin' => 'Жаңа бет бастауға рұқсатыңыз жоқ.',
+'sectioneditnotsupported-title' => 'Бөлімдерді өңдеу қолданылмайды',
+'sectioneditnotsupported-text' => 'Бұл бетте бөлімдерді өңдеу қолданылмайды.',
 'permissionserrors' => 'Рұқсаттар қателері',
 'permissionserrorstext' => 'Бұны істеуге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:',
 'permissionserrorstext-withaction' => '$2 дегенге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:',
-'recreate-moveddeleted-warn' => "'''Құлақтандыру: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''
+'recreate-moveddeleted-warn' => "'''Назар аудар: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''
 
-Мына бет өңдеуін жалғастыру үшін жарастығын тексеріп шығуыңыз жөн.
-Қолайлы болуы үшін бұл беттің жою журналы келтірілген:",
+Бұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.
+Төменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
+'moveddeleted-notice' => 'Бұл бет жойылған.
+Төменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:',
 'log-fulllog' => 'Толық журналды қарау',
+'edit-hook-aborted' => 'Түзету ілмек арқылы болдырмады.
+Қосымша түсіндірмелер көрсетілмеген.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Құлақтандыру: Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.
@@ -1086,6 +1149,7 @@ $3 келтірілген себебі: ''$2''",
 'revdelete-nooldid-title' => 'Нысана түзету жарамсыз',
 'revdelete-nooldid-text' => 'Бұл жетені орындау үшін нысана түзетуін/түзетулерін келтірілмепсіз,
 келтірілген түзету жоқ, не ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.',
+'revdelete-nologtype-title' => 'Журнал түрі көрсетілмеген',
 'revdelete-show-file-submit' => 'Иә',
 'revdelete-selected' => "'''[[:$1]] дегеннің бөлектенген {{PLURAL:$2|түзетуі|түзетулері}}:'''",
 'logdelete-selected' => "'''Бөлектенген {{PLURAL:$1|журнал оқиғасы|журнал оқиғалары}}:'''",
@@ -1106,6 +1170,8 @@ $3 келтірілген себебі: ''$2''",
 'revdelete-success' => "'''Түзету көрінісі сәтті қойылды.'''",
 'logdelete-success' => "'''Журнал көрінісі сәтті қойылды.'''",
 'revdel-restore' => 'Көрінісін өзгерту',
+'revdel-restore-deleted' => 'жойылған нұсқалары',
+'revdel-restore-visible' => 'көрінетін нұсқалары',
 'pagehist' => 'Бет тарихы',
 'deletedhist' => 'Жойылған тарихы',
 'revdelete-edit-reasonlist' => 'Жою себептерін өңдеу',
@@ -1145,13 +1211,13 @@ $3 келтірілген себебі: ''$2''",
 'mergelogpagetext' => 'Төменде бір беттің тарихы өзге бетке біріктіру ең соңғы тізімі келтіріледі.',
 
 # Diffs
-'history-title' => '«$1» — түзету тарихы',
+'history-title' => '«$1» — өңдеу тарихы',
 'difference' => '(Түзетулер арасындағы айырмашылық)',
 'lineno' => 'Жол нөмірі $1:',
 'compareselectedversions' => 'Таңдалған нұсқаларды салыстыру',
 'showhideselectedversions' => 'Бөлектенген нұсқаларды көрсет/жасыр',
 'editundo' => 'жоққа шығару',
-'diff-multi' => '(Арадағы $1 түзету көрсетілмеген.)',
+'diff-multi' => '($2 қатысушының арадағы $1 түзетуі көрсетілмеген)',
 
 # Search results
 'searchresults' => 'Іздеу нәтижелері',
@@ -1166,11 +1232,23 @@ $3 келтірілген себебі: ''$2''",
 'notextmatches' => 'Еш бет мәтіні сәйкес емес',
 'prevn' => 'алдыңғы {{PLURAL:$1|$1}}',
 'nextn' => 'келесі {{PLURAL:$1|$1}}',
+'prevn-title' => 'Алдыңғы $1 {{PLURAL:$1|жазба|жазбалар}}',
+'nextn-title' => 'Келесі $1 {{PLURAL:$1|жазба|жазбалар}}',
+'shown-title' => 'Осы бетте {{PLURAL:$1|жазба}} көрсету.',
 'viewprevnext' => 'Көрсетілуі: ($1 {{int:pipe-separator}} $2) ($3) жазба',
+'searchmenu-exists' => "'''Бұл жобада «[[:$1]]» деген бет бар.'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" осындай атпен бетті бастау'''",
 'searchhelp-url' => 'Help:Мазмұны',
+'searchprofile-articles' => 'Негізгі беттер',
+'searchprofile-project' => 'Анықтама және жоба беттері',
+'searchprofile-images' => 'Мультимедиа',
 'searchprofile-everything' => 'Барлық жерде',
+'searchprofile-advanced' => 'Кеңейтілген',
 'searchprofile-articles-tooltip' => '$1 іздеу',
+'searchprofile-project-tooltip' => '$1 іздеу',
+'searchprofile-images-tooltip' => 'Файлдарды іздеу',
+'searchprofile-everything-tooltip' => 'Барлық беттерден іздеу (талқылау беттерін қоса)',
+'searchprofile-advanced-tooltip' => 'Белгіленген есім кеңістігінен іздеу',
 'search-result-size' => '$1 ($2 сөз)',
 'search-result-score' => 'Арақатынастылығы: $1 %',
 'search-redirect' => '(айдағыш $1)',
@@ -1188,6 +1266,7 @@ $3 келтірілген себебі: ''$2''",
 'showingresults' => "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
 'showingresultsnum' => "Төменде нөмір '''$2''' орнынан бастап '''$3''' нәтиже көрсетіледі.",
 'nonefound' => "'''Аңғартпа''': Әдепкіден тек кейбір есім аялардан ізделінеді. Барлық мағлұмат түрін (соның ішінде талқылау беттерді, үлгілерді т.б.) іздеу үшін сұранымыңызды ''барлық:'' деп бастаңыз, немесе қалаған есім аясын бастауыш есебінде қолданыңыз.",
+'search-nonefound' => 'Сұрауға сәйкес нәтижелер табылмады.',
 'powersearch' => 'Кеңейтілген іздеу',
 'powersearch-legend' => 'Кеңейтілген іздеу',
 'powersearch-ns' => 'Мына есім аяларда іздеу:',
@@ -1255,7 +1334,7 @@ $3 келтірілген себебі: ''$2''",
 'timezoneregion-pacific' => 'Тынық мұхиты',
 'allowemail' => 'Басқадан хат қабылдауын қос',
 'prefs-searchoptions' => 'Іздеу бапталымдары',
-'prefs-namespaces' => 'Ð\95Ñ\81Ñ\96м Ð°Ñ\8fлаÑ\80Ñ\8b',
+'prefs-namespaces' => 'Ð\95Ñ\81Ñ\96м ÐºÐµÒ£Ñ\96Ñ\81Ñ\82Ñ\96кÑ\82еÑ\80Ñ\96',
 'defaultns' => 'Мына есім аяларда әдепкіден іздеу:',
 'default' => 'әдепкі',
 'prefs-files' => 'Файлдар',
@@ -1281,7 +1360,7 @@ $3 келтірілген себебі: ''$2''",
 'email' => 'Е-поштаңыз',
 'prefs-help-realname' => 'Нақты атыңыз міндетті емес.
 Егер бұны жетістіруді таңдасаңыз, бұл түзетуіңіздің ауторлығын анықтау үшін қолданылады.',
-'prefs-help-email' => 'Ð\95-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8b Ð¼Ñ\96ндеÑ\82Ñ\82Ñ\96 ÐµÐ¼ÐµÑ\81, Ð±Ñ\96Ñ\80аÒ\9b Ð¶ÐµÐºÐµ Ð±Ð°Ñ\81Ñ\8bÒ£Ñ\8bздÑ\8b Ð°Ñ\88пай Â«Ò\9aаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b» Ð½ÐµÐ¼ÐµÑ\81е Â«Ò\9aаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b\82алÒ\9bÑ\8bлаÑ\83Ñ\8b» Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80Ñ\96Ò£Ñ\96з Ð°Ñ\80Ò\9bÑ\8bлÑ\8b Ð±Ð°Ñ\80Ñ\88а Ñ\81Ñ\96збен Ð±Ð°Ð¹Ð»Ð°Ð½Ñ\8bÑ\81а Ð°лады.',
+'prefs-help-email' => 'ЭлекÑ\82Ñ\80ондÑ\8b Ð¿Ð¾Ñ\88Ñ\82аңÑ\8bздÑ\8bÒ£ Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bн ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\83 Ð¼Ñ\96ндеÑ\82Ñ\82Ñ\96 ÐµÐ¼ÐµÑ\81, Ð±Ñ\96Ñ\80аÒ\9b Ò\9bұпиÑ\8f Ñ\81өзÑ\96Ò£Ñ\96здÑ\96 Ò±Ð¼Ñ\8bÑ\82Ò\9bан Ð¶Ð°Ò\93дайда ÐºÐµÑ\80ек Ð±Ð¾лады.',
 'prefs-help-email-required' => 'Е-пошта мекенжайы керек.',
 'prefs-info' => 'Негізгі мәлімет',
 'prefs-i18n' => 'Тіл туралы мәлімет',
@@ -1401,14 +1480,22 @@ $3 келтірілген себебі: ''$2''",
 'action-read' => 'Осы бетті оқу',
 'action-edit' => 'осы бетті өңдеу',
 'action-delete' => 'Осы бетті жою',
+'action-mergehistory' => 'Бұл беттің өзгеріс тарихын қосу',
+'action-userrights' => 'Қатысушылардың барлық құқықтарын өзгерту',
+'action-userrights-interwiki' => 'Басқа уикилердегі қатысушылардың құқықтарын өзгерту',
+'action-siteadmin' => 'Дерекқорды бұғаттау немесе бұғаттан шығару',
+'action-sendemail' => 'электронды хаттарды жіберу',
 
 # Recent changes
 'nchanges' => '$1 өзгеріс',
-'recentchanges' => 'Ð\96Ñ\83Ñ\8bÒ\9bÑ\82ағы өзгерістер',
+'recentchanges' => 'Соңғы өзгерістер',
 'recentchanges-legend' => 'Жуықтағы өзгерістер баптаулары',
 'recentchangestext' => 'Бұл бетте осы уикидегі болған жуықтағы өзгерістер байқалады.',
 'recentchanges-feed-description' => 'Бұл арнаменен уикидегі ең соңғы өзгерістер қадағаланады.',
+'recentchanges-label-newpage' => 'Бұл өңдеме арқылы жаңа бет басталды',
 'recentchanges-label-minor' => 'Бұл шағын өңдеме',
+'recentchanges-label-bot' => 'Бұл өңдемені бот жасады.',
+'recentchanges-label-unpatrolled' => 'Бұл өңдеме әлі тексеруден өтпеді.',
 'rcnote' => "$3 кезіне дейін — төменде соңғы {{PLURAL:$2|күндегі|'''$2''' күндегі}}, соңғы '''$1''' өзгеріс көрсетіледі.",
 'rcnotefrom' => "'''$2''' кезінен бері — төменде '''$1''' жеткенше дейін өзгерістер көрсетіледі.",
 'rclistfrom' => '$1 кезінен бері — жаңа өзгерістерді көрсет.',
@@ -1419,17 +1506,21 @@ $3 келтірілген себебі: ''$2''",
 'rcshowhidepatr' => 'Зерттелген өңдемелерді $1',
 'rcshowhidemine' => 'Өңдемелерімді $1',
 'rclinks' => 'Соңғы $2 күнде болған, соңғы $1 өзгерісті көрсет<br />$3',
-'diff' => 'айырм.',
-'hist' => 'тар.',
-'hide' => 'жаÑ\81Ñ\8bÑ\80',
-'show' => 'көÑ\80Ñ\81еÑ\82',
+'diff' => 'айырым',
+'hist' => 'тарихы',
+'hide' => 'Ð\96аÑ\81Ñ\8bÑ\80Ñ\83',
+'show' => 'Ð\9aÓ©Ñ\80Ñ\81еÑ\82Ñ\83',
 'minoreditletter' => 'ш',
 'newpageletter' => 'Ж',
 'boteditletter' => 'б',
 'number_of_watching_users_pageview' => '[бақылаған $1 қатысушы]',
 'rc_categories' => 'Санаттарға шектеу ("|" белгісімен бөліктеңіз)',
-'rc_categories_any' => 'Қайсыбір',
+'rc_categories_any' => 'Кез келген',
+'rc-change-size-new' => 'Өңдеуден кейінгі көлемі: {{PLURAL:$1|байт|байттар}}',
 'newsectionsummary' => '/* $1 */ жаңа бөлім',
+'rc-enhanced-expand' => 'Толық ақпаратты көрсету (JavaScript-ті керек етеді)',
+'rc-enhanced-hide' => 'Толық ақпаратты жасыру',
+'rc-old-title' => 'Бастапқы «$1» сияқты жасалған',
 
 # Recent changes linked
 'recentchangeslinked' => 'Қатысты өзгерістер',
@@ -1508,7 +1599,7 @@ $3 келтірілген себебі: ''$2''",
 'file-exists-duplicate' => 'Бұл файл келесі {{PLURAL:$1|файлдың|файлдарының}} телнұсқасы:',
 'uploadwarning' => 'Қотарып беру жөнінде құлақтандыру',
 'savefile' => 'Файлды сақтау',
-'uploadedimage' => '«[[$1]]» файлын қотарып берді',
+'uploadedimage' => '«[[$1]]» файлын жүктеді',
 'overwroteimage' => '«[[$1]]» файлынның жаңа нұсқасын қотарып берді',
 'uploaddisabled' => 'Қотарып беру өшірілген',
 'uploaddisabledtext' => '{{SITENAME}} жобасында файл қотарып беруі өшірілген.',
@@ -1544,7 +1635,7 @@ URL дұрыс екендігін және торап істеп тұрғаны
 Талабыңызды қол тиген кезінде қайта байқап көруіңіз мүмкін.',
 
 'license' => 'Лицензияландыруы:',
-'license-header' => 'Лицензияландыруы:',
+'license-header' => 'Лицензияландыруы',
 'nolicense' => 'Ештеңе бөлектенбеген',
 'license-nopreview' => '(Қарап шығу жетімді емес)',
 'upload_source_url' => ' (жарамды, баршаға қатынаулы URL)',
@@ -1752,8 +1843,8 @@ URL дұрыс екендігін және торап істеп тұрғаны
 'nextpage' => 'Келесі бетке ($1)',
 'prevpage' => 'Алдыңғы бетке ($1)',
 'allpagesfrom' => 'Мына беттен бастап көрсету:',
-'allarticles' => 'Барлық бет тізімі',
-'allinnamespace' => 'Барлық бет ($1 есім аясы)',
+'allarticles' => 'Барлық беттер тізімі',
+'allinnamespace' => 'Барлық беттер ($1 есім кеңістігі)',
 'allnotinnamespace' => 'Барлық бет ($1 есім аясынан тыс)',
 'allpagesprev' => 'Алдыңғыға',
 'allpagesnext' => 'Келесіге',
@@ -1779,7 +1870,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:LinkSearch
 'linksearch' => 'Сыртқы сілтемелерді іздеу',
 'linksearch-pat' => 'Іздеу шарты:',
-'linksearch-ns' => 'Ð\95Ñ\81Ñ\96м Ð°Ñ\8fÑ\81Ñ\8b:',
+'linksearch-ns' => 'Ð\95Ñ\81Ñ\96м ÐºÐµÒ£Ñ\96Ñ\81Ñ\82Ñ\96гÑ\96:',
 'linksearch-ok' => 'Іздеу',
 'linksearch-text' => '«*.wikipedia.org» атауына ұқсасты бәдел нышандарды қолдануға болады.',
 'linksearch-line' => '$2 дегеннен $1 сілтеген',
@@ -1905,7 +1996,8 @@ $NEWPAGE
 'historywarning' => 'Құлақтандыру: Жоюы көзделген бетте тарихы бар:',
 'confirmdeletetext' => 'Бетті бүкіл тарихымен бірге дерекқордан жойғалы жатырсыз.
 Бұл әрекетіңіз ниетпен жасалғанын, әрекет салдары есепке алынғанын және әрекетіңіз [[{{{{ns:mediawiki}}:Policy-url}}]]-іне лайықты болғанын тағы бір рет тексеріп шығуыңызды сұраймыз.',
-'actioncomplete' => 'Әрекет бітті',
+'actioncomplete' => 'Әрекет орындалды',
+'actionfailed' => 'Әрекет орындалмады',
 'deletedtext' => '«$1» жойылды.
 Жуықтағы жоюлар туралы жазбаларын $2 дегеннен қараңыз.',
 'dellogpage' => 'Жою_журналы',
@@ -1951,7 +2043,7 @@ $2 соңғы нұсқасына өзгертті.',
 'protectlogpage' => 'Қорғау журналы',
 'protectlogtext' => 'Төменде беттердің қорғау/қорғамау тізімі берілген.
 Ағымдағы қорғау әректтер бар беттер үшін [[{{#special:Protectedpages}}|қорғалған бет тізімін]] қараңыз.',
-'protectedarticle' => '«[[$1]]» қорғалды',
+'protectedarticle' => '«[[$1]]» беті қорғалды',
 'modifiedarticleprotection' => '«[[$1]]» қорғалу деңгейі өзгерді',
 'unprotectedarticle' => '«[[$1]]» қорғалуы өшірілді',
 'protect-title' => '«$1» қорғау деңгейін өзгерту',
@@ -2019,7 +2111,8 @@ $2 соңғы нұсқасына өзгертті.',
 Сілтемеңіз жарамсыз, не түзету қалпына келтірілген, немесе мұрағаттан аласталған болуы мүмкін.',
 'undelete-nodiff' => 'Еш алдыңғы түзету табылмады.',
 'undeletebtn' => 'Қалпына келтір!',
-'undeletelink' => 'қалпына келтіру',
+'undeletelink' => 'қарау/қалпына келтіру',
+'undeleteviewlink' => 'қарау',
 'undeletereset' => 'Қайта қой',
 'undeletecomment' => 'Мәндемесі:',
 'undeletedrevisions' => '$1 түзету қалпына келтірілді',
@@ -2047,13 +2140,14 @@ $1',
 'undelete-show-file-submit' => 'Иә',
 
 # Namespace form on various pages
-'namespace' => 'Ð\95Ñ\81Ñ\96м Ð°Ñ\8fÑ\81Ñ\8b:',
+'namespace' => 'Ð\95Ñ\81Ñ\96м ÐºÐµÒ£Ñ\96Ñ\81Ñ\82Ñ\96гÑ\96:',
 'invert' => 'Таңдалғанды жасыру',
 'namespace_association' => 'Қатысты есім аясы',
 'blanknamespace' => 'Негізгі беттерден',
 
 # Contributions
 'contributions' => 'Қатысушы үлесі',
+'contributions-title' => '$1 есімді қатысушының үлесі',
 'mycontris' => 'Үлесім',
 'contribsub2' => '$1 ($2) үлесі',
 'nocontribs' => 'Осы іздеу шартына сәйкес өзгерістер табылған жоқ.',
@@ -2065,10 +2159,12 @@ $1',
 'sp-contributions-newbies-sub' => 'Жаңадан тіркелгі жасағандар үшін',
 'sp-contributions-blocklog' => 'Бұғаттау журналы',
 'sp-contributions-deleted' => 'Қатысушының жойылған үлесі',
-'sp-contributions-talk' => 'Талқылауы',
+'sp-contributions-uploads' => 'жүктеулер',
+'sp-contributions-logs' => 'журналдар',
+'sp-contributions-talk' => 'талқылауы',
 'sp-contributions-userrights' => 'Қатысушы құқықтарын реттеу',
 'sp-contributions-search' => 'Үлес үшін іздеу',
-'sp-contributions-username' => 'IP мекенжайы не қатысушы аты:',
+'sp-contributions-username' => 'IP мекенжайы немесе қатысушы аты:',
 'sp-contributions-submit' => 'Ізде',
 
 # What links here
@@ -2096,7 +2192,7 @@ $1',
 'blockiptext' => 'Төмендегі пішін қатысушының жазу рұқсатын белгілі IP мекенжайымен не атымен бұғаттау үшін қолданылады.
 Бұны тек бұзақылықты қақпайлау үшін және де [[{{{{ns:mediawiki}}:Policy-url}}|ережелер]] бойынша атқаруыңыз жөн.
 Төменде тиісті себебін толтырып көрсетіңіз (мысалы, дәйекке бұзақылықпен өзгерткен беттерді келтіріп).',
-'ipadressorusername' => 'IP мекенжайы не қатысушы аты:',
+'ipadressorusername' => 'IP мекенжайы немесе қатысушы аты:',
 'ipbexpiry' => 'Мерзімі бітпек:',
 'ipbreason' => 'Себебі:',
 'ipbreasonotherlist' => 'Басқа себеп',
@@ -2111,14 +2207,15 @@ $1',
 'ipbcreateaccount' => 'Тіркелуді қақпайлау',
 'ipbemailban' => 'Қатысушы е-поштамен хат жөнелтуін қақпайлау',
 'ipbenableautoblock' => 'Бұл қатысушы соңғы қолданған IP мекенжайын, және кейін өңдеуге байқап көрген әр IP мекенжайларын өзбұғаттауы',
-'ipbsubmit' => 'Қатысушыны бұғатта',
+'ipbsubmit' => 'Қатысушыны бұғаттау',
 'ipbother' => 'Басқа мерзімі:',
 'ipboptions' => '2 сағат:2 hours,1 күн:1 day,3 күн:3 days,1 апта:1 week,2 апта:2 weeks,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 жыл:1 year,мәнгі:infinite',
 'ipbotheroption' => 'басқа',
 'ipbotherreason' => 'Басқа/қосымша себеп:',
 'ipbhidename' => 'Қатысушы атын бұғаттау журналыннан, белсенді бұғаттау тізімінен, қатысушы тізімінен жасыру',
 'ipbwatchuser' => 'Бұл қатысушының жеке және талқылау беттерін бақылау',
-'badipaddress' => 'Жарамсыз IP мекенжайы',
+'ipb-confirm' => 'Бұғаттауды растау',
+'badipaddress' => 'IP мекенжайы қате жазылған.',
 'blockipsuccesssub' => 'Бұғаттау сәтті өтті',
 'blockipsuccesstext' => '[[{{#special:Contributions}}/$1|$1]] деген бұғатталған.<br />
 Бұғаттарды шолып шығу үшін [[{{#special:Ipblocklist}}|IP бұғаттау тізімін]] қараңыз.',
@@ -2131,7 +2228,7 @@ $1',
 'ipusubmit' => 'Осы мекенжайды бұғаттамау',
 'unblocked' => '[[User:$1|$1]] бұғаттауы өшірілді',
 'unblocked-id' => '$1 бұғаттау аласталды',
-'ipblocklist' => 'Бұғатталған қатысушы / IP мекенжай тізімі',
+'ipblocklist' => 'Бұғатталған қатысушылар',
 'ipblocklist-legend' => 'Бұғатталған қатысушыны табу',
 'ipblocklist-submit' => 'Ізде',
 'infiniteblock' => 'мәнгі',
@@ -2144,6 +2241,7 @@ $1',
 'ipblocklist-no-results' => 'Сұратылған IP мекенжай не қатысушы аты бұғатталған емес.',
 'blocklink' => 'бұғаттау',
 'unblocklink' => 'бұғаттамау',
+'change-blocklink' => 'Бұғаттауын өзгерту',
 'contribslink' => 'үлесі',
 'autoblocker' => 'IP мекенжайыңызды жуықта «[[{{ns:user}}:1|$1]]» пайдаланған, сондықтан өзбұғатталған.
 $1 бұғаттауы үшін келтірілген себебі: «$2».',
@@ -2183,8 +2281,8 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».',
 Осы мақсатыңызды, және баптау біткенде дерекқорды ашатыңызды құптаңыз.',
 'unlockdbtext' => 'Дерекқодын ашылуы барлық қатысушылардың бет өңдеу, баптауын қалау, бақылау тізімін, тағы басқа дерекқорды өзгертетін мүмкіндіктерін қалпына келтіреді.
 Осы мақсатыңызды құптаңыз.',
-'lockconfirm' => 'Ð\98Ó\99, Ð´ÐµÑ\80екÒ\9bоÑ\80 Ò\9bұлÑ\8bпÑ\82аÑ\83Ñ\8bн Ð½Ð°Ò\9bÑ\82Ñ\8b тілеймін.',
-'unlockconfirm' => 'Ð\98Ó\99, Ð´ÐµÑ\80екÒ\9bоÑ\80 Ò\9bұлÑ\8bпÑ\82амаÑ\83Ñ\8bн Ð½Ð°Ò\9bÑ\82Ñ\8b Ñ\82Ñ\96леймÑ\96н.',
+'lockconfirm' => 'Ð\98Ó\99, Ð¼ÐµÐ½ Ñ\88Ñ\8bнÑ\8bменде Ð´ÐµÑ\80екÒ\9bоÑ\80дÑ\8bÒ£ Ò\9bұлÑ\8bпÑ\82алÑ\83Ñ\8bн тілеймін.',
+'unlockconfirm' => 'Ð\98Ó\99, Ð¼ÐµÐ½ Ñ\88Ñ\8bнÑ\8bменде Ð´ÐµÑ\80екÒ\9bоÑ\80дÑ\8bÒ£ Ò\9bұлÑ\8bпÑ\82алÑ\83Ñ\8bн Ó©Ñ\88Ñ\96Ñ\80гÑ\96м ÐºÐµÐ»ÐµÐ´Ñ\96.',
 'lockbtn' => 'Дерекқорды құлыпта',
 'unlockbtn' => 'Дерекқорды құлыптама',
 'locknoconfirm' => 'Құптау көзіне құсбелгі салмағансыз.',
@@ -2228,12 +2326,12 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».',
 
 Ал мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
 'movearticle' => 'Ағымдағы бет атауы:',
-'movenologin' => 'Ð\96үйеге кірмегенсіз',
+'movenologin' => 'СÑ\96з Ð¶үйеге кірмегенсіз',
 'movenologintext' => 'Бетті жылжыту үшін тіркелген болуыңыз және [[{{#special:UserLogin}}|кіруіңіз]] жөн.',
 'movenotallowed' => '{{SITENAME}} жобасында беттерді жылжыту руқсатыңыз жоқ.',
 'newtitle' => 'Жаңа бет атауы:',
 'move-watch' => 'Бұл бетті бақылау',
-'movepagebtn' => 'Бетті жылжыт',
+'movepagebtn' => 'Бетті жылжыту',
 'pagemovedsub' => 'Жылжыту сәтті аяқталды',
 'movepage-moved' => '\'\'\'"$1" беті "$2" бетіне жылжытылды\'\'\'',
 'articleexists' => 'Осылай аталған бет алдақашан бар, не таңдаған атауыңыз жарамды емес.
@@ -2291,6 +2389,12 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'allmessagestext' => 'Мында {{ns:mediawiki}} есім аясында жетімді жүйе хабар тізімі беріледі.
 Егер әмбебап MediaWiki жерсіндіруге үлес қосқыңыз келсе [//www.mediawiki.org/wiki/Localisation MediaWiki жерсіндіру бетіне] және [//translatewiki.net translatewiki.net жобасына] барып шығыңыз.',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' өшірілген себебінен '''{{#special:AllMessages}}''' беті қолданылмайды.",
+'allmessages-filter-legend' => 'Фильтр',
+'allmessages-filter-unmodified' => 'Өзгертілмегендер',
+'allmessages-filter-all' => 'Барлығы',
+'allmessages-filter-modified' => 'Өзгертілгендер',
+'allmessages-language' => 'Тілі:',
+'allmessages-filter-submit' => 'Өту',
 
 # Thumbnails
 'thumbnail-more' => 'Үлкейту',
@@ -2342,13 +2446,13 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'import-logentry-interwiki-detail' => '$2 дегеннен $1 түзету',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Жеке бетім',
+'tooltip-pt-userpage' => 'Жеке бетіңіз',
 'tooltip-pt-anonuserpage' => 'Бұл IP мекенжайдың жеке беті',
-'tooltip-pt-mytalk' => 'Талқылау бетім',
+'tooltip-pt-mytalk' => 'Талқылау бетіңіз',
 'tooltip-pt-anontalk' => 'Бұл IP мекенжай өңдемелерін талқылау',
 'tooltip-pt-preferences' => 'Бапталымдарым',
 'tooltip-pt-watchlist' => 'Өзгерістерін бақылап тұрған беттер тізімім.',
-'tooltip-pt-mycontris' => 'Үлестерімдің тізімі',
+'tooltip-pt-mycontris' => 'Өңдеулеріңіздің тізімі',
 'tooltip-pt-login' => 'Кіруіңізді ұсынамыз, ол міндетті емес.',
 'tooltip-pt-anonlogin' => 'Кіруіңізді ұсынамыз, бірақ, ол міндетті емес.',
 'tooltip-pt-logout' => 'Шығу',
@@ -2402,6 +2506,8 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'tooltip-watch' => 'Бұл бетті бақылау тізіміңізге үстеу',
 'tooltip-recreate' => 'Бет жойылғанына қарамастан қайта бастау',
 'tooltip-upload' => 'Қотарып беруді бастау',
+'tooltip-rollback' => '"Шегіндіру" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру',
+'tooltip-summary' => 'Қысқаша сипаттамасын жазыңыз',
 
 # Stylesheets
 'common.css' => '/* Мында орналастырылған CSS барлық мәнерлерде қолданылады */',
@@ -2483,8 +2589,8 @@ $1',
 'filedelete-archive-read-only' => '«$1» мұрағат қалтасына веб-сервер жаза алмайды.',
 
 # Browsing diffs
-'previousdiff' => '← Алдыңғы айырм.',
-'nextdiff' => 'Келесі айырм. →',
+'previousdiff' => '← Алдыңғы өңдеме',
+'nextdiff' => 'Келесі өңдеме →',
 
 # Media information
 'mediawarning' => "'''Құлақтандыру''': Бұл файл түрінде қаскүнемді коды бар болуы ықтимал; бұны жегіп жүйеңізге зиян келтіруіңіз мүмкін.",
@@ -2494,7 +2600,7 @@ $1',
 'widthheightpage' => '$1 × $2, $3 бет',
 'file-info' => 'Файл мөлшері: $1, MIME түрі: $2',
 'file-info-size' => '$1 × $2 нүкте, файл мөлшері: $3, MIME түрі: $4',
-'file-nohires' => 'Ð\96оÒ\93аÑ\80Ñ\8b Ð°Ð¶Ñ\8bÑ\80аÑ\82Ñ\8bлÑ\8bмдÑ\8bÒ\93Ñ\8b Ð¶ÐµÑ\82Ñ\96мÑ\81Ñ\96з.',
+'file-nohires' => 'Ð\96оÒ\93аÑ\80Ñ\8b ÐºÐµÒ£ÐµÐ¹Ñ\82Ñ\96лÑ\96мдегÑ\96 Ð½Ò±Ñ\81Ò\9bалаÑ\80Ñ\8b Ð¶Ð¾Ò\9b.',
 'svg-long-desc' => 'SVG файлы, кесімді $1 × $2 нүкте, файл мөлшері: $3',
 'show-big-image' => 'Жоғары ажыратылымды',
 
@@ -2791,7 +2897,7 @@ $1',
 
 # External editor support
 'edit-externally' => 'Бұл файлды шеттік қондырма арқылы өңдеу',
-'edit-externally-help' => 'Көбірек ақпарат үшін [//www.mediawiki.org/wiki/Manual:External_editors орнату нұсқамаларын] қараңыз.',
+'edit-externally-help' => '(көбірек ақпарат үшін [//www.mediawiki.org/wiki/Manual:External_editors орнату нұсқауларын] қараңыз.',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'барлық',
@@ -2923,7 +3029,7 @@ $5
 # Watchlist editing tools
 'watchlisttools-view' => 'Қатысты өзгерістерді қарау',
 'watchlisttools-edit' => 'Бақылау тізімді қарау және өңдеу',
-'watchlisttools-raw' => 'Қам бақылау тізімді өңдеу',
+'watchlisttools-raw' => 'Бақылау тізімін өңдеу',
 
 # Iranian month names
 'iranian-calendar-m1' => 'пыруардин',
index bec964d..72f3662 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Albamhandae
+ * @author Altostratus
  * @author Chanhee
  * @author Chulki Lee
  * @author Cwt96
@@ -952,7 +953,8 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 .css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
 'updated' => '(바뀜)',
 'note' => "'''주의:'''",
-'previewnote' => "'''이 화면은 미리 보기입니다'''. 편집한 내용은 아직 저장되지 않았습니다! [[#editform|→ 편집 계속하기]]",
+'previewnote' => "'''이 화면은 미리 보기입니다'''. 편집한 내용은 아직 저장되지 않았습니다!",
+'continue-editing' => '계속 편집하기',
 'previewconflict' => '이 미리 보기는 저장할 때의 모습, 즉 위쪽 편집창의 문서를 반영합니다.',
 'session_fail_preview' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.
 다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인해 보십시오.'''",
@@ -1043,6 +1045,10 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'parser-template-loop-warning' => '재귀적인 틀이 발견되었습니다: [[$1]]',
 'parser-template-recursion-depth-warning' => '틀 반복 횟수 제한을 초과함($1)',
 'language-converter-depth-warning' => '언어 변환기 실행 제한 초과($1)',
+'node-count-exceeded-category' => '페이지가 노드 횟수를 초과하였습니다.',
+'node-count-exceeded-warning' => '페이지가 노드 수를 초과하였습니다.',
+'expansion-depth-exceeded-category' => '페이지가 확장 깊이를 초과하였습니다.',
+'expansion-depth-exceeded-warning' => '페이지가 확장 깊이를 초과하였습니다',
 
 # "Undo" feature
 'undo-success' => '이 편집을 되돌리려면 아래의 변경되는 사항을 확인한 후 저장해주세요.',
@@ -2128,6 +2134,11 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'allpages-bad-ns' => '{{SITENAME}}에서는 ‘$1’ 이름공간을 사용하지 않습니다.',
 'allpages-hide-redirects' => '넘겨주기 숨기기',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => '지금 이 문서의 캐시된 버전을 보고 있습니다. 이 버전은 최대 $1만큼 지난 버전일 가능성이 있습니다.',
+'cachedspecial-viewing-cached-ts' => '현재 이 페이지는 캐시 처리된 버전으로 현재 문서 상태를 반영하지 않을 수도 있습니다.',
+'cachedspecial-refresh-now' => '최신 버전 보기.',
+
 # Special:Categories
 'categories' => '분류',
 'categoriespagetext' => '{{PLURAL:$1}}문서나 자료를 담고 있는 분류 목록입니다.
@@ -2561,7 +2572,8 @@ $1',
 'ipb-confirm' => '차단 확인',
 'badipaddress' => '잘못된 IP 주소',
 'blockipsuccesssub' => '차단 완료',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다. 차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다.<br />
+차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
 'ipb-blockingself' => '자기 자신을 차단하려고 합니다. 정말로 실행할까요?',
 'ipb-confirmhideuser' => '당신은 사용자를 차단하면서 "계정 숨기기" 설정을 선택했습니다. 이로써 모든 기록에서 이 사용자의 계정 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
 'ipb-edit-dropdown' => '차단 이유 목록 편집하기',
@@ -2612,7 +2624,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'blocklog-showsuppresslog' => '이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다. 해당 사용자의 차단 기록은 다음과 같습니다.',
 'blocklogentry' => '[[$1]] 사용자를 $2 차단함 $3',
 'reblock-logentry' => '[[$1]] 사용자의 차단 기간을 $2(으)로 변경 $3',
-'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다. 자동으로 차단된 IP 주소는 여기에 나오지 않습니다. [[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
+'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다.
+자동으로 차단된 IP 주소는 여기에 나오지 않습니다.
+[[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
 'unblocklogentry' => '$1을 차단 해제했습니다.',
 'block-log-flags-anononly' => 'IP만 막음',
 'block-log-flags-nocreate' => '계정 생성 막음',
@@ -3694,6 +3708,9 @@ $5
 'version-software' => '설치된 프로그램',
 'version-software-product' => '제품',
 'version-software-version' => '버전',
+'version-entrypoints' => 'URL 진입점',
+'version-entrypoints-header-entrypoint' => '진입점',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => '파일 경로',
@@ -3799,7 +3816,7 @@ $5
 'logentry-delete-delete' => '$1 사용자가 $3 문서를 삭제하였습니다.',
 'logentry-delete-restore' => '$1 사용자가 $3 문서를 복구하였습니다.',
 'logentry-delete-event' => '$1 사용자가 $3의 $5개의 기록에 대해 표시 설정을 바꾸었습니다: $4',
-'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5}}개 편집의 설정을 변경하였습니다: $4',
+'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5}}개 편집의 설정을 변경하였습니다: $4',
 'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 표시 설정을 변경하였습니다.',
 'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 표시 설정을 변경하였습니다.',
 'logentry-suppress-delete' => '$1 사용자가 $3 문서를 숨겼습니다.',
@@ -3881,4 +3898,15 @@ $5
 'api-error-uploaddisabled' => '이 위키에서 파일 올리기가 비활성화되어 있습니다.',
 'api-error-verification-error' => '파일이 손상되었거나 잘못된 확장자를 사용하고 있습니다.',
 
+# Durations
+'duration-seconds' => '$1{{PLURAL:$1|초}}',
+'duration-minutes' => '$1{{PLURAL:$1|분}}',
+'duration-hours' => '$1{{PLURAL:$1|시간}}',
+'duration-days' => '$1{{PLURAL:$1|일}}',
+'duration-weeks' => '$1{{PLURAL:$1|주}}',
+'duration-years' => '$1{{PLURAL:$1|년}}',
+'duration-decades' => '$1{{PLURAL:$1|0년}}',
+'duration-centuries' => '$1{{PLURAL:$1|세기}}',
+'duration-millennia' => '$1{{PLURAL:$1|천년}}',
+
 );
index b36ca74..a8c614a 100644 (file)
@@ -326,6 +326,8 @@ $1',
 'page-rss-feed' => '«$1» — RSS-лентасы',
 'page-atom-feed' => '«$1» — Atom-лентасы',
 'red-link-title' => '$1 (быллай бет джокъду)',
+'sort-descending' => 'Кем болуугъа кёре тиз',
+'sort-ascending' => 'Ёсюуге кёре тиз',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Статья',
@@ -392,6 +394,7 @@ $1',
 'badarticleerror' => 'Бу бетде этилирге болмайды быллай амал.',
 'cannotdelete' => '«$1» файлны неда бетни кетерирге болмайды.
 Башха къошулуучу кетерген болургъа боллукъду аны.',
+'cannotdelete-title' => '«$1» бетни кетерирге болмайды',
 'badtitle' => 'Джарамагъан ат',
 'badtitletext' => 'Сорулгъан бетни аты терсди, бошду, неда интервики аты терс джазылгъанды. Келишмеген (хайырланыргъа болмагъан) символла хайырланыргъада боллукъдула атында.',
 'perfcached' => 'Бу информация кэшден алыннганды, ахыр тюрлениулени кёргюзмезге боллукъду. Кэшде максимум {{PLURAL:$1|джазыу}} сакъланады.',
@@ -402,6 +405,7 @@ $1',
 Функция: $1<br />
 Соруу: $2',
 'viewsource' => 'Къарау',
+'viewsource-title' => '$1 бетни чыкъгъан текстине къарау',
 'actionthrottled' => 'Терклик чекленнгенди',
 'actionthrottledtext' => 'Спамгъа къаршчы кюрешиуню себебинден, аз заманны ичинде бу амал бла кёб кере хайырланыу тыйылыбды. Кечирек джангыдан кёрюгюз.',
 'protectedpagetext' => 'Бу бет тюрлендириуге джабылыбды.',
@@ -493,6 +497,7 @@ $2',
 'emailconfirmlink' => 'Электрон почта адресигизни бегитигиз.',
 'invalidemailaddress' => 'Электрон почта адресигизи къабыл этилинирге болмайды, форматха келишмегени ючюн.
 Тюз адрес джазыгъыз неда тизгинни бош къоюгъуз.',
+'emaildisabled' => 'Бу сайт, электрон потча бла билдириуле иймейди.',
 'accountcreated' => 'Тергеу джазыу (аккаунт) къуралды',
 'accountcreatedtext' => '$1 къошулуучугъа тергеу джазыу (аккаунт) къуралды.',
 'createaccount-title' => '{{SITENAME}}: тергеу джазыу (аккаунт) къурау',
@@ -526,13 +531,22 @@ $2',
 'resetpass-temp-password' => 'Болджаллы пароль:',
 
 # Special:PasswordReset
+'passwordreset' => 'Паролну атыу',
+'passwordreset-text' => 'Электрон джазма бла тергеу джазыуугъузну (аккаунтугъузну) параметрлерини юсюнден билдириу алыр ючюн бу форманы толтуругъуз.',
+'passwordreset-legend' => 'Паролну ий',
+'passwordreset-disabled' => 'Бу викиде паролла атыу амал джукъланыбды.',
+'passwordreset-pretext' => '{{PLURAL:$1||Тюбюрекде берилген билгиледен бирин джазыгъыз}}',
 'passwordreset-username' => 'Къошулуучуну аты:',
 'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Джазылгъан билдириуню эсебине къара?',
+'passwordreset-capture-help' => 'Бу белгини салсагъыз, къошулуучугъа ийилген болджаллы пароль бла билдириу сизге кёргюзюллюкдю.',
+'passwordreset-email' => 'Электрон почтаны адреси:',
 
 # Special:ChangeEmail
 'changeemail-no-info' => 'Бу бетни кёрюр ючюн сиз системагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керексиз.',
 'changeemail-newemail' => 'Электрон почтаны джангы адреси:',
 'changeemail-none' => '(джокъ)',
+'changeemail-cancel' => 'Ызына алыу',
 
 # Edit page toolbar
 'bold_sample' => 'Къалын джазыу',
@@ -641,7 +655,8 @@ $2',
 'userinvalidcssjstitle' => "'''Эс бёлюгюз:''' «$1» атлы тема джокъду. Эсде тутугъуз, .css эм .js бетле атлары ажымсыз къуру гитче харифледен болургъа керекди, сёз ючюн: {{ns:user}}:Foo/vector.css, былай  {{ns:user}}:Foo/Vector.css тюйюл!",
 'updated' => '(Джангыртылды)',
 'note' => "'''Белги:'''",
-'previewnote' => "'''Бу къуру ал къарауду, текст алкъын сакъланмагъанды!'''",
+'previewnote' => "'''Бу къуру ал къарауду.'''
+Сиз этген тюрлениуле алкъын сакъланмагъандыла!",
 'previewconflict' => 'Бу ал къарау, башындагъы тюрлендириу терезеде текстни сакъланнганча кёргюзеди.',
 'session_fail_preview' => "'''Джарсыугъа, сессияны идентификаторуну тас этгени себебли, сервер сизни тюрлендириуюгюзни сакълаталмагъанды.
 Энтдада кёрюгюз.
@@ -654,6 +669,7 @@ $2',
 Себеби: браузеригиз редактор терезеде пунктуация белгилени терс кёргюзеди, аны ючюн статьяны тексти бузулургъа боллукъду.
 Бу халатлары болгъан аноним веб-проксилени хайырландырылгъанлары ючюн болургъа боллукъду'''",
 'editing' => '«$1» бетни тюрлендириу',
+'creating' => '«$1» бетни къурау',
 'editingsection' => '«$1» бетде бёлюмню тюрлендириу',
 'editingcomment' => '«$1» бетни тюрлендириу (джангы бёлюм)',
 'editconflict' => 'Тюрлендириу конфликт: $1',
@@ -677,7 +693,7 @@ $2',
 Башхала сизни текстлеригизни тюрлендиргенлерин излемей эсегиз, былайгъа салмагъыз.<br />
 Сиз дагъыда этген къошакъларыгъызны автору болгъаныгъызны неда информацияны чыкъгъан джери эркин джаяргъа эм тюрлендирирге къойгъанын аны бегитесиз (къарагъыз: $1).
 '''ЭРКИНЛИКСИЗ АВТОР ХАКЪ БЛА ДЖАКЪЛАННГАН МАТЕРИАЛЛА САЛМАГЪЫЗ БЫЛАЙГЪА!'''",
-'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|$1 килобайт|$1 килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|$2 килобайт|$2 килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
+'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|бир килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|бир килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
 'readonlywarning' => "'''Эс бёлюгюз: Билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригиз къошулаллыкъ тюлдю. Джазгъанларыгъызны башха бир файлда сакълаб, кечирек къошаргъа боллукъсуз'''
 
 Киритлеген администратор бу билдириуню къойгъанды: $1",
@@ -779,7 +795,7 @@ $3 джанындан берилген сылтау: ''$2''",
 Темасы аннга ушагъан бетлени табар ючюн [[Special:Search|викиде излеб]] кёрюгюз.',
 
 # Revision deletion
-'rev-deleted-comment' => '(комментарий кетерилгенди)',
+'rev-deleted-comment' => '(тюрлендириуню суратлауу кетерилгенди)',
 'rev-deleted-user' => '(къошулуучуну аты кетерилгенди)',
 'rev-deleted-event' => '(джазыу кетерилгенди)',
 'rev-deleted-user-contribs' => '[къошулуучуну аты неда IP-адреси кетерилгенди — тюрлендириу къошакъны бетинде кёргюзюлмейди]',
@@ -1594,7 +1610,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'unusedtemplateswlh' => 'башха джибериуле',
 
 # Random page
-'randompage' => 'Ð\9aÑ\8aайÑ\81Ñ\8b Ð±Ð¾Ð»Ñ\81а Ð´Ð°',
+'randompage' => 'ЭÑ\81де Ð±Ð¾Ð»Ð¼Ð°Ð³Ñ\8aан Ð±ÐµÑ\82',
 'randompage-nopages' => '{{PLURAL:$2|Ат аланында|Ат аланында}} чырт бир бет джокъду: $1.',
 
 # Random redirect
@@ -1693,7 +1709,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'listusers-editsonly' => 'Къуру тюрлендириу этген къошлуучуланы кёргюз',
 'listusers-creationsort' => 'Къуралгъан заманына кёре сафла',
 'usereditcount' => '$1 {{PLURAL:$1|тюрлендириу|тюрлендириу}}',
-'usercreated' => 'Къуралгъанды: $1 $2',
+'usercreated' => '$1 $2 заманда {{GENDER:$3|регистрацияны ётгенди}}',
 'newpages' => 'Джангы бетле',
 'newpages-username' => 'Къошулуучуну аты:',
 'ancientpages' => 'Ахыр тюрлендириуге кёре эм эски болгъан статьяла',
@@ -1719,8 +1735,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'booksources-invalid-isbn' => 'Берилген ISBN джараусуз кибик кёрюнеди; оригинал къайнакъдан кёчюрюлген заманда халатланы контроль этигиз.',
 
 # Special:Log
-'specialloguserlabel' => 'Ð\9aÑ\8aоÑ\88Ñ\83луучу:',
-'speciallogtitlelabel' => 'Ð\91аÑ\88лÑ\8bкÑ\8a:',
+'specialloguserlabel' => 'ТолÑ\82Ñ\83Ñ\80уучу:',
+'speciallogtitlelabel' => 'ЫÑ\88ан (баÑ\88лÑ\8bкÑ\8a Ð½ÐµÐ´Ð° ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83):',
 'log' => 'Журналла',
 'all-logs-page' => 'Бютеу ачыкъ журналла',
 'alllogstext' => '{{SITENAME}} ючюн бютеу бар болгъан журналланы бирлешген списогу.
@@ -1760,12 +1776,13 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'sp-deletedcontributions-contribs' => 'къошхан юлюш',
 
 # Special:LinkSearch
-'linksearch' => 'Тыш джибериуле',
+'linksearch' => 'Тыш джибериулени излеу',
 'linksearch-pat' => 'Излеуге шаблон:',
 'linksearch-ns' => 'Ат алам:',
 'linksearch-ok' => 'Таб',
-'linksearch-text' => '<code>*.wikipedia.org</code> кибик джокерле хайырландырыргъа боллукъду.<br />
-Дагъан болгъан протоколла: <tt>$1</tt>',
+'linksearch-text' => '<code>*.wikipedia.org</code> кибик символлла хайырландырыргъа боллукъдула.
+Эм азы бла огъары дараджаны домени керекди, юлгюге: <code>*.org</code><br />
+Дагъан болгъан протоколла: <tt>$1</tt> (быладан къайсысында излеуюгюзге къошмагъыз)',
 'linksearch-line' => '$1-ге  $2-ден джибериу берилгенди',
 'linksearch-error' => 'Джокерле къуру адреслени аллында хайырланыргъа боллукъдула.',
 
@@ -1817,13 +1834,16 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'emailpagetext' => 'Бу къошулуучуну почтасына письмо джиберир ючюн бу форманы толтурургъа боллукъсуз.
 Ызына адрес болуб, сиз [[Special:Preferences|джарашдырыуларыгъызда]] джазгъан адрес белгиленникди, ол себебден сизни письмогъузну аллыкъ сизге тюз джууаб берирге мадарлы боллукъду.',
 'usermailererror' => 'Халат ючюн элетктрон письмо ызына къайтды:',
-'defemailsubject' => '{{SITENAME}} письмо',
+'defemailsubject' => '{{SITENAME}} — $1 къошулуучудан билдириу',
 'usermaildisabled' => 'Къошулуучуну электрон почтасы джукъланыбды',
 'usermaildisabledtext' => 'Сиз бу викини башха къошулуучуларына электрон письмола джиберелмейсиз',
 'noemailtitle' => 'Электрон почтаны адреси джокъду',
 'noemailtext' => 'Бу къошулуучу керти электрон адресин бермегенди.',
 'nowikiemailtitle' => 'Электрон письмо джиберирге эркинлик джокъду',
 'nowikiemailtext' => 'Бу къошулуучу, башха къошулуучуладан электрон писмо алыргъа излемегенин билдиргенди.',
+'emailtarget' => 'Аллыкъ къошулуучуну атын джазыгъыз',
+'emailusername' => 'Къошулуучуну аты:',
+'emailusernamesubmit' => 'Джибер',
 'email-legend' => 'Башха {{SITENAME}} къошулуучугъа электрон письмо джибер',
 'emailfrom' => 'Кимден:',
 'emailto' => 'Кимге:',
@@ -1848,8 +1868,10 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'watchlistanontext' => 'Кёзюгюзде тургъан тизмегизни статьяланы кёрюр неда тюрлендирир ючюн $1.',
 'watchnologin' => 'Системагъа кирирге керекди.',
 'watchnologintext' => 'Кёзюгюзде тургъан тизмегизни тюрлендирир ючюн [[Special:UserLogin|системагъа кирирге керексиз]].',
+'addwatch' => 'Кёзде тургъан тизмеге къош',
 'addedwatchtext' => '«[[:$1]]» бет [[Special:Watchlist|кёзюгюзде тургъан тизмегизге]] къошулду.
 Бу бетни эмда муну бла байламлы сюзюу бетни тюрлениулери ол тизмеде белгиленникдиле, [[Special:RecentChanges|джангы тюрлениулени тизмесини]] бетинде уа къалын шрифт бла чертилинникдиле, кёрюрге тынчыракъ болурча.',
+'removewatch' => 'Кёзде тургъан тизмеден кетер',
 'removedwatchtext' => '«[[:$1]]» бет сизни [[Special:Watchlist|кёзюгюзде тургъан тизмегизден]] кетерилгенди.',
 'watch' => 'Кёзде тут',
 'watchthispage' => 'Бу бетни кёзде тут',
@@ -2169,6 +2191,7 @@ $1',
 'unblocked-id' => '$1 тыйылыу къоратылгъанды',
 'ipblocklist' => 'Блок этилиннген IP-адресле эм къошулуучуланы атлары',
 'ipblocklist-legend' => 'Тыйылгъан къошулуучуну аты',
+'blocklist-expiry' => 'Бошалыу датасы',
 'blocklist-reason' => 'Чурум',
 'ipblocklist-submit' => 'Таб',
 'ipblocklist-localblock' => 'Локал блокга салыу',
@@ -2450,8 +2473,8 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-pt-mytalk' => 'Сизни сюзюу бетигиз',
 'tooltip-pt-anontalk' => 'Бу IP-адресден этилген тюрлендириулени сюзюу бет',
 'tooltip-pt-preferences' => 'Джарашдырыуларыгъыз',
-'tooltip-pt-watchlist' => 'Ð\9cен ÐºÑ\91зÑ\8eмде тутхан бетлени тизмеси',
-'tooltip-pt-mycontris' => 'Сизни Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83леÑ\80игизни Ñ\81пиÑ\81огÑ\83',
+'tooltip-pt-watchlist' => 'Сиз ÐºÑ\91зÑ\8eгÑ\8eзде тутхан бетлени тизмеси',
+'tooltip-pt-mycontris' => 'Сизни Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83леÑ\80игизни Ñ\82измеÑ\81и',
 'tooltip-pt-login' => 'Былайда системада регистрация этерге боллукъду, алай а ол ажымсыз керекли тюйюлдю',
 'tooltip-pt-anonlogin' => 'Былайда сисетмагъа регистрация этерге боллукъду, алай а бу зорунлу тюлдю.',
 'tooltip-pt-logout' => 'Чыгъыу',
@@ -2476,7 +2499,7 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-n-portal' => 'Проектни юсюнден, сизни не этерге боллугъугъузню юсюнден, хар не къайда болгъаныны юсюнден',
 'tooltip-n-currentevents' => 'Бусагъатда болгъан ишлени списогу',
 'tooltip-n-recentchanges' => 'Ахыр тюрлениулени списогу',
-'tooltip-n-randompage' => 'Ð\9aÑ\8aайÑ\81Ñ\8b Ð±Ð¾Ð»Ñ\81ада бир бетге къара',
+'tooltip-n-randompage' => 'ЭÑ\81де Ð±Ð¾Ð»Ð¼Ð°Ð³Ñ\8aан бир бетге къара',
 'tooltip-n-help' => '«{{SITENAME}}» проектге джардам этиу',
 'tooltip-t-whatlinkshere' => 'Бу бетге джибериу берген бютеу бетлени списогу',
 'tooltip-t-recentchangeslinked' => 'Бу бет джибериуле берген бетледе ахыр тюрлениуле',
@@ -2504,6 +2527,8 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-diff' => 'Тюрлендириулеригизни кёрюгюз',
 'tooltip-compareselectedversions' => 'Бу бетни сайланнган эки версиясыны араларында башхалыкъларын кёр',
 'tooltip-watch' => 'Бу бетни кёзюгюзде тургъан тизмеге къош',
+'tooltip-watchlistedit-normal-submit' => 'Белгиленнген атланы кетер',
+'tooltip-watchlistedit-raw-submit' => 'Кёзде тургъан тизмени джангырт',
 'tooltip-recreate' => 'Кетерилгенина къарамай бетни ызына къайтар',
 'tooltip-upload' => 'Джюклеуню башла',
 'tooltip-rollback' => 'Бир басхан бла ахыр къошулуучуну тюрлендиргенин кетер',
@@ -2534,6 +2559,17 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'spam_reverting' => '$1 бла джибериую болмагъан ахыр версиягъа къайтылады',
 'spam_blanking' => 'Бютеу версияла $1 бетге джибериу тутадыла, ариуланадыла',
 
+# Info page
+'pageinfo-title' => '«$1» бетни юсюнден информация',
+'pageinfo-header-edits' => 'Тюрлендириуле',
+'pageinfo-header-watchlist' => 'Кёзде тургъан тизме',
+'pageinfo-header-views' => 'Къараула',
+'pageinfo-subjectpage' => 'Бет',
+'pageinfo-talkpage' => 'Сюзюу бет',
+'pageinfo-watchers' => 'Кёргенлени саны',
+'pageinfo-edits' => 'Тюрлендириулени саны',
+'pageinfo-authors' => 'Авторланы саны',
+
 # Skin names
 'skinname-standard' => 'Стандарт',
 'skinname-nostalgia' => 'Ностальгия',
@@ -2588,6 +2624,8 @@ $1',
 'file-nohires' => 'Мындан ары ачыкъланнган версиясы джокъду',
 'svg-long-desc' => 'SVG файл, шартлы $1 × $2 пиксель, файлны ёлчеми: $3',
 'show-big-image' => 'Толу ачыкълау',
+'show-big-image-preview' => 'Ал къарауда уллулугъу: $1.',
+'show-big-image-size' => '$1 × $2 пиксель',
 'file-info-gif-looped' => 'тогъайланнганды',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм|фрейм}}',
 'file-info-png-looped' => 'тогъайланнганды',
@@ -2606,6 +2644,13 @@ $1',
 'bydate' => 'Хронологиягъа кёре',
 'sp-newimages-showfrom' => '$1, $2 замандан башлаб джангы файлланы кёргюз',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 секунд|$1 секунд}}',
+'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
+'hours' => '{{PLURAL:$1|$1 сагъат|$1 сагъат}}',
+'days' => '{{PLURAL:$1|$1 кюн|$1 кюн}}',
+'ago' => '$1 алгъа',
+
 # Bad image list
 'bad_image_list' => 'Формат былай болургъа керекди:
 
@@ -2618,7 +2663,7 @@ $1',
 'metadata-help' => 'Файл, кёбюсюне цифралы камерала бла, неда сканерле бла къошулгъан, къошакъ билгилени тутаргъа болады. Файл къуралгъанындан сора тюрлендирилген эсе, бир-бир параметрлери бусагъатдагъы суратына келишмезге болур.',
 'metadata-expand' => 'Дагъыда билгиле кёргюз',
 'metadata-collapse' => 'Къошакъ билгилени джашыр',
-'metadata-fields' => 'Ð\91Ñ\83 Ñ\81пиÑ\81окда ÐºÐµÐ»Ñ\82иÑ\80илинген Ð¼ÐµÑ\82аданнÑ\8bйлени Ñ\82изгинлеÑ\80и, Ñ\81Ñ\83Ñ\80аÑ\82нÑ\8b Ð±ÐµÑ\82инде Ñ\82Ñ\8bнгÑ\8bлаÑ\83 Ð±Ð»Ð° ÐºÑ\91Ñ\80гÑ\8eзÑ\82Ñ\8eлÑ\8eнлÑ\8eкдÑ\8eле, ÐºÑ\8aалгÑ\8aанла джашырылыныб боллукъдула.
+'metadata-fields' => 'Ð\91Ñ\83 Ñ\82измеде ÐºÐµÐ»Ñ\82иÑ\80илген Ñ\81Ñ\83Ñ\80аÑ\82 Ð¼ÐµÑ\82абилгилеи Ñ\82изгинлеÑ\80и, Ñ\81Ñ\83Ñ\80аÑ\82нÑ\8b Ð±ÐµÑ\82инде ÐºÑ\91Ñ\80гÑ\8eзÑ\8eллÑ\8eкдÑ\8eле, ÐºÑ\8aалгÑ\8aанла Ñ\82Ñ\8bнгÑ\8bлаÑ\83 Ð±ла джашырылыныб боллукъдула.
 * make
 * model
 * datetimeoriginal
@@ -2668,7 +2713,7 @@ $1',
 'exif-componentsconfiguration' => 'Хар компонентни ангыламы',
 'exif-compressedbitsperpixel' => 'Суратны къысдырыу амалы',
 'exif-pixelydimension' => 'Суратны кенглиги',
-'exif-pixelxdimension' => 'Суратны толу кенглиги',
+'exif-pixelxdimension' => 'Суратны мийиклиги',
 'exif-usercomment' => 'Къошакъ комментарий',
 'exif-relatedsoundfile' => 'Тауушлу комментарийни файлы',
 'exif-datetimeoriginal' => 'Оригинал джаратыу заман',
@@ -2682,9 +2727,9 @@ $1',
 'exif-exposureprogram' => 'Экспозицияны программасы',
 'exif-spectralsensitivity' => 'Спектрал сезимлилик',
 'exif-isospeedratings' => 'ISO терклик дараджасы',
-'exif-shutterspeedvalue' => 'Декланшорну терклиги',
-'exif-aperturevalue' => 'Диафрагма',
-'exif-brightnessvalue' => 'Джарыкълыкъ',
+'exif-shutterspeedvalue' => 'APEX декланшорну терклиги',
+'exif-aperturevalue' => 'APEX-де диафрагма',
+'exif-brightnessvalue' => 'APEX-де джарыкълыкъ',
 'exif-exposurebiasvalue' => 'Экспозицияны коменсациясы',
 'exif-maxaperturevalue' => 'Максимум диафрагма саны',
 'exif-subjectdistance' => 'Объектге дери узакълыкъ',
@@ -2747,9 +2792,59 @@ $1',
 'exif-gpsareainformation' => 'GPS тёгерекни аты',
 'exif-gpsdatestamp' => 'GPS заман',
 'exif-gpsdifferential' => 'GPS дифференциялы тюзетиу',
+'exif-jpegfilecomment' => 'JPEG-файлны белгиси',
+'exif-keywords' => 'Ачхыч сёзле',
+'exif-countrydest' => 'Суратланнган кърал',
+'exif-provinceorstatedest' => 'Суратланнган провинция, территория неда штат',
+'exif-citydest' => 'Суратланнган шахар',
+'exif-objectname' => 'Къысха аты',
+'exif-specialinstructions' => 'Энчи ангылатыула',
+'exif-headline' => 'Башлыкъ',
+'exif-credit' => 'Суратны берген',
+'exif-source' => 'Къайнакъ',
+'exif-editstatus' => 'Суратны редакцион статусу',
+'exif-urgency' => 'Бу сагъатха магъаналылыгъы',
+'exif-fixtureidentifier' => 'Колонканы аты',
+'exif-locationdest' => 'Суратланнган джер',
+'exif-objectcycle' => 'Бу сурат ючюн сутканы кёзюую',
+'exif-contact' => 'Контактлы информация',
+'exif-writer' => 'Текстни автору',
+'exif-languagecode' => 'Тил',
+'exif-iimversion' => 'IIM версиясы',
+'exif-iimcategory' => 'Категория',
+'exif-iimsupplementalcategory' => 'Къошакъ категорияла',
+'exif-datetimeexpires' => 'Бу датадан сора хайырланмагъыз:',
+'exif-datetimereleased' => 'Чыкъгъан датасы:',
+'exif-identifier' => 'Идентификатор',
+'exif-lens' => 'Хайырланнган объектив',
+'exif-serialnumber' => 'Камераны сериялы номери',
+'exif-cameraownername' => 'Камераны иеси',
+'exif-label' => 'Белги',
+'exif-datetimemetadata' => 'Метабилгилени ахыр тюрлениулерини датасы',
+'exif-nickname' => 'Суратны, формализмли болмагъан аты',
+'exif-rating' => 'Багъа (5-ден)',
+'exif-rightscertificate' => 'Хакъланы джюрютюу сертификат',
+'exif-copyrighted' => 'Автор хакъланы статусу:',
+'exif-copyrightowner' => 'Автор хакъланы иеси',
+'exif-usageterms' => 'Хайырланыуну шартлары',
+'exif-pngfilecomment' => 'PNG-файлны белгиси',
+'exif-disclaimer' => 'Джууаблылыкъны унамау',
+'exif-contentwarning' => 'Ичиндегисини юсюнден эсгертиу',
+'exif-giffilecomment' => 'GIF-файлны белгиси',
+'exif-intellectualgenre' => 'Объектни типи',
+'exif-subjectnewscode' => 'Теманы коду',
+'exif-scenecode' => 'IPTC сахнаны коду',
+'exif-event' => 'Суратланнган болуу',
+'exif-organisationinimage' => 'Суратланнган организация',
+'exif-personinimage' => 'Суратланнган адам',
 
 # EXIF attributes
 'exif-compression-1' => 'Къысдырылмагъан',
+'exif-compression-3' => 'CCITT Group 3, факс кодлау',
+'exif-compression-4' => 'CCITT Group 4, факс кодлау',
+
+'exif-copyrighted-true' => 'Автор хакъла бла джакъланыбды',
+'exif-copyrighted-false' => 'Джамагъат мюлк',
 
 'exif-unknowndate' => 'Билинмеген заман',
 
@@ -2758,9 +2853,9 @@ $1',
 'exif-orientation-3' => '180° бурулгъанды',
 'exif-orientation-4' => 'Вертикал бла кёргюзюлгенди',
 'exif-orientation-5' => '90° бурулгъан (солгъа) эмда вертикал бла кёргюзюлгенди',
-'exif-orientation-6' => '90° бурулгъаннды (сагъат стрелкагъа)',
+'exif-orientation-6' => 'Сагъат стрелкагъа къаршчы 90° бурулгъанды',
 'exif-orientation-7' => '90° бурулгъанды (сагъат стрелкагъа) эмда вертикал бла кёргюзюлгенди',
-'exif-orientation-8' => '90° бурулгъанды (солгъа)',
+'exif-orientation-8' => 'Сагъат стрелкагъа кёре 90° бурулгъанды',
 
 'exif-planarconfiguration-1' => '«chunky» формат',
 'exif-planarconfiguration-2' => '«planar» формат',
@@ -2769,7 +2864,7 @@ $1',
 'exif-xyresolution-c' => '$1 dpc',
 
 'exif-colorspace-1' => 'sRGB',
-'exif-colorspace-65535' => 'FFFF.H',
+'exif-colorspace-65535' => 'Суратны бояу джарашдырыуу этилмегенди',
 
 'exif-componentsconfiguration-0' => 'Джокъду',
 
@@ -2886,6 +2981,10 @@ $1',
 'exif-gpslongitude-e' => 'Кюнчыгъыш узунлукъ',
 'exif-gpslongitude-w' => 'Кюнбатыш узунлукъ',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|метрге|метрге}} тенгизден мийик',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|метрге|метрге}} тенгизден алаша',
+
 'exif-gpsstatus-a' => 'Ёлчелеу бошалмагъанды',
 'exif-gpsstatus-v' => 'Ёлчелеу бошалгъанды',
 
@@ -2897,15 +2996,54 @@ $1',
 'exif-gpsspeed-m' => 'Миль/сагъат',
 'exif-gpsspeed-n' => 'Тенгиз миля',
 
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Километрле',
+'exif-gpsdestdistance-m' => 'Миляла',
+'exif-gpsdestdistance-n' => 'Тенгиз миляла',
+
+'exif-gpsdop-excellent' => 'Айырма иги ($1)',
+'exif-gpsdop-good' => 'Иги ($1)',
+'exif-gpsdop-moderate' => 'Орта ($1)',
+'exif-gpsdop-fair' => 'Ортадан аман ($1)',
+'exif-gpsdop-poor' => 'Аман ($1)',
+
+'exif-objectcycle-a' => 'Къуру эртдембла',
+'exif-objectcycle-p' => 'Къуру ингирде',
+'exif-objectcycle-b' => 'Эртдембла эм ингирде',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Керти',
 'exif-gpsdirection-m' => 'Мукъладис',
 
+'exif-ycbcrpositioning-1' => 'Centered',
+'exif-ycbcrpositioning-2' => 'CO-sited',
+
+'exif-dc-contributor' => 'Автор нёгерле',
+'exif-dc-coverage' => 'Медианы кенгликле чеклери бла заман чеклери',
+'exif-dc-date' => 'Дата(ла)',
+'exif-dc-publisher' => 'Басмагъа чыгъаргъан',
+'exif-dc-relation' => 'Байламлы медиа',
+'exif-dc-rights' => 'Хакъла',
+'exif-dc-source' => 'Къайнакъ медиа',
+'exif-dc-type' => 'Медианы типи',
+
+'exif-rating-rejected' => 'Къабыл этилмеди',
+
+'exif-isospeedratings-overflow' => '65535-ден уллуду',
+
+'exif-iimcategory-ace' => 'Санат, культура эм кёз ачыу',
+'exif-iimcategory-clj' => 'Аманлыкъчылыкъ эм закон',
+'exif-iimcategory-dis' => 'Катастрофала эм аварияла',
+'exif-iimcategory-fin' => 'Экономика эм бизнес',
 'exif-iimcategory-edu' => 'Окъуу',
+'exif-iimcategory-evn' => 'Тёгерекдеги табийгъат',
 'exif-iimcategory-hth' => 'Саулукъ',
+'exif-iimcategory-hum' => 'Интересли хапарла',
 'exif-iimcategory-lab' => 'Урунуу',
+'exif-iimcategory-lif' => 'Джашау хал эм бош заман',
 'exif-iimcategory-pol' => 'Политика',
 'exif-iimcategory-rel' => 'Дин бла ийнам',
+'exif-iimcategory-sci' => 'Илму эм техника',
 'exif-iimcategory-soi' => 'Социал соруула',
 'exif-iimcategory-spo' => 'Спорт',
 'exif-iimcategory-war' => 'Къазауатла, конфликтле эмда къозгъалыула',
@@ -2995,6 +3133,10 @@ $5
 'confirm-purge-top' => 'Бу бетни кеши кетерилсинми?',
 'confirm-purge-bottom' => 'Бетни кеши кетерилгенден сора, андан сора келген версиясы кёргюзюллюкдю.',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'ОК',
+'confirm-unwatch-button' => 'ОК',
+
 # Separators for various lists, etc.
 'semicolon-separator' => ';&#32;',
 'percent' => '$1%',
@@ -3152,6 +3294,7 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'version-software' => 'Салыннган программа баджарыу',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Файлгъа джол',
@@ -3252,33 +3395,56 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'sqlite-no-fts' => '$1 толу текст излеуню хайырландыра билмеген',
 
 # New logging system
+'revdelete-content-hid' => 'ичиндегиси джашырылыбды',
 'revdelete-summary-hid' => 'тюрлендириуню ачыкълауу джашырылыбды',
+'revdelete-uname-hid' => 'къошулуучуну аты джашырылыбды',
+'revdelete-content-unhid' => 'ичиндегиси кёргюзюлдю',
 'revdelete-uname-unhid' => 'къошулуучуну аты ачылды',
 'revdelete-restricted' => 'администраторла ючюн этилген чеклениуле',
 'revdelete-unrestricted' => 'администратолра ючюн этилген чеклениуле къоратылгъандыла',
+'logentry-move-move' => '$1, $3 бетни атын $4 деб тюрлендирди',
 'logentry-patrol-patrol-auto' => '$1, $3 бетни $4 версиясын автомат халда тинтиб чыкъды',
 'newuserlog-byemail' => 'пароль электрон почта бла джиберилгенди',
 
 # Feedback
 'feedback-subject' => 'Тема:',
 'feedback-message' => 'Билдириу:',
+'feedback-cancel' => 'Ызына алыу',
 'feedback-submit' => 'Оюмунгу джибер',
+'feedback-error2' => 'Халат. Тюзетиу ётмеди',
+'feedback-close' => 'Тындырылды',
 
 # API errors
 'api-error-badtoken' => 'Ич халат: терс токен.',
+'api-error-duplicate-popup-title' => ' {{PLURAL:$1|Файлны|Файлны}} дубликаты',
 'api-error-empty-file' => 'Сиз ийген файлны ичи бошду.',
 'api-error-emptypage' => 'Ичи бош болгъан джангы бетле къураргъа болмайды.',
 'api-error-file-too-large' => 'Сиз ийген файл асыры уллуду.',
 'api-error-filename-tooshort' => 'Файлны аты асыры къысхады.',
 'api-error-filetype-banned' => 'Быллай типли файлла джасакъланыбдыла.',
+'api-error-filetype-missing' => 'Файлны кенгериую джокъду.',
 'api-error-hookaborted' => 'Сиз теджеген тюрлендириуню кенгертиуню сюзюучю джасакълагъанды.',
 'api-error-illegal-filename' => 'Джарамагъан файл ат.',
 'api-error-invalid-file-key' => 'Ич халат: болджаллы асыраучу джерде файл  табылмады.',
 'api-error-mustbeposted' => 'Ич халат: соруу, HTTP POST инструкцияны излейди.',
+'api-error-ok-but-empty' => 'Ич халат: сервер джууаб бермейди.',
+'api-error-unclassified' => 'Белгили болмагъан халат чыкъды',
 'api-error-unknown-code' => 'Билинмеген халат: «$1».',
+'api-error-unknown-error' => 'Ич халат: файлны джюклерге излеген сагъатда не эсе да терс болду.',
 'api-error-unknown-warning' => 'Билинмеген билдириу: $1',
 'api-error-unknownerror' => 'Билинмеген халат: «$1».',
 'api-error-uploaddisabled' => 'Бу викиде файлла джюклеу амал джукъланыбды',
 'api-error-verification-error' => 'Бу заран джетген файл болургъа боллукъду неда терс кенгертиую болургъа боллукъду.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунд}}',
+'duration-minutes' => '$1 {{PLURAL:$1|минут}}',
+'duration-hours' => '$1 {{PLURAL:$1|сагъат}}',
+'duration-days' => '$1 {{PLURAL:$1|кюн}}',
+'duration-weeks' => '$1 {{PLURAL:$1|ыйыкъ}}',
+'duration-years' => '$1 {{PLURAL:$1|джыл}}',
+'duration-decades' => '$1 {{PLURAL:$1|декада}}',
+'duration-centuries' => '$1 {{PLURAL:$1|ёмюр}}',
+'duration-millennia' => '$1 {{PLURAL:$1|мингджыллыкъ}}',
+
 );
index abc6288..90dba2f 100644 (file)
@@ -107,7 +107,7 @@ $messages = array(
 'tog-previewonfirst' => 'Li cem guherandinê hertim yekemîn pêşdîtinê nîşan bide',
 'tog-nocache' => 'Vegirtina rûpelan bisekinîne',
 'tog-enotifwatchlistpages' => 'Heke rûpeleke ez dişopînim hate guhertin ji min re E-nameyekê bişîne',
-'tog-enotifusertalkpages' => 'Dema rûpela min a Guftûgoyê hate guhertin e-nameyekê ji min re bişîne',
+'tog-enotifusertalkpages' => 'Dema rûpela min a Gotûbêjê hate guhertin e-nameyekê ji min re bişîne',
 'tog-enotifminoredits' => 'Ji bo guhertinên biçûk jî E-nameyekê ji min re bişîne',
 'tog-enotifrevealaddr' => 'Navnîşana e-nameya min di agahdariyên e-nameyan de nîşan bide',
 'tog-shownumberswatching' => 'Nîşan bide, çiqas bikarhêner dişopînin',
@@ -212,7 +212,7 @@ $messages = array(
 'moredotdotdot' => 'Bêhtir...',
 'mypage' => 'Rûpela min',
 'mytalk' => 'Rûpela gotûbêja min',
-'anontalk' => 'Guftûgo ji bo vê IPê',
+'anontalk' => "Gotûbêj ji bo vê IP'ê",
 'navigation' => 'Navîgasyon',
 'and' => '&#32;û',
 
@@ -271,13 +271,13 @@ $messages = array(
 'unprotect' => 'Parastinê rake',
 'unprotectthispage' => 'Parastina vê rûpelê rake',
 'newpage' => 'Rûpela nû',
-'talkpage' => 'Vê rûpelê guftûgo bike',
+'talkpage' => 'Vê rûpelê gotûbêj bike',
 'talkpagelinktext' => 'Nîqaş',
 'specialpage' => 'Rûpela taybet',
 'personaltools' => 'Amûrên kesane',
 'postcomment' => 'Beşeke nû',
 'articlepage' => 'Li rûpela naverokê binêre',
-'talk' => 'Guftûgo',
+'talk' => 'Gotûbêj',
 'views' => 'Dîtin',
 'toolbox' => 'Qutiya amûran',
 'userpage' => 'Li rûpela vê/vî bikarhênerê/î binêre',
@@ -287,7 +287,7 @@ $messages = array(
 'templatepage' => 'Rûpela şablonê bibîne',
 'viewhelppage' => 'Rûpela alîkariyê bibîne',
 'categorypage' => 'Li rûpela kategoriyê binêre',
-'viewtalkpage' => 'Li guftûgoyê binêre',
+'viewtalkpage' => 'Li gotûbêjê binêre',
 'otherlanguages' => 'Zimanên din',
 'redirectedfrom' => '(ji $1 hate beralîkirin)',
 'redirectpagesub' => 'Rûpelê beralî bike',
@@ -624,7 +624,7 @@ Zanibe ku tu nikarî e-nameya bişînî heta tu di [[Special:Preferences|tercih
 'newarticletext' => "Ev rûpel hîn tune. Eger tu bixwazî vê rûpelê çêkî, dest bi nivîsandinê bike û piştre qeyd bike. '''Wêrek be''', biceribîne!<br />
 Ji bo alîkariyê binêre: [[{{MediaWiki:Helppage}}|Alîkarî]].<br />
 Heke tu bi şaşîtî hatî, bizîvire rûpela berê.",
-'anontalkpagetext' => "----''Ev rûpela guftûgo ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
+'anontalkpagetext' => "----''Ev rûpela gotûbêjê ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
 'noarticletext' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
 'noarticletext-nopermission' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].
 Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
@@ -686,7 +686,7 @@ Ew berê heye.',
 # "Undo" feature
 'undo-success' => 'Ev guherandina kane were şondakirin. Xêra xwe ferqê piştî tomarkirinê bibîne û seke, ku tu ew versîyona dixwazê û tomarbike. Eger te şaşbûnekî kir, xêra xwe derkeve.',
 'undo-failure' => 'Ev guherandina nikane were şondakirin ji ber ku guherandinên piştî wê.',
-'undo-summary' => 'Guhertoya $1 ya [[Special:Contributions/$2|$2]] ([[User talk:$2|guftûgo]]) şûnde kir',
+'undo-summary' => 'Guhertoya $1 ya [[Special:Contributions/$2|$2]] ([[User talk:$2|gotûbêj]]) şûnde kir',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Hesab nikarîbû were çêkirin',
@@ -984,7 +984,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'action-read' => 'Vê rûpelê bixwîne',
 'action-edit' => 'vê rûpelê biguherîne',
 'action-createpage' => 'rûpelan çêke',
-'action-createtalk' => 'rûpelên guftûgoyan çêke',
+'action-createtalk' => 'rûpelên gotûbêjan çêke',
 'action-createaccount' => "vê account'ê bikarhênerê çêke",
 'action-minoredit' => 'vê weke guhertineke biçûk nîşan bide',
 'action-move' => 'vê rûpelê bigerîne',
@@ -1362,7 +1362,7 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'watchnologintext' => 'Ji bo xeyrandinê lîsteya te ya şopandinê tu gireke xwe [[Special:UserLogin|qedy kiribe]].',
 'addwatch' => 'Tevlî lîsteya şopandinê bike',
 'addedwatchtext' => "Rûpela \"<nowiki>\$1</nowiki>\" çû ser [[Special:Watchlist|lîsteya te ya şopandinê]].
-Li dahatû de her guhartoyek li wê rûpelê û rûpela guftûgo ya wê were kirin li vir dêt nîşan dan,
+Li dahatû de her guhartoyek li wê rûpelê û rûpela gotûbêjê wê were kirin li vir dêt nîşan dan,
 
 Li rûpela [[Special:RecentChanges|Guherandinên dawî]] jî ji bo hasan dîtina wê, ew rûpel bi '''Nivîsa estûr''' dê nîşan dayîn.
 
@@ -1376,7 +1376,7 @@ Li rûpela [[Special:RecentChanges|Guherandinên dawî]] jî ji bo hasan dîtina
 'unwatchthispage' => 'Êdî neşopîne',
 'notanarticle' => 'Ne gotar e',
 'watchnochange' => 'Ne rûpelek, yê tu dişopînê, hate xeyrandin di vê wextê da, yê tu dixazê bibînê.',
-'watchlist-details' => '* {{PLURAL:$1|Rûpelek tê|$1 rûpel tên}} şopandin, rûpelên guftûgoyê netên jimartin.',
+'watchlist-details' => '* {{PLURAL:$1|Rûpelek tê|$1 rûpel tên}} şopandin, rûpelên gotûbêjê nayên jimartin.',
 'wlheader-enotif' => '* Agahdariya E-nameyê pêk tê.',
 'wlheader-showupdated' => "* Ew rûpel yê hatin xeyrandin jilkî te li wan sekir di '''nivîsa estûr''' tên pêşandin.",
 'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
@@ -1452,9 +1452,9 @@ Naverroka berî betalkirinê ev bû:'$1'",
 'rollbacklink' => 'bizivirîne pêş',
 'cantrollback' => "Guharto naye vegerandin; bikarhêrê dawî, '''tenya''' nivîskarê wê rûpelê ye.",
 'alreadyrolled' => 'Guherandina dawiya [[$1]]
-bi [[User:$2|$2]] ([[User talk:$2|guftûgo]]) venizivre; keseke din wê rûpelê zivrandiye an guherandiye.
+bi [[User:$2|$2]] ([[User talk:$2|gotûbêj]]) venizivre; keseke din wê rûpelê zivrandiye an guherandiye.
 
-Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
+Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|gotûbêj]]).',
 'editcomment' => "Kurtenivîsê guherandinê ev bû: \"''\$1''\".",
 'revertpage' => 'Guherandina $2 hat betal kirin, vegerand guhartoya dawî ya $1',
 'rollback-success' => 'Guherandina $1 şondakir; dîsa guharte verzyona $2.',
@@ -1602,7 +1602,7 @@ Sedemekê binivîse!',
 'ipbotheroption' => 'yên din',
 'ipbotherreason' => 'Sedemekî din',
 'ipbhidename' => 'Navê bikarhêner / adresê IP ji "pirtûkê" astengkirinê, lîsteya astengkirinên nuh û lîsteya bikarhêneran veşêre',
-'ipbwatchuser' => 'Rûpelên bikarhêner û guftûgoyê bişopîne',
+'ipbwatchuser' => 'Rûpelên bikarhêner û gotûbêjê bişopîne',
 'ipb-confirm' => 'Astengkirinê piştrast bike',
 'badipaddress' => 'Bikarhêner bi vî navî tune',
 'blockipsuccesssub' => 'Astengkirin serkeftî bû',
@@ -1636,7 +1636,7 @@ Sedemekê binivîse!',
 'noautoblockblock' => 'astengkirina otomatîk hatîye temirandin',
 'createaccountblock' => 'çêkirina hesaban hate qedexekirin',
 'emailblock' => 'E-Mail hate girtin',
-'blocklist-nousertalk' => 'nikarê rûpela gûftugoya xwe biguherînê',
+'blocklist-nousertalk' => 'nikare rûpela gotûbêja xwe biguherîne',
 'ipblocklist-empty' => 'Lîsteya astengkirinê vala ye.',
 'ipblocklist-no-results' => "Ew IP'ya ya bikarhênera nehatîye astengkirin.",
 'blocklink' => 'asteng bike',
@@ -1653,7 +1653,7 @@ Sedemekê binivîse!',
 'block-log-flags-nocreate' => 'çêkirina hesaban hate qedexekirin',
 'block-log-flags-noautoblock' => 'astengkirina otomatik tune',
 'block-log-flags-noemail' => 'Şandina e-nameyan hatîye qedexekirin',
-'block-log-flags-nousertalk' => 'nikare guftûgoyê xwe biguherîne',
+'block-log-flags-nousertalk' => 'nikare gotûbêja xwe biguherîne',
 'block-log-flags-hiddenname' => 'navê bikarhêneriyê yê veşartî',
 'ipb_expiry_invalid' => 'Dem ne serrast e.',
 'ipb_already_blocked' => '"$1" berê hatîye astengkirin',
@@ -1702,7 +1702,7 @@ da bikarî navê wê rûpelê biguherînî.',
 'articleexists' => 'Rûpela bi vî navî heye, an navê ku te hilbijart derbas nabe. Navekî din hilbijêre.',
 'cantmove-titleprotected' => 'Tu nikanê vê rûpelê bervê vê cihê bigerînê ji ber ku sernava nuh tê parastin ji bo çêkirinê',
 'movedto' => 'bû',
-'movetalk' => "Rûpela '''guftûgo''' ya wê jî bigerîne, eger gengaz be.",
+'movetalk' => "Rûpela '''gotûbêj'''a wê jî bigerîne, eger gengaz be.",
 'movepage-page-exists' => 'Rûpela $1 berê heye û ew nikane otomatîk were jêbirin.',
 'movepage-page-moved' => 'Rûpela $1 çû cihê $2.',
 'movepage-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
@@ -1759,12 +1759,12 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Rûpela min',
 'tooltip-pt-anonuserpage' => 'The user page for the ip you',
-'tooltip-pt-mytalk' => 'Rûpela guftûgo ya min',
+'tooltip-pt-mytalk' => 'Rûpela min a gotûbêjê',
 'tooltip-pt-preferences' => 'Tercîhên min',
 'tooltip-pt-watchlist' => 'The list of pages you',
 'tooltip-pt-mycontris' => 'Lîsteya beşdariyên min',
 'tooltip-pt-logout' => 'Derkeve (Log out)',
-'tooltip-ca-talk' => 'Guftûgo li ser rûpela naverokê',
+'tooltip-ca-talk' => 'Gotûbêj li ser rûpela naverokê',
 'tooltip-ca-edit' => 'Vê rûpelê biguherîne! Berê qeydkirinê bişkoka "Pêşdîtin',
 'tooltip-ca-addsection' => 'Beşekê zêde bike.',
 'tooltip-ca-viewsource' => 'Ev rûpela tê parastin. Tu dikarê bes li çavkanîyê sekê.',
@@ -2025,7 +2025,7 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
 'lag-warn-high' => 'Ji bo westinê sistêmê ew xeyrandin, yê piştî $1 sanîyan hatine çêkirin netên wêşendan.',
 
 # Watchlist editor
-'watchlistedit-numitems' => 'Di lîsteya te ya şopandinê de {{PLURAL:$1|gotarek heye.|$1 gotar hene.}} (ji xeynî rûpela guftûgoyan).',
+'watchlistedit-numitems' => 'Di lîsteya te ya şopandinê de {{PLURAL:$1|gotarek heye.|$1 gotar hene.}} (ji xeynî rûpela gotûbêjan).',
 'watchlistedit-noitems' => 'Di lîsteya te ya şopandinê  de gotar tune ne.',
 'watchlistedit-normal-title' => 'Lîsteya xwe ya şopandinê biguherîne',
 'watchlistedit-normal-legend' => 'Gotaran ji lîsteya min ya şopandinê rake',
index f920971..6469ad8 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author AidaBishkek
  * @author Aidabishkek
+ * @author Muratjumashev
  * @author Ztimur
  */
 
index 0383065..0624ce1 100644 (file)
@@ -1384,6 +1384,7 @@ Adspectum graciliorem potes facere modum indicum, nomen usoris (cave litteras ma
 'allpagesprefix' => 'Monstrare paginas quibus est praeverbium:',
 'allpagesbadtitle' => 'Nomen paginae datum fuit invalidum aut praverbium interlinguale vel interviciale habuit. Fortasse insunt una aut plus litterarum quae in titulis non possunt inscribier.',
 'allpages-bad-ns' => 'Non est spatium nominale "$1" apud {{grammar:accusative|{{SITENAME}}}}.',
+'allpages-hide-redirects' => 'Celare redirectiones',
 
 # Special:Categories
 'categories' => 'Categoriae',
index 6b53e45..566cf78 100644 (file)
@@ -834,7 +834,8 @@ Denkt drun datt eegen .css an .js Säiten e kleng geschriwwenen Titel benotzen,
 'updated' => '(Geännert)',
 'note' => "'''Notiz:'''",
 'previewnote' => "'''Denkt drun datt dëst nëmmen eng net gespäichert Versioun ass.'''
-Är Ännerunge sinn nach net gespäichert! [[#editform|→ Virufuere mam Änneren]]",
+Är Ännerunge sinn nach net gespäichert!",
+'continue-editing' => 'Weider änneren',
 'previewconflict' => 'Dir gesitt an dem ieweschten Textfeld wéi den Text ausgesi wäert, wann Dir späichert.',
 'session_fail_preview' => "'''Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.
 Versicht et w.e.g. nach eng Kéier.
@@ -1064,7 +1065,7 @@ Kuckt w.e.g. an de Logbicher no.",
 # Suppression log
 'suppressionlog' => 'Lëscht vun de verstoppten a geläschte Säiten',
 'suppressionlogtext' => 'Ënnendrënner ass eng Lëscht vun de geläschte Säiten a Spären a vun den Administrateuren verstopptem Inhalt.
-Kuckt [[Special:BlockList|Lëscht vun de gespaarten IPen]] fir déi aktuell Spären.',
+Kuckt [[Special:BlockList|Lëscht vun Späre]] fir déi aktuell Spären.',
 
 # History merging
 'mergehistory' => 'Historiquë fusionéieren',
@@ -1651,6 +1652,7 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
 'backend-fail-closetemp' => 'Den temporäre Fichier konnt net zougemaach ginn.',
 'backend-fail-read' => 'De Fichier $1 konnt net geliest ginn.',
 'backend-fail-create' => 'De Fichier $1 konnt net ugeluecht ginn.',
+'backend-fail-maxsize' => 'De Fichier $1 konnt net generéiert gi well e méi grouss ass wéi {{PLURAL:$2|ee Byte|$2 Byten}}.',
 'backend-fail-readonly' => 'De Späicher-Backend "$1" kann elo nëmme geliest ginn (read-only). De Grond deen ugi gouf war: "$2"',
 
 # Lock manager
@@ -1766,6 +1768,10 @@ Eng [[Special:WhatLinksHere/$2|komplett Lëscht]] ass disponibel.',
 Kuckt w.e.g. d'[$2 Säit mat der Beschreiwung vum Fichier] fir méi Informatiounen.",
 'sharedupload-desc-here' => "Dëse Fichier ass vu(n) $1 an däerf vun anere Projete benotzt ginn.
 D'Beschreiwung op senger [$2 Beschreiwungssäit] steet hei ënnendrënner.",
+'sharedupload-desc-edit' => 'Dëse Fichier ass vu(n) $1 a ka vun anere Projete benotzt ginn.
+Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
+'sharedupload-desc-create' => 'Dëse Fichier ass vu(n) $1 a ka vun anere Projete benotzt ginn.
+Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
 'filepage-nofile' => 'Et gëtt kee Fichier mat deem Numm.',
 'filepage-nofile-link' => 'Et gëtt kee Fichier mat deem Numm, awer Dir kënnt [$1 en eroplueden].',
 'uploadnewversion-linktext' => 'Eng nei Versioun vun dësem Fichier eroplueden',
@@ -1899,6 +1905,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'wantedpages' => 'Gewënschte Säiten',
 'wantedpages-badtitle' => 'Net valabelen Titel am Resultat: $1',
 'wantedfiles' => 'Gewënschte Fichieren',
+'wantedfiletext-cat' => 'Dës Fichiere gi benotzt awer et gëtt se net. Fichiere aus frieme Repositorie kënnen hei gewise ginn och wann et se gëtt. All esou falsch Positiver ginn <del>duerchgestrach</del>. Zousätzlech gi Säiten an deene Fichieren dra sinn déi et net gëtt op [[:$1]] gewisen.',
 'wantedtemplates' => 'Gewënschte Schablounen',
 'mostlinked' => 'Dacks verlinkte Säiten',
 'mostlinkedcategories' => 'Dacks benotzte Kategorien',
@@ -1977,6 +1984,9 @@ Dir kënnt d'Siche limitéieren wann Dir e Log-Typ, e Benotzernumm (case-senisit
 'allpages-bad-ns' => 'Den Nummraum „$1“ gëtt et net op {{SITENAME}}.',
 'allpages-hide-redirects' => 'Viruleedunge verstoppen',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Déi rezentst weisen.',
+
 # Special:Categories
 'categories' => 'Kategorien',
 'categoriespagetext' => 'Dës {{PLURAL:$1|Kategorie huet|Kategorien hu}} Säiten oder Medien.
@@ -2354,7 +2364,7 @@ $1',
 'sp-contributions-userrights' => 'Verwaltung vun de Benotzerrechter',
 'sp-contributions-blocked-notice' => 'Dëse Benotzer ass elo gespaart. Déi lescht Entrée am Läsch-Logbuch steet als Referenz hei ënnendrënner:',
 'sp-contributions-blocked-notice-anon' => "Dës IP-Adress ass elo gespaart.
-Ënnendrënner steet déi lescht Androung an d'Spärlëscht:",
+Ënnendrënner steet déi lescht Aschreiwung an d'Spärlëscht:",
 'sp-contributions-search' => 'No Kontributioune sichen',
 'sp-contributions-username' => 'IP-Adress oder Benotzernumm:',
 'sp-contributions-toponly' => 'Nëmmen Ännerunge weisen déi déi lescht Versioun sinn',
@@ -2417,7 +2427,7 @@ $1',
 'blockipsuccesssub' => 'Gouf gespaart',
 'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] gouf gespaart. <br />
 
-Kuckt d'[[Special:BlockList|IP Spär-Lëscht]] fir all Spären ze gesin.",
+Kuckt d'[[Special:BlockList|Spär-Lëscht]] fir all Spären nozekucken.",
 'ipb-blockingself' => 'Dir sidd am gaang Iech selwer ze spären! Sidd Dir sécher datt Dir dat maache wëllt?',
 'ipb-confirmhideuser' => 'Dir sidd am gaang e Benotzer ze späre mat der Fonctioun "Benotzer verstoppen" ageschalt. Dëst hëlt den Numm vum Benotzer aus alle Lëschten a Logbicher eraus. Sidd Dir sécher datt Dir dat maache wëllt?',
 'ipb-edit-dropdown' => 'Spärgrënn änneren',
@@ -2470,7 +2480,7 @@ De Grond dee fir d\'Spär vum $1 ugi gouf ass: "$2".',
 'reblock-logentry' => "huet d'Spär vum [[$1]] bis den $2 $3 geännert",
 'blocklogtext' => "Dëst ass eng Lëscht vu Spären a vu Spären déi opgehuewe goufen.
 Automatesch gespaarten IP-Adresse sinn hei net opgelëscht.
-Kuckt d'[[Special:BlockList|IP Spärlëscht]] fir déi aktuell Spären.",
+Kuckt d'[[Special:BlockList|Spärlëscht]] fir déi aktuell Spären.",
 'unblocklogentry' => "huet d'Spär vum $1 opgehuewen",
 'block-log-flags-anononly' => 'Nëmmen anonym Benotzer',
 'block-log-flags-nocreate' => 'Schafe vu Benotzerkonte gespaart',
@@ -3523,6 +3533,9 @@ Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public
 'version-software' => 'Installéiert Software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Versioun',
+'version-entrypoints' => 'URLe vun Agangspunkten',
+'version-entrypoints-header-entrypoint' => 'Agangspunkt',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Pad bei de Fichier',
@@ -3707,4 +3720,15 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
 'api-error-uploaddisabled' => "D'Eroplueden ass op dëser Wiki ausgeschalt.",
 'api-error-verification-error' => 'Dëse Fichier kéint korrupt sinn, oder en huet eng falsch Erweiderung.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Sekonn|Sekonnen}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Minutt|Minutten}}',
+'duration-hours' => '$1 {{PLURAL:$1|Stonn|Stonnen}}',
+'duration-days' => '$1 {{PLURAL:$1|Dag|Deeg}}',
+'duration-weeks' => '$1 {{PLURAL: $1|Woch|Wochen}}',
+'duration-years' => '$1 {{PLURAL:$1|Joer|Joer}}',
+'duration-decades' => '$1 {{PLURAL:$1|Joerzéngt|Joerzéngten}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Joerhonnert|Joerhonnerten}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Millenaire|Millenairen}}',
+
 );
index dfe840f..d5b59e3 100644 (file)
@@ -27,6 +27,7 @@ $messages = array(
 'tog-hideminor' => 'Мукьвара хьайи дегишвилера авай гъвечIи дуьзар хъувунар чуьнуьхун',
 'tog-hidepatrolled' => 'Мукьвара хьайи дегишвилера авай къаравулвал авунвай дуьзар хъувунар чуьнуьхун',
 'tog-newpageshidepatrolled' => 'ЦIийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
+'tog-extendwatchlist' => 'Чlехи сиягь килигунин, кутазвай вири дегишунар, амма са эхирбур туш',
 'tog-usenewrc' => 'ЦIийи дегишвилерин сиягь кардик кутун (JavaScript герекзава)',
 'tog-numberheadings' => 'КЬилин цIарариз автоматдаказ номерар эцигун',
 'tog-showtoolbar' => 'Дуьзар хъувунин алатрин кьвати къалура (JavaScript)',
@@ -415,7 +416,7 @@ $messages = array(
 Квевай [[Special:Search/{{PAGENAME}}| и тlвар алай ччин]] муькуь ччинра жугъуриз ва я
 <span class="plainlinks"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затIар жугъуриз] жеда.',
 'previewnote' => "'''Рикlел хуьх хьи, им анжах сифтедин килигун я.'''  
-Куь масакIавилер гьеле хвенвач! [[#editform|→ дуьзар хъувун давамрун]]",
+Куь масакIавилер гьеле хвенвач!",
 'editing' => '$1 Дуьзар хъувун',
 'editingsection' => 'Дуьзар хъувун $1  (пай)',
 'editconflict' => 'Дуьзар хъувунрин акьунар: $1',
index d86e3d1..17d2c77 100644 (file)
@@ -542,7 +542,7 @@ $2",
 De gegaeve ree is ''$2''.",
 'filereadonlyerror' => '\'t Waar neet meugelik óm \'t bestandj "$1" aan te passe went de bestandjsrepositoir "$2" steit noe op allein-laeze.
 
-d\'n Opgegaeve raej waar "\'\'$3\'\'".',
+d\'n Opgegaeve raej vanne sloetendje admin waar "\'\'$3\'\'".',
 
 # Virus scanner
 'virus-badscanner' => "Slechte configuratie: onbekenge virusscanner: ''$1''",
@@ -628,6 +628,7 @@ e-mail óntvange veur alle volgende toepassinge.',
 'emailconfirmlink' => 'Bevèstig dien e-mailadres',
 'invalidemailaddress' => "'t E-mailadres is neet geaccepteerd omdet 't 'n ongeldige opmaak haet. Gaef a.u.b. 'n geldig e-mailadres op of laot 't veld laeg.",
 'cannotchangeemail' => 'E-mailadresse kinne neet waere verangerdj óp deze wiki.',
+'emaildisabled' => 'Dees site kin gein mails versjikke.',
 'accountcreated' => 'Gebroeker aangemaak',
 'accountcreatedtext' => 'De gebroeker $1 is aangemaak.',
 'createaccount-title' => 'Gebroekers aanmake veur {{SITENAME}}',
@@ -829,6 +830,7 @@ Probeer 't opnieuw. Als 't dan nog neet lukt, meldt dich dan aaf en weer aan.'''
 'token_suffix_mismatch' => "'''Dien bewerking is geweigerd omdat dien client de laesteikes in 't bewerkingstoken onjuist haet behandeld. De bewerking is geweigerd om verminking van de paginateks te veurkomme. Dit gebeurt soms es d'r een webgebaseerde proxydienst wurt gebroek die foute bevat.'''",
 'edit_form_incomplete' => "'''Sommige ongerdeile van 't bewerkingsformuleer höbbe de server neet bereik. Controleer of dien bewerkinge intak zien en perbeer 't obbenuits.'''",
 'editing' => 'Bewirkingspagina: $1',
+'creating' => '$1 aanmakendj',
 'editingsection' => 'Bewirke van sectie van $1',
 'editingcomment' => 'Bewirke $1 (commentair)',
 'editconflict' => 'Bewirkingsconflik: $1',
@@ -887,6 +889,7 @@ Ze lik eweggesjaf te zien.',
 'edit-no-change' => "Dien bewirking is genegeerd, ómdet d'r gein verangering in de teks is gemaak.",
 'edit-already-exists' => 'De pagina is neet aangemaak.
 Zie besjteit al.',
+'defaultmessagetext' => 'Obligaten teks',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Waarschuwing:''' dees pagina gebroek te väöl kosbare parserfuncties.
@@ -1047,7 +1050,7 @@ Controleer de logbeuk.",
 # Suppression log
 'suppressionlog' => 'Verbergingslogbook',
 'suppressionlogtext' => 'De ongerstaonde lies bevat de verwiederinge en blokkades die veur beheerders verborge zeen.
-In de [[Special:BlockList|IP-blokkeerlies]] zeen de hudige blokkades te bekieke.',
+In de [[Special:BlockList|blokkeerlies]] zeen de hudige blokkades te bekieke.',
 
 # History merging
 'mergehistory' => "Gesjiedenis van pagina's samevoege",
@@ -1761,6 +1764,8 @@ d'r Is ouch ne [[Special:WhatLinksHere/$2|volledige lies]].",
 Bekiek de [$2 pagina mit de besjtandjsbesjrieving] veur mie infermasie.',
 'sharedupload-desc-here' => 'Dit besjtandj kump van $1 en kin ouch in anger projekte gebroek waere.
 De [$2 pagina mit de besjtandjsbesjrieving] wurt hiejónger weergegaeve.',
+'sharedupload-desc-edit' => 'Dit bestandj kump van $1 en kin ouch in anger projekte gebroek waere. De kins de [$2 pagina mit bestandjsbesjrieving] dao bewirke.',
+'sharedupload-desc-create' => 'Dit bestandj kump van $1 en kin ouch in anger projekte gebroek waere. De kins de [$2 pagina mit bestandjsbesjrieving] dao bewirke.',
 'filepage-nofile' => 'dr Besteit gei bestandj mit deze naam.',
 'filepage-nofile-link' => 'dr Besteit gei bestandj mit deze naam, mer doe kins t [$1 uploade].',
 'uploadnewversion-linktext' => "Upload 'n nuuj versie van dit besjtand",
@@ -1972,6 +1977,12 @@ Controleer of se wellich n fout höbs gemaak bie de inveur.',
 'allpagesprefix' => "Betrach pazjena's mit 't veurvoogsel:",
 'allpagesbadtitle' => "De opgegaeve paginanaam is ongeldig of haj 'n intertaal of interwiki veurvoegsel. Meugelik bevatte de naam karakters die neet gebroek moge waere in paginanäöm.",
 'allpages-bad-ns' => '{{SITENAME}} haet gein naamruumde mit de naam "$1".',
+'allpages-hide-redirects' => 'Verbèrg redireks',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "De bekieks 'ne paginacache dae maximaal $1 aad is.",
+'cachedspecial-viewing-cached-ts' => "De bekieks 'ne paginacache dae muuegelik neet gans biegewirk is.",
+'cachedspecial-refresh-now' => 'Tuin lèste.',
 
 # Special:Categories
 'categories' => 'Categorieë',
@@ -2450,7 +2461,7 @@ Zuug de [[Special:BlockList|lies van geblokkeerde IP-adresse]].',
 'blocklog-showsuppresslog' => "Deze gebroeker is al geblok gewaes en d'r zeen (deil van) bewerkinge van deze gebroeker verbórge. 't Verbèrgingslogbook steit hieónger:",
 'blocklogentry' => '"[[$1]]" is geblokkeerd veur d\'n tied van $2 $3',
 'reblock-logentry' => 'haet de instellinge veur de blokkaasj veur [[$1]] gewiezig. Deze verlöp noe op $2 om $3',
-'blocklogtext' => "Dit is 'n log van blokkades van gebroekers. Automatisch geblokkeerde IP-adresse sjtoon hie neet bie. Zuug de [[Special:BlockList|Lies van geblokkeerde IP-adresse]] veur de lies van op dit mement wèrkende blokkades.",
+'blocklogtext' => "Dit is 'n log van blokkades van gebroekers. Automatisch geblokkeerde IP-adresse sjtoon hie neet bie. Zuug de [[Special:BlockList|Lies van geblokkeerde adresse]] veur de lies van op dit mement wèrkende blokkades.",
 'unblocklogentry' => 'blokkade van $1 opgeheve',
 'block-log-flags-anononly' => 'allein anoniem',
 'block-log-flags-nocreate' => 'aanmake gebroekers geblokkeerd',
@@ -3499,6 +3510,9 @@ Same mit dit programma heurs se 'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van d
 'version-software' => 'Geïnstallieërde sofwaer',
 'version-software-product' => 'Perduk',
 'version-software-version' => 'Versie',
+'version-entrypoints' => 'Ingang-URLs',
+'version-entrypoints-header-entrypoint' => 'Ingank',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Bestandjspaad',
@@ -3687,4 +3701,15 @@ Anges kin se-n ouch \'t einvawdig formeleer hieónger gebroeke. Dien commentaar
 'api-error-uploaddisabled' => 'Upload steit oet óp deze wiki.',
 'api-error-verification-error' => "Dit bestandj is meugelik besjadig of haet 'n ónjuuste extensie.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekond|sekond}}',
+'duration-minutes' => '$1 {{PLURAL:$1|menuut|menuut}}',
+'duration-hours' => '$1 {{PLURAL:$1|oer|oer}}',
+'duration-days' => '$1 {{PLURAL:$1|daag|daag}}',
+'duration-weeks' => '$1 {{PLURAL:$1|waek|waek}}',
+'duration-years' => '$1 {{PLURAL:$1|jaor|jaor}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennium|decennia}}',
+'duration-centuries' => '$1 {{PLURAL:$1|ieëf|ieëf}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
 );
index 91aac02..6fc01f0 100644 (file)
@@ -12,6 +12,7 @@
  * @author Dakrismeno
  * @author DracoRoboter
  * @author Flavio05
+ * @author GatoSelvadego
  * @author Insübrich
  * @author Kemmótar
  * @author Malafaya
@@ -1364,6 +1365,9 @@ Te riçevaree un mesacc cun deent un ligamm specjal; ti duvaree clicaa sül liga
 'watchlisttools-edit' => 'Varda e mudifega la lista di paginn che te tegnet sut ögg',
 'watchlisttools-raw' => 'Mudifega la lista in furmaa test',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciciaràde]])',
+
 # Special:Version
 'version' => 'Versiun',
 
index 46fb3ca..a9f58fb 100644 (file)
@@ -18,6 +18,7 @@
  * @author Kaganer
  * @author Matasg
  * @author Meno25
+ * @author Ola
  * @author Pdxx
  * @author Perkunas
  * @author Pėstininkas
@@ -835,7 +836,7 @@ Jūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] ki
 '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' => "''Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!'''",
 '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.
 Prašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijungti atgal.'''",
@@ -847,6 +848,7 @@ Prašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijung
 'token_suffix_mismatch' => "'''Jūsų pakeitimas buvo atmestas, nes jūsų naršyklė iškraipė skyrybos ženklus keitimo žymėje. Keitimas buvo atmestas norint apsaugoti puslapio tekstą nuo sugadinimo. Taip kartais būna, kai jūs naudojate anoniminį tarpinio serverio paslaugą.'''",
 'edit_form_incomplete' => "'''Kai redaguoti formos dalys nepasiekė serverio; du kartus patikrinti, kad jūsų pakeitimai yra nesugadintos ir bandykite dar kartą.'''",
 'editing' => 'Taisomas $1',
+'creating' => 'Kuriama $1',
 'editingsection' => 'Taisomas $1 (skyrelis)',
 'editingcomment' => 'Taisomas $1 (komentaras)',
 'editconflict' => 'Išpręskite konfliktą: $1',
@@ -1070,7 +1072,7 @@ Prašome patikrinti sąrašus.',
 # Suppression log
 'suppressionlog' => 'Trynimo istorija',
 'suppressionlogtext' => 'Žemiau yra trynimų ir blokavimų sąrašas, įtraukiant turinį, paslėptą nuo administratorių.
-Žiūrėkite [[Special:BlockList|IP blokavimų sąrašą]], kad rastumėte dabar veikiančius draudimus ir blokavimus.',
+Žiūrėkite [[Special:BlockList|blokavimų sąrašą]], kad rastumėte dabar veikiančius draudimus ir blokavimus.',
 
 # History merging
 'mergehistory' => 'Sujungti puslapių istorijas',
@@ -2470,7 +2472,7 @@ Pateikiamas paskutinis blokavimo istorijos įrašas.',
 'reblock-logentry' => 'pakeisti [[$1]] blokavimo nustatymai, naujas blokavimo laikas – $2 $3',
 'blocklogtext' => 'Čia yra naudotojų blokavimo ir atblokavimo sąrašas.
 Automatiškai blokuoti IP adresai neišvardinti.
-Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|IP blokavimų sąrašą]].',
+Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|blokavimų sąrašą]].',
 'unblocklogentry' => 'atblokavo $1',
 'block-log-flags-anononly' => 'tik anoniminiai naudotojai',
 'block-log-flags-nocreate' => 'paskyrų kūrimas išjungtas',
index 25fb555..b0fb6c8 100644 (file)
@@ -129,12 +129,12 @@ $messages = array(
 'category-empty' => '"He pawl hian phêk leh media pakhat mah a nei hrih lo."',
 'hidden-categories' => 'Pawl thuhrûk {{PLURAL:$1||-te}}',
 'hidden-category-category' => 'Pawl thuhrûkte',
-'category-subcat-count' => '{{PLURAL:$2|He pawl hian he pawlpeng chauh hi a nei. |He pawl hian heng: {{PLURAL:$1|pawlpeng|pawlpeng $1-te}} hi a nei, a vaia $2 zingah.}}',
-'category-subcat-count-limited' => 'He pawl hian hengte hi a ni: {{PLURAL:$1|pawlpeng|$1 pawlpengte}}',
-'category-article-count' => '{{PLURAL:$2|He pawl hian hë phêk chauh hi a nei. | Heng phek{{PLURAL:$1||$1-te}} hi he pawlah hian a awm, a vaia $2 zingah.}}',
+'category-subcat-count' => '{{PLURAL:$2|He pawl hian he pawlpeng chauh hi a nei. |He pawl hian heng  {{PLURAL:$1|pawlpéng|pawlpéng $1-te}} hi a nei, avaia  $2  zingah.}}',
+'category-subcat-count-limited' => "He pawl hian  {{PLURAL:$1|hë pawlpéng chauh|$1 hê'ng pawlpéngte}} hi a nei.",
+'category-article-count' => "{{PLURAL:$2|He pawl hian hemi phêk chauh hi a nei. | Hê'ng phek {{PLURAL:$1||$1-te}} hi he pawlah hian a awm, avaia $2 zingah.}}",
 'category-article-count-limited' => '{{PLURAL: $1 |$1He|$1 Heng}} phekte hi hë pawl, i en mékah hian a awm.',
-'category-file-count' => '{{PLURAL:$2|He pawl hian hë taksa (file) chauh hi a kengtel.|{{PLURAL:$1|He taksa $1 |Heng taksa $1-te}} hi he pawlah hian a awm, a vaia $2 zingah}}',
-'category-file-count-limited' => '{{PLURAL:$1|He taksa (file)|$1Heng taksate}} hi hemi pawl, i en mékah hian a awm.',
+'category-file-count' => '{{PLURAL:$2|He pawl hian hë taksa chauh hi a kengtel.|{{PLURAL:$1|He taksa $1 |Heng taksa $1-te}} hi he pawlah hian a awm, a vaia $2 zingah}}',
+'category-file-count-limited' => '{{PLURAL:$1|He taksa|$1Heng taksate}} hi hemi pawl, i en mékah hian a awm.',
 'listingcontinuesabbrev' => 'chhunz.',
 'index-category' => 'Phêk tarlante',
 'noindex-category' => 'Phêk tarlan lohte',
@@ -247,7 +247,7 @@ $1',
 'aboutsite' => '{{SITENAME}}  chungchang',
 'aboutpage' => 'Project:Chungchang',
 'copyright' => 'A chhung thute hi $1 hmanga lakchhawn phal a ni.',
-'copyrightpage' => '{{ns:project}}:Lakchhawn phalna',
+'copyrightpage' => '{{ns:project}}:Lakchhawn phalphung',
 'currentevents' => 'Chanchin thar',
 'currentevents-url' => 'Project: Chanchin thar',
 'disclaimers' => 'Intlawhkhalhna',
@@ -318,7 +318,7 @@ $1',
 'nosuchaction' => 'Hetiang hi a tih theih loh',
 'nosuchactiontext' => 'URL-a tihtur lang hi a tihtheih loh.
 URL i chhu dik lo a ni mai thei, emaw zawm dik loah i kal a niang.
-{{SITENAME}} software hmanah hian dik tawk lo lai a awm a ni thei bawk.',
+{{SITENAME}} khawlthlûak hmanah hian dik tawk lo lai a awm a ni thei bawk.',
 'nosuchspecialpage' => 'Hetiang vohbik phek hi a awm lo',
 'nospecialpagetext' => '<strong>Vohbik phek awm lo en i tum.</strong>
 
@@ -483,6 +483,7 @@ I thurûk i thlâk hlawhtling tawh a nih loh pawhin thurûk lailâwk i dil a ni
 'passwordreset' => 'Thurûk ziakţha rawh',
 'passwordreset-legend' => 'Thurûk ziakţha rawh',
 'passwordreset-username' => 'Hmangtu hming:',
+'passwordreset-domain' => 'Huamchin:',
 'passwordreset-email' => 'E-chenhmun:',
 'passwordreset-emailtitle' => '{{SITENAME}}-a siangchan chanchin kim',
 'passwordreset-emailelement' => 'Hmangtuhming: $1
@@ -560,7 +561,7 @@ Tihsual palh thilthua heta lo lût i nih chuan i rangpuifanna-a '''letna''' fei
 Phêk dangah [[Special:Search/{{PAGENAME}}| he phêk hming hi i zawng]] thei ang, a nih loh pawhin a laichin 
 <span class="plainlinks">[{{fullurl:{{#Special:Log}} | page={{FULLPAGENAMEE}}}} log dang i zawng thei ang]; a nih loh chuan [{{fullurl:{{FULLPAGENAME}}|action=edit}} he phêk hi i siamţha thei ang] </span>.',
 'noarticletext-nopermission' => 'He phêkah hian thu a la awm hrih lo.
-He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{GULLPAGENAMEE}}}} a laichin chanchin dang] i zawng thei bawk ang. </span>',
+He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}-a a laichin chanchin dang] i zawng thei bawk ang. </span>',
 'userpage-userdoesnotexist' => 'Hmangtu siangchan "$1" hi hriat a ni lo.
 He phêk hi siam/siamţhat emaw i duh chuan enfiah rawh.',
 'userpage-userdoesnotexist-view' => 'Hmangtu siangchan "$1" hi hriat a ni lo.',
@@ -570,7 +571,13 @@ I rawn atan a danbeh chhinchhiahna kan han tarlang a ni e:',
 'userjsyoucanpreview' => "'''Rawlrûk:''' I JavaScript thar fiah tùrin i dahţhat hmain \"{{int:showpreview}}\" hmehkhep hi hmang rawh.",
 'note' => "'''Hriat tùr:'''",
 'previewnote' => "'''Heihi endikna chauh a ni tih hrereng ang che.'''
-I tihdanglamna dahţhat a la ni lo!  [[#editform|→ Ziah chhunzawmna]]",
+I tihdanglamna dahţhat a la ni lo!",
+'session_fail_preview_html' => "'''A pawi hlë mai! Ṭhutchhúng chanchin vawnna hloh avangin i siamṭhatna dahṭhat theih a ni lo.'''
+
+''{{SITENAME}}-in HTML hel a tihzalen avangin hë enlâwkna hi JavaScript beihna laka invèn fimkhur nan thup bo a ni.''
+
+'''Hei hi siamṭhat tumna dànzui pangngai a nih chuan khawngaihin dahṭhat tum nawn leh rawh.'''
+I la dahṭhat theih loh cheu chuan [[Special:UserLogout|chhuah phawt ]] a, luh nawn leh hmang tein han bei vêl chhin lä.",
 'editing' => '$1 i siam(ţha) mék',
 'editingsection' => '$1 (hlawm) i siam(ţha) mék',
 'editingcomment' => '$1 (hlawm thar) i siam(ţha) mék',
@@ -578,6 +585,8 @@ I tihdanglamna dahţhat a la ni lo!  [[#editform|→ Ziah chhunzawmna]]",
 'yourtext' => 'I thu tah hian:',
 'storedversion' => 'Ennawnna vawnţhat',
 'yourdiff' => 'Danglamnate',
+'protectedpagewarning' => "'''Vaukhanna: Hë phêk hi roreltute chauhvin an siamṭhat theihna tùrin vènhim a ni.'''
+I rawn atan ziaka chanchin dah hnuhnüng ber kan rawn chhawp chhuak e:",
 'semiprotectedpagewarning' => "'''Hriat tùr:''' He phêk hi hmangtu inziaklûtte chauhvin an tihdanglam theihna tùra vènhim a ni.
 I rawn tùrin siamm-danglamna chanchin ziaka kan dahţhat thar ber a hnuaiah khuan kan chhawp e:",
 'templatesused' => 'He phêka {{PLURAL:$1|siamsa hman|siamsa hmante}}',
@@ -602,6 +611,7 @@ I rawn atan he phek paihna leh sawnna chanchin chhinchhiahna a hnuaiah khuan chh
 'edit-conflict' => 'Siamţhat inchuh buaina.',
 'edit-already-exists' => 'Phêk thar siam theih a ni lo.
 A awm tawh sa.',
+'defaultmessagetext' => 'Thuthawn tùr ziahsa',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Vaukhanna:''' Siamsa telh a lian leh lutuk.
@@ -698,7 +708,7 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'searcheverything-enable' => 'Hminghmun zawng zawngah zawng rawh',
 'searchrelated' => 'laichin',
 'searchall' => 'a vaiin',
-'showingresultsheader' => "'''$4''' tana {{PLURAL:$5|chhuak  '''$3''' zinga '''$1'''|chhuak '''$3''' zinga  '''$1 - $2'''  }}",
+'showingresultsheader' => "'''$4'''  tana {{PLURAL:$5|chhuak   '''$3'''  zinga  '''$1'''|chhuak  '''$3'''  zinga   '''$1 - $2'''  }}",
 'search-nonefound' => 'I zawn mil a awm lo',
 'powersearch' => 'Zawnna chi sang',
 'powersearch-legend' => 'Zawnna chi sang',
@@ -738,7 +748,7 @@ Google hmangin i lo zawng hrih thei ang.
 'prefs-personal' => 'Hmangtu chanchin tawi',
 'prefs-rc' => 'Tihdanglam thar',
 'prefs-watchlist' => 'Ralvèn',
-'prefs-watchlist-days' => 'Ralvèna ni tihlang tùr chin:',
+'prefs-watchlist-days' => 'Ralvèna ni tihlan tùr chin:',
 'prefs-watchlist-days-max' => 'A rei berah ni $1 {{PLURAL:$1||}}',
 'prefs-watchlist-edits' => 'Ralvèn pawhseia tihdanglam zât tihlan tùr tam ber:',
 'prefs-watchlist-edits-max' => 'A tam ber: 1000',
@@ -960,9 +970,11 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'boteditletter' => 'k',
 'rc-enhanced-expand' => 'Tilang kim rawh (JavaScript a ngai)',
 'rc-enhanced-hide' => 'Thup ţhenna',
+'rc-old-title' => 'Atìra "&1" tih hming pú-a siam.',
 
 # Recent changes linked
 'recentchangeslinked' => 'Tihdanglam anpuite',
+'recentchangeslinked-feed' => 'Tihdanglam anpuite',
 'recentchangeslinked-toolbox' => 'Tihdanglam anpuite',
 'recentchangeslinked-title' => '"$1" kaihhnawih tihdanglamnate',
 'recentchangeslinked-noresult' => 'I hun thlan chhungah hian a phek zawmpui tihdanglam pakhat mah a awm lo.',
@@ -981,6 +993,9 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'upload_directory_missing' => 'Hlankai bawmpui ($1)  a awm lo va, Rangserverin a siam thei lo bawl.',
 'upload_directory_read_only' => 'Hlankai bawmpui ($1) hi Rangserver in a ziak thei lo.',
 'uploaderror' => 'Hlankai sual',
+'upload-recreate-warning' => "'''Vaukhànna: Hemi hming pu taksa hi sawn tawh emaw paih tawh a ni.'''
+
+I ràwnah paihna leh sawnna chhinchhiahna thuziak kan rawn chhawpchhuak e:",
 'upload-permitted' => 'Taksa phal chiho: $1.',
 'upload-preferred' => 'Taksa duh deuh bîk: $1.',
 'upload-prohibited' => 'Taksa khap: $1.',
@@ -1027,7 +1042,7 @@ A hming thlâk la bei ţha leh rawh.',
 'listfiles_count' => 'Chhuah',
 
 # File description page
-'file-anchor-link' => 'Taksa (file)',
+'file-anchor-link' => 'Taksa',
 'filehist' => 'A chanchin enna',
 'filehist-help' => 'A hunlaia a lan dan en tùrin a hun/ni-ah hmet rawh.',
 'filehist-deleteall' => 'a vaiin nuaibo rawh',
@@ -1117,6 +1132,7 @@ Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
 'sp-deletedcontributions-contribs' => 'kutthawhnate',
 
 # Special:LinkSearch
+'linksearch-ns' => 'Hminghmun:',
 'linksearch-ok' => 'Zawng rawh',
 'linksearch-line' => '$1 hi $2 aţanga thlunzawm a ni',
 
@@ -1304,6 +1320,10 @@ Amah leh amah inluahlantir a theih loh.',
 'filemissing' => 'Taksa a awm lo',
 'thumbnail_error' => 'Zungbï siam hlawhchham: $1',
 
+# Special:Import
+'import-token-mismatch' => 'Ṭhut chhung hriatrengna hloh hman a ni.
+Khawngaihin tum nawn leh rawh.',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Nangma pual phek',
 'tooltip-pt-mytalk' => 'I sawihona phêk',
@@ -1514,6 +1534,17 @@ A bak zawng chu thuhrûk sa vek a ni ang.
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] thlitfimna:',
 
+# New logging system
+'logentry-move-move' => '$3 tih phêk kha $4-ah $1 hian a thlâk.',
+'logentry-move-move-noredirect' => 'Hruailuhna phêk hnutchhiah lovin $1-in $3 phêk kha $4-ah a sawn.',
+'logentry-move-move_redir' => 'Hruailuhna chungah $3 phêk kha $4-ah $1 hian a sawn.',
+'logentry-move-move_redir-noredirect' => 'Hruailuhna hnutchhiah lovin $3 phêk kha $4-ah $1 hian a sawn.',
+'logentry-newusers-newusers' => '$1 hian hmangtu siangchan a siam.',
+'logentry-newusers-create' => '$1 hian hmangtu siangchan a siam.',
+'logentry-newusers-create2' => '$1 hian hmangtu siangchan $3 a siam.',
+'logentry-newusers-autocreate' => 'Siangchan $1 hi amahin a insiam.',
+'newuserlog-byemail' => 'thurûk e-lehkha hmanga thawn a ni.',
+
 # Feedback
 'feedback-subject' => 'Thupui:',
 'feedback-message' => 'Thu',
index ceb3061..5e7142f 100644 (file)
@@ -1024,7 +1024,8 @@ $2
 'updated' => '(Подновено)',
 'note' => "'''Напомена:'''",
 'previewnote' => "'''Имајте предвид дека ова е само преглед.'''
-Вашите промени сè уште не се зачувани! [[#editform|→ Продолжете со уредување]]",
+Вашите промени сè уште не се зачувани!",
+'continue-editing' => 'Продолжете со уредување',
 'previewconflict' => 'Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.',
 'session_fail_preview' => "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на сесиски податоци.'''
 Обидете се повторно.
@@ -1123,6 +1124,10 @@ $2
 'parser-template-loop-warning' => 'Пронајдена е јамка во шаблонот: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Ограничувањето на рекурзивната длабочина надмината во шаблонот ($1)',
 'language-converter-depth-warning' => 'Надмината е границата на длабочината  на јазичниот претворач ($1)',
+'node-count-exceeded-category' => 'Страници каде е надминат бројот на јазли',
+'node-count-exceeded-warning' => 'Страницата го надмина бројот на јазли',
+'expansion-depth-exceeded-category' => 'Страници каде е надмината длабочината на проширувањето',
+'expansion-depth-exceeded-warning' => 'Страницата ја надмина длабочината на проширувањето',
 
 # "Undo" feature
 'undo-success' => 'Уредувањето може да се откаже.
@@ -1262,7 +1267,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'Дневник на сокривања',
 'suppressionlogtext' => 'Подолу е прикажан список на бришења и блокирања поврзани со содржини скриени од администратори.
-Тековните забрани и блокирања ќе ги најдете на [[Special:BlockList|списокот на блокирани IP-адреси]].',
+Тековните забрани и блокирања ќе ги најдете на [[Special:BlockList|списокот на блокирања]].',
 
 # History merging
 'mergehistory' => 'Спојување на истории на страница',
@@ -1428,7 +1433,7 @@ $1",
 Секој што го знае клучот во полево ќе може да го чита вашиот список на набљудувања, па затоа изберете некоја безбедна вредност.
 Еве една случајно-создадена вредност што можете да ја користите: $1',
 'savedprefs' => 'Вашите нагодувања се зачувани.',
-'timezonelegend' => 'ЧаÑ\81овна Ð·Ð¾Ð½Ð°:',
+'timezonelegend' => 'ЧаÑ\81овен Ð¿Ð¾Ñ\98аÑ\81:',
 'localtime' => 'Локално време:',
 'timezoneuseserverdefault' => 'Од викито ($1)',
 'timezoneuseoffset' => 'Друго (посочете отстапување)',
@@ -1676,7 +1681,7 @@ $1",
 'rcshowhidemine' => '$1 мои уредувања',
 'rclinks' => 'Прикажи скорешни $1 промени во последните $2 дена<br />$3',
 'diff' => 'разл',
-'hist' => 'ист',
+'hist' => 'истор',
 'hide' => 'Скриј',
 'show' => 'Прикажи',
 'minoreditletter' => 'с',
@@ -1941,6 +1946,7 @@ $1',
 'http-curl-error' => 'Грешка при добивањето на URL: $1',
 'http-host-unreachable' => 'Не можев да пристапам до URL-адресата',
 'http-bad-status' => 'Се појави проблем во текот на обработката на HTTP-барањето: $1 $2',
+'http-truncated-body' => 'Содржината на барањето не е примена во целост.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Не може да се пристапи до URL-то',
@@ -2225,6 +2231,11 @@ $1',
 'allpages-bad-ns' => 'Википедија не содржи именски простор „$1“.',
 'allpages-hide-redirects' => 'Скриј пренасочувања',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Гледате кеширана верзија на оваа страница, која може да е стара $1.',
+'cachedspecial-viewing-cached-ts' => 'Гледате кеширана верзија на оваа страница, која може да се разликува од тековната.',
+'cachedspecial-refresh-now' => 'Погл. најновата.',
+
 # Special:Categories
 'categories' => 'Категории',
 'categoriespagetext' => '{{PLURAL:$1|Следната категорија содржи|Следните категории содржат}} страници или мултимедијални податотеки.
@@ -2669,8 +2680,8 @@ $1',
 'ipb-confirm' => 'Потврди блок',
 'badipaddress' => 'Неважечка IP-адреса',
 'blockipsuccesssub' => 'Успешно блокирање',
-'blockipsuccesstext' => 'IP-адресата [[Special:Contributions/$1|$1]] е блокирана.<br />
-[[Special:BlockList|Список на блокирани IP-адреси]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] е блокирана.<br />
+Блоковите можете да ги прегледате на [[Special:BlockList|списокот на блокови]].',
 'ipb-blockingself' => 'Се спремате да се блокирате самите себеси! Сигурни сте дека го сакате ова?',
 'ipb-confirmhideuser' => 'Сакате да блокирате корисник со можноста „скриј корисник“. Ова ќе го затаи името на корисникот во сите списоци и дневнички записи. Дали сте сигурни дека сакате да го направите тоа?',
 'ipb-edit-dropdown' => 'Наведи причина за блокирање',
@@ -2725,7 +2736,7 @@ $1',
 'reblock-logentry' => 'ги промени нагодувањата за блокирање на [[$1]] со рок на истекување од $2 $3',
 'blocklogtext' => 'Ова е дневник на блокирање и одблокирање на кориснци.
 Автоматски блокираните IP-адреси не се наведени.
\92идеÑ\82е Ð³Ð¾ [[Special:BlockList|Ñ\81пиÑ\81окоÑ\82 Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани IP-адÑ\80еÑ\81и]].',
¢ÐµÐºÐ¾Ð²Ð½Ð¸Ñ\82е Ð·Ð°Ð±Ñ\80ани Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ñ\9cе Ð³Ð¸ Ð½Ð°Ñ\98деÑ\82е Ð½Ð° [[Special:BlockList|Ñ\81пиÑ\81окоÑ\82 Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа]].',
 'unblocklogentry' => 'го одблокира „$1“',
 'block-log-flags-anononly' => 'само анонимни корисници',
 'block-log-flags-nocreate' => 'оневозможено создавање кориснички сметки',
@@ -3994,6 +4005,11 @@ $5
 'version-software' => 'Инсталирана програмска опрема',
 'version-software-product' => 'Производ',
 'version-software-version' => 'Верзија',
+'version-entrypoints' => 'URL-а на влезните точки',
+'version-entrypoints-header-entrypoint' => 'Влезна точка',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=mk Патека на статијата]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=mk Патека на скриптата]',
 
 # Special:FilePath
 'filepath' => 'Патека до податотека',
@@ -4181,4 +4197,15 @@ $5
 'api-error-uploaddisabled' => 'Подигањето е оневозможено на ова вики.',
 'api-error-verification-error' => 'Податотеката е оштетена или има погрешна наставка.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'duration-minutes' => '$1 {{PLURAL:$1|минута|минути}}',
+'duration-hours' => '$1 {{PLURAL:$1|час|часа}}',
+'duration-days' => '$1 {{PLURAL:$1|ден|дена}}',
+'duration-weeks' => '$1 {{PLURAL:$1|недела|недели}}',
+'duration-years' => '{{PLURAL: $1|година|години}}',
+'duration-decades' => '$1 {{PLURAL:$1|деценија|децении}}',
+'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
+'duration-millennia' => '$1 {{PLURAL:$1|милениум|милениуми}}',
+
 );
index bcbd0bd..359af1f 100644 (file)
@@ -682,7 +682,7 @@ $1',
 'badtitle' => 'അസാധുവായ തലക്കെട്ട്',
 'badtitletext' => 'താങ്കൾ ആവശ്യപ്പെട്ട തലക്കെട്ടുള്ള ഒരു താൾ നിലവിലില്ല. ഇതു തെറ്റായി അന്തർഭാഷാ/അന്തർവിക്കി കണ്ണി ചെയ്യപ്പെട്ടതു മൂലമോ, തലക്കെട്ടിൽ ഉപയോഗിക്കരുതാത്ത അക്ഷരരൂപങ്ങൾ ഉപയോഗിച്ചതു മൂലമോ സംഭവിച്ചതായിരിക്കാം.',
 'perfcached' => 'താഴെ കൊടുത്തിരിക്കുന്ന വിവരം ശേഖരിച്ചു വെച്ചിരിക്കുന്നതാണ്, അതുകൊണ്ട് ചിലപ്പോൾ പുതിയതായിരിക്കണമെന്നില്ല. പരമാവധി {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
-'perfcachedts' => 'താഴെയുള്ള വിവരങ്ങൾ ശേഖരിച്ച് വെച്ചവയിൽ പെടുന്നു, അവസാനം പുതുക്കിയത് $1-നു ആണ്‌. പരമാവധി {{PLURAL:$4|ഒരു ഫലം|$4 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്. സാധാരണ ഗതിയിൽ $4 ആയിരമായിരിക്കും.',
+'perfcachedts' => 'താഴെയുള്ള വിവരങ്ങൾ ശേഖരിച്ച് വെച്ചവയിൽ പെടുന്നു, അവസാനം പുതുക്കിയത് $1-നു ആണ്‌. പരമാവധി {{PLURAL:$4|ഒരു ഫലം|$4 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
 'querypage-no-updates' => 'ഈ താളിന്റെ പുതുക്കൽ തൽക്കാലം നടക്കുന്നില്ല. ഇവിടുള്ള വിവരങ്ങൾ ഏറ്റവും പുതിയതാവണമെന്നില്ല.',
 'wrong_wfQuery_params' => 'wfQuery()എന്നതിലേക്ക് തെറ്റായ പരാമീറ്ററുകൾ<br />
 നിർദ്ദേശം: $1<br />
@@ -812,6 +812,7 @@ $2',
 # Change password dialog
 'resetpass' => 'രഹസ്യവാക്ക് മാറ്റുക',
 'resetpass_announce' => 'താങ്കൾക്ക് ഇമെയിൽ ആയി കിട്ടിയ താൽക്കാലിക കോഡ് ഉപയോഗിച്ചാണ്‌ ഇപ്പോൾ ലോഗിൻ ചെയ്തിരിക്കുന്നതു്‌. ലോഗിൻ പ്രക്രിയ പൂർത്തിയാകുവാൻ പുതിയൊരു രഹസ്യവാക്ക് ഇവിടെ കൊടുക്കുക:',
+'resetpass_text' => '<!-- എഴുത്ത് ഇവിടെ ചേർക്കുക -->',
 'resetpass_header' => 'അംഗത്വത്തിന്റെ രഹസ്യവാക്ക് മാറ്റുക',
 'oldpassword' => 'പഴയ രഹസ്യവാക്ക്:',
 'newpassword' => 'പുതിയ രഹസ്യവാക്ക്:',
@@ -979,7 +980,8 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'updated' => '(പുതുക്കിയിരിക്കുന്നു)',
 'note' => "'''പ്രത്യേക ശ്രദ്ധയ്ക്ക്:'''",
 'previewnote' => "'''ഇതൊരു പ്രിവ്യൂ മാത്രമാണെന്ന് ഓർക്കുക.'''
-താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല! [[#editform|→ തിരുത്തൽ തുടരുക]]",
+താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല!",
+'continue-editing' => 'തിരുത്തൽ തുടരുക',
 'previewconflict' => 'ഈ പ്രിവ്യൂവിൽ മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലുള്ള എഴുത്ത് മാത്രമാണ് കാട്ടുന്നത്, സേവ്‌ ചെയ്യാൻ താങ്കൾ തീരുമാനിച്ചാൽ അത് സേവ് ആകുന്നതാണ്.',
 'session_fail_preview' => "'''ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.''' 
 ദയവായി വീണ്ടും ശ്രമിക്കൂ.
@@ -1052,6 +1054,7 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'edit-no-change' => 'ഇപ്പോഴുള്ള സ്ഥിതിയിൽ നിന്നു യാതൊരു മാറ്റവും ഇല്ലാത്തതിനാൽ താങ്കളുടെ തിരുത്തലുകൾ തിരസ്കരിക്കപ്പെട്ടിരിക്കുന്നു.',
 'edit-already-exists' => 'പുതിയ താൾ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.
 താൾ ഇപ്പോൾ തന്നെ നിലവിലുണ്ട്.',
+'defaultmessagetext' => 'സ്വതേയുള്ള സന്ദേശ എഴുത്ത്',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''മുന്നറിയിപ്പ്:''' ഈ താളിൽ വളരെക്കൂടുതൽ പാഴ്സർ ഫങ്ഷനുകൾ വിളിച്ചിരിക്കുന്നു.
@@ -1067,6 +1070,10 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'parser-template-loop-warning' => 'ഫലകക്കുരുക്ക് കണ്ടെത്തിയിരിക്കുന്നു: [[$1]]',
 'parser-template-recursion-depth-warning' => 'ഫലകത്തിന്റെ പുനരാവർത്തന ആഴത്തിന്റെ പരിധി കഴിഞ്ഞിരിക്കുന്നു ($1)',
 'language-converter-depth-warning' => 'ഭാഷ മാറ്റൽ ഉപകരണത്തിന്റെ ആഴത്തിന്റെ പരിധി കവിഞ്ഞിരിക്കുന്നു ($1)',
+'node-count-exceeded-category' => 'നോഡ്-എണ്ണം അധികരിച്ച താളുകൾ',
+'node-count-exceeded-warning' => 'താൾ നോഡ്-എണ്ണം അധികരിച്ചിരിക്കുന്നു',
+'expansion-depth-exceeded-category' => 'വികസന ആഴം അധികരിച്ച താളുകൾ',
+'expansion-depth-exceeded-warning' => 'താളിന്റെ വികസന ആഴം അധികരിച്ചിരിക്കുന്നു',
 
 # "Undo" feature
 'undo-success' => 'ഈ തിരുത്തൽ താങ്കൾക്ക് തിരസ്ക്കരിക്കാവുന്നതാണ്‌. താഴെ കൊടുത്തിരിക്കുന്ന പതിപ്പുകൾ തമ്മിലുള്ള താരതമ്യം ഒന്നുകൂടി പരിശോധിച്ച് ഈ പ്രവൃത്തി ചെയ്യണോ എന്ന് ഒന്നുകൂടി ഉറപ്പാക്കുക. ഉറപ്പാണെങ്കിൽ തിരുത്തൽ തിരസ്ക്കരിക്കുവാൻ താൾ സേവ് ചെയ്യുക.',
@@ -1214,7 +1221,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'ഒതുക്കൽ രേഖ',
 'suppressionlogtext' => 'കാര്യനിർവാഹകരിൽ നിന്നും മറയ്ക്കപ്പെട്ടിട്ടുള്ള മായ്ക്കുകയും തടയുകയും ചെയ്തതുമായ ഉള്ളടക്കങ്ങളുടെ പട്ടിക നൽകിയിരിക്കുന്നു.
-à´\87à´ªàµ\8dà´ªàµ\8bൾ à´\95àµ\88à´\95ാരàµ\8dà´¯à´\82 à´\9aàµ\86à´¯àµ\8dയാൻ à´ªà´±àµ\8dà´±àµ\81à´¨àµ\8dà´¨ à´¨à´¿à´°àµ\8bധനà´\99àµ\8dà´\99à´³àµ\81à´\82 à´¤à´\9fയലàµ\81à´\95à´³àµ\81à´\82 à´\95ാണാൻ [[Special:BlockList|à´¤à´\9fയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´\90.പി. à´µà´¿à´²à´¾à´¸à´\99àµ\8dà´\99ൾ]] കാണുക.',
+à´\87à´ªàµ\8dà´ªàµ\8bൾ à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dà´³ à´¨à´¿à´°àµ\8bധനà´\99àµ\8dà´\99à´³àµ\81à´\82 à´¤à´\9fയലàµ\81à´\95à´³àµ\81à´\82 à´\95ാണാൻ [[Special:BlockList|à´¤à´\9fയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´µ]] കാണുക.',
 
 # History merging
 'mergehistory' => 'താളുകളുടെ നാൾവഴികൾ സം‌യോജിപ്പിക്കുക',
@@ -1272,7 +1279,7 @@ $1",
 'prevn-title' => 'മുൻപത്തെ {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}}',
 'nextn-title' => 'അടുത്ത {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}}',
 'shown-title' => '{{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} വീതം താളിൽ കാണിക്കുക',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2 {{int:pipe-separator}} $3 മാറ്റങ്ങൾ കാണുക)',
+'viewprevnext' => '$1 {{int:pipe-separator}} $2 എണ്ണം കാണുക ($3)',
 'searchmenu-legend' => 'തിരച്ചിൽ ഉപാധികൾ',
 'searchmenu-exists' => "'''\"[[:\$1]]\" എന്ന തലക്കെട്ടിൽ ഒരു താൾ ഈ വിക്കിയിൽ നിലവിലുണ്ട്'''",
 'searchmenu-new' => "'''ഈ വിക്കിയിൽ \"[[:\$1]]\" താൾ നിർമ്മിക്കുക!'''",
@@ -1559,7 +1566,7 @@ $1",
 
 # User rights log
 'rightslog' => 'ഉപയോക്തൃ അവകാശ രേഖ',
-'rightslogtext' => 'à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´µà´\95ാശà´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\81à´£àµ\8dà´\9fായ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´\95ാണിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´\92à´°àµ\81 à´²àµ\8bà´\97ാണിത്.',
+'rightslogtext' => 'à´\88 à´ªàµ\8dരവർതàµ\8dതനരàµ\87à´\96 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´µà´\95ാശà´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\81à´£àµ\8dà´\9fായ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\87താണ്.',
 'rightslogentry' => '$1 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $2 എന്നതിൽ നിന്നു $3 എന്നതിലേക്കു മാറ്റിയിരിക്കുന്നു',
 'rightslogentry-autopromote' => '$2 എന്നതിൽ നിന്ന് $3 എന്നതിലേയ്ക്ക് സ്വയം ഉയർത്തിയിരിക്കുന്നു',
 'rightsnone' => '(ഒന്നുമില്ല)',
@@ -1800,6 +1807,11 @@ $1',
 'backend-fail-read' => '$1 എന്ന പ്രമാണം വായിക്കാൻ കഴിഞ്ഞില്ല.',
 'backend-fail-create' => '$1 എന്ന പ്രമാണം സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.',
 'backend-fail-maxsize' => '{{PLURAL:$2|$2 ബൈറ്റ്സിലും|$2 ബൈറ്റിലും}} വലുതാണെന്ന കാരണത്താൽ $1 എന്ന പ്രമാണം സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.',
+'backend-fail-readonly' => 'സംഭരണ ബാക്കെൻഡ് "$1" ഇപ്പോൾ കാണൽ-മാത്രം (read-only) രീതിയിലാണ്. നൽകിയിരിക്കുന്ന കാരണം: "\'\'$2\'\'"',
+'backend-fail-synced' => 'ആന്തരിക ശേഖരണ ബാക്കെൻഡിൽ പ്രമാണം "$1" അസ്ഥിരാവസ്ഥയിലാണുള്ളത്',
+'backend-fail-connect' => '"$1"  ശേഖരണ ബാക്കെൻഡുമായി ബന്ധപ്പെടാൻ കഴിഞ്ഞില്ല.',
+'backend-fail-internal' => '"$1" എന്ന സ്റ്റോറേജ് ബാക്കെൻഡിൽ അപരിചിതമായ പിഴവ് സംഭവിച്ചു.',
+'backend-fail-contenttype' => '"$1" എന്നതിൽ സംഭരിച്ചിരിക്കുന്ന പ്രമാണത്തിന്റെ ഉള്ളടക്ക തരം നിർണ്ണയിക്കാനായില്ല.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'സിപ് (ZIP) പരിശോധനകൾക്കായി പ്രമാണം തുറന്നപ്പോൾ പിഴവുണ്ടായി.',
@@ -1917,6 +1929,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'shared-repo-from' => '$1 സംരംഭത്തിൽ നിന്ന്',
 'shared-repo' => 'ഒരു പങ്കുവെക്കപ്പെട്ട സംഭരണി',
 'shared-repo-name-wikimediacommons' => 'വിക്കിമീഡിയ കോമൺസ്',
+'filepage.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. പ്രമാണ വിവരണ താളുകളിൽ ഉൾപ്പെടുത്തപ്പെടുന്നതായിരിക്കും, ബാഹ്യ ക്ലൈന്റ് വിക്കികളിലും അത് ലഭ്യമായിരിക്കും */',
 
 # File reversion
 'filerevert' => '$1 തിരസ്ക്കരിക്കുക',
@@ -1996,7 +2009,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'statistics-users-active-desc' => 'കഴിഞ്ഞ {{PLURAL:$1|ദിവസം|$1 ദിവസങ്ങൾക്കുള്ളിൽ}} പ്രവർത്തിച്ചിട്ടുള്ള ഉപയോക്താക്കൾ',
 'statistics-mostpopular' => 'ഏറ്റവുമധികം സന്ദർശിക്കപ്പെട്ട താളുകൾ',
 
-'disambiguations' => 'വിവക്ഷിത താളുകളിലേയ്ക്ക് കണ്ണിചേർക്കുന്ന താളുകൾ',
+'disambiguations' => 'വിവà´\95àµ\8dà´·à´¿à´¤ à´¤à´¾à´³àµ\81à´\95ളിലàµ\87à´¯àµ\8dà´\95àµ\8dà´\95àµ\8d à´\95à´£àµ\8dണിà´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾ',
 'disambiguationspage' => 'Template:വിവക്ഷകൾ',
 'disambiguations-text' => 'താഴെ കൊടുത്തിരിക്കുന്ന താളുകൾ വിവക്ഷിതങ്ങൾ താളിലേക്കു കണ്ണി ചേർക്കപ്പെട്ടിരിക്കുന്നു. അതിനു പകരം അവ ലേഖനതാളുകളിലേക്കു കണ്ണി ചേക്കേണ്ടതാണ്‌. <br /> ഒരു താളിനെ വിവക്ഷിത താൾ ആയി പരിഗണിക്കണമെങ്കിൽ അതു  [[MediaWiki:Disambiguationspage]] എന്ന താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ട ഒരു ഫലകം ഉപയോഗിക്കണം.',
 
@@ -2124,6 +2137,11 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'allpages-bad-ns' => '{{SITENAME}} സംരംഭത്തിൽ "$1" എന്ന നാമമേഖല നിലവിലില്ല.',
 'allpages-hide-redirects' => 'തിരിച്ചുവിടലുകൾ മറയ്ക്കുക',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'ഈ താളിന്റെ ശേഖരിച്ചുവച്ചിരിക്കുന്ന പതിപ്പാണ് നിങ്ങൾ കാണുന്നത്, ഇത് $1 വരെ പഴക്കമുള്ളതായിരിക്കാം.',
+'cachedspecial-viewing-cached-ts' => 'ഈ താളിന്റെ ശേഖരിച്ചുവച്ചിരിക്കുന്ന പതിപ്പാണ് നിങ്ങൾ കാണുന്നത്, ഇത് യഥാർത്ഥപതിപ്പിൽനിന്നും വ്യത്യസ്തമായിരിക്കാം.',
+'cachedspecial-refresh-now' => 'ഏറ്റവും പുതിയ പതിപ്പ് കാണുക.',
+
 # Special:Categories
 'categories' => 'വർഗ്ഗങ്ങൾ',
 'categoriespagetext' => 'താഴെ കൊടുത്തിരിക്കുന്ന {{PLURAL:$1|വർഗ്ഗത്തിൽ|വർഗ്ഗങ്ങളിൽ}} താളുകളും പ്രമാണങ്ങളുമുണ്ട്.
@@ -2241,7 +2259,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'notanarticle' => 'ലേഖന താൾ അല്ല',
 'notvisiblerev' => 'മറ്റൊരു ഉപയോക്താവ് സൃഷ്ടിച്ച അവസാനത്തെ നാൾപ്പതിപ്പ് മായ്ച്ചിരിക്കുന്നു',
 'watchnochange' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ ഒന്നും തന്നെ ഇക്കാലയളവിൽ തിരുത്തപ്പെട്ടിട്ടില്ല.',
-'watchlist-details' => 'à´¸à´\82â\80\8cവാദà´\82 à´¤à´¾à´³àµ\81à´\95ൾ à´\85à´²àµ\8dലാതàµ\8dà´¤ {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.',
+'watchlist-details' => 'à´¸à´\82â\80\8cവാദà´\82 à´¤à´¾à´³àµ\81à´\95ൾ à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതാതàµ\86 {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.',
 'wlheader-enotif' => '* ഇമെയിൽ വിജ്ഞാപനം സാധ്യമാക്കിയിരിക്കുന്നു.',
 'wlheader-showupdated' => "* താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം തിരുത്തപ്പെട്ട താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
 'watchmethod-recent' => 'ശ്രദ്ധിക്കുന്ന താളുകൾക്കുവേണ്ടി പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു',
@@ -2557,7 +2575,7 @@ $1',
 'badipaddress' => 'അസാധുവായ ഐ.പി. വിലാസം.',
 'blockipsuccesssub' => 'തടയൽ വിജയിച്ചിരിക്കുന്നു',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] എന്ന ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു.<br />
-à´¤à´\9fയൽ à´ªàµ\81à´¨à´\83പരിശàµ\8bധിà´\95àµ\8dà´\95ാൻ [[Special:BlockList|à´\90.പി. à´¤à´\9fയൽ à´ªà´\9fàµ\8dà´\9fà´¿à´\95]] à´\95ാണàµ\81à´\95.',
+തടയൽ പുനഃപരിശോധിക്കാൻ [[Special:BlockList|തടയൽ പട്ടിക]] കാണുക.',
 'ipb-blockingself' => 'താങ്കൾ താങ്കളെ തന്നെ തടയാൻ പോകുകയാണ്! അത് ചെയ്യണം എന്ന് താങ്കൾക്കുറപ്പാണോ?',
 'ipb-confirmhideuser' => 'താങ്കൾ "ഉപയോക്താവിനെ മറച്ചുകൊണ്ട്" ഒരു തടയൽ ചെയ്യാൻ പോവുകയാണ്. ഇത് എല്ലാ പട്ടികകളിൽ നിന്നും രേഖകളിൽ നിന്നും ഉപയോക്താവിന്റെ പേര് മറച്ച് വെയ്ക്കും. ഇപ്രകാരം വേണമെന്ന് തീർച്ചയാണോ?',
 'ipb-edit-dropdown' => 'തടഞ്ഞതിന്റെ കാരണം തിരുത്തുക',
@@ -2609,7 +2627,7 @@ $1',
 അവലംബത്തിനായി ഒതുക്കൽ രേഖ താഴെ കൊടുത്തിരിക്കുന്നു:',
 'blocklogentry' => '$2 കാലത്തേക്കു [[$1]] എന്ന അംഗത്വത്തെ തടഞ്ഞിരിക്കുന്നു $3',
 'reblock-logentry' => '[[$1]] എന്ന ഉപയോക്താവിനുള്ള തടയൽ നിബന്ധനകൾ മാറ്റിയിരിക്കുന്നു, തടയൽ അവസാനിക്കുന്നത് $2 $3',
-'blocklogtext' => '{{SITENAME}} സംരംഭത്തിൽ പ്രവർത്തിക്കുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടഞ്ഞതിന്റേയും, പുനഃപ്രവർത്തനാനുമതി നൽകിയതിന്റേയും രേഖകൾ താഴെ കാണാം. {{SITENAME}} സംരംഭം സ്വയം  തടയുന്ന ഐ.പി. വിലാസങ്ങൾ ഈ പട്ടികയിലില്ല. [[Special:BlockList|തടയപ്പെട്ടിട്ടുള്ള ഐ.പി. വിലാസങ്ങളുടെ പട്ടിക]] എന്ന താളിൽ നിലവിലുള്ള നിരോധനങ്ങളേയും തടയലുകളേയും കാണാവുന്നതാണ്.',
+'blocklogtext' => 'ഉപയോക്താക്കളെ തടഞ്ഞതിന്റേയും, പുനഃപ്രവർത്തനാനുമതി നൽകിയതിന്റേയും രേഖകൾ താഴെ കാണാം. സ്വയം  തടയപ്പെടുന്ന ഐ.പി. വിലാസങ്ങൾ ഈ പട്ടികയിലില്ല. [[Special:BlockList|തടയപ്പെട്ടിട്ടുള്ളവയുടെ പട്ടിക]] എന്ന താളിൽ നിലവിലുള്ള നിരോധനങ്ങളേയും തടയലുകളേയും കാണാവുന്നതാണ്.',
 'unblocklogentry' => '$1 എന്ന ഉപയോക്താവിന്റെ തടയൽ ഒഴിവാക്കിയിരിക്കുന്നു',
 'block-log-flags-anononly' => 'അജ്ഞാത ഉപയോക്താക്കളെ മാത്രം',
 'block-log-flags-nocreate' => 'അംഗത്വം സൃഷ്ടിക്കുന്നതും തടഞ്ഞിരിക്കുന്നു',
@@ -2739,10 +2757,10 @@ $1',
 'delete_and_move' => 'മായ്ക്കുകയും മാറ്റുകയും ചെയ്യുക',
 'delete_and_move_text' => '==താൾ മായ്ക്കേണ്ടിയിരിക്കുന്നു==
 
-താà´\99àµ\8dà´\95ൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാൻ à´¶àµ\8dരമിà´\9aàµ\8dà´\9a "[[:$1]]" à´\8eà´¨àµ\8dà´¨ à´¤à´¾àµ¾ à´¨à´¿à´²à´µà´¿à´²àµ\81à´£àµ\8dà´\9fàµ\8d. à´\86 à´¤à´¾àµ¾ à´®à´¾à´¯àµ\8dà´\9aàµ\8dà´\9aàµ\8d à´ªàµ\81തിയ à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\8d à´¨àµ½കേണ്ടതുണ്ടോ?',
+മാറàµ\8dറാനായി à´¨àµ½à´\95à´¿à´¯ "[[:$1]]" à´\8eà´¨àµ\8dà´¨ à´¤à´¾àµ¾ à´¨à´¿à´²à´µà´¿à´²àµ\81à´£àµ\8dà´\9fàµ\8d. à´\88 à´®à´¾à´±àµ\8dà´±à´\82 à´¨à´\9fà´¤àµ\8dà´¤àµ\81à´¨àµ\8dനതിനàµ\81à´µàµ\87à´£àµ\8dà´\9fà´¿ à´\86 à´¤à´¾àµ¾ à´®à´¾à´¯àµ\8dà´\95àµ\8dകേണ്ടതുണ്ടോ?',
 'delete_and_move_confirm' => 'ശരി, താൾ നീക്കം ചെയ്യുക',
 'delete_and_move_reason' => '"[[$1]]" എന്നതിൽ നിന്നും മാറ്റാനുള്ള സൗകര്യത്തിനായി മായ്ച്ചു',
-'selfmove' => 'à´¸àµ\8dà´°àµ\8bതസàµ\8dസിനàµ\8dà´±àµ\86 à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81à´\82 à´²à´\95àµ\8dà´·àµ\8dയതàµ\8dതിനàµ\8dà´±àµ\86 à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81à´\82 à´\92à´¨àµ\8dനാണàµ\8dâ\80\8c. അതിനാൽ തലക്കെട്ടുമാറ്റം സാദ്ധ്യമല്ല.',
+'selfmove' => 'പഴയ à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81 à´¤à´¨àµ\8dà´¨àµ\86യാണàµ\8d à´®à´¾à´±àµ\8dറാനായി à´¨àµ½à´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതàµ\8d; അതിനാൽ തലക്കെട്ടുമാറ്റം സാദ്ധ്യമല്ല.',
 'immobile-source-namespace' => '"$1" നാമമേഖലയിലെ താളുകൾ മാറ്റാൻ കഴിയില്ല',
 'immobile-target-namespace' => '"$1" നാമമേഖലയിലേയ്ക്ക് താളുകൾ മാറ്റാൻ കഴിയില്ല',
 'immobile-target-namespace-iw' => 'അന്തർവിക്കി കണ്ണി താൾ മാറ്റാനുള്ള സാധുവായ ലക്ഷ്യമല്ല.',
@@ -2951,12 +2969,28 @@ $1',
 
 # Stylesheets
 'common.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എല്ലാ ദൃശ്യരൂപങ്ങൾക്കും ബാധകമായിരിക്കും */',
+'standard.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സാർവത്രികം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'nostalgia.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ഗൃഹാതുരത്വം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'monobook.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'myskin.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എന്റിഷ്ടം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'chick.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സുന്ദരി ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'modern.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'vector.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/',
+'noscript.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്., ജാവാസ്ക്രിപ്റ്റ് സജ്ജമാക്കിയിട്ടില്ലാത്ത ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
+'group-autoconfirmed.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. യാന്ത്രികമായി സ്ഥിരീകരിച്ച ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
+'group-bot.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */',
+'group-sysop.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */',
+'group-bureaucrat.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */',
 
 # Scripts
 'common.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് എല്ലാ ഉപയോക്താക്കൾക്കും, എല്ലാ താളുകളിലും പ്രവർത്തിക്കുന്നതായിരിക്കും */',
+'monobook.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'modern.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'vector.js' => '/*ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് വെക്റ്റർ ദൃശ്യരൂപം ഉപയോഗിക്കുന്ന ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും*/',
+'group-autoconfirmed.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
+'group-bot.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */',
+'group-sysop.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */',
+'group-bureaucrat.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */',
 
 # Metadata
 'notacceptable' => 'താങ്കളുടെ ക്ലയന്റിനു മനസ്സിലാക്കാൻ പാകത്തിലുള്ള തരത്തിൽ വിവരങ്ങൾ നൽകാൻ വിക്കി സെർവറിനു ശേഷിയില്ല.',
@@ -3070,6 +3104,10 @@ $1',
 'sp-newimages-showfrom' => '$2, $1 നു ശേഷം അപ്‌ലോഡ് ചെയ്ത പ്രമാണങ്ങൾ പ്രദർശിപ്പിക്കുക',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => '$1സെ',
+'minutes-abbrev' => '$1മി',
+'hours-abbrev' => '$1മ',
+'days-abbrev' => '$1ദി',
 'seconds' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}}',
 'minutes' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}',
 'hours' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}',
@@ -3667,6 +3705,9 @@ $5
 'version-software' => 'ഇൻസ്റ്റോൾ ചെയ്ത സോഫ്റ്റ്‌വെയർ',
 'version-software-product' => 'സോഫ്റ്റ്‌വെയർ ഉല്പ്പന്നം',
 'version-software-version' => 'വിവരണം',
+'version-entrypoints' => 'പ്രവേശന നില യൂ.ആർ.എല്ലുകൾ',
+'version-entrypoints-header-entrypoint' => 'പ്രവേശന നില',
+'version-entrypoints-header-url' => 'യൂ.ആർ.എൽ.',
 
 # Special:FilePath
 'filepath' => 'പ്രമാണത്തിലേക്കുള്ള വിലാസം',
@@ -3856,4 +3897,15 @@ $5
 'api-error-uploaddisabled' => 'ഈ വിക്കിയിൽ അപ്‌ലോഡിങ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുകയാണ്.',
 'api-error-verification-error' => 'ഈ പ്രമാണത്തിൽ പിഴവുണ്ട്, അല്ലെങ്കിൽ തെറ്റായ എക്സ്‌റ്റെൻഷനാണുള്ളത്.',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}}',
+'duration-minutes' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}',
+'duration-hours' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}',
+'duration-days' => '{{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}',
+'duration-weeks' => '{{PLURAL:$1|ഒരു ആഴ്ച്ച|$1 ആഴ്ച്ച}}',
+'duration-years' => '{{PLURAL:$1|ഒരു വർഷം|$1 വർഷം}}',
+'duration-decades' => '{{PLURAL:$1|ഒരു ദശാബ്ദം|$1 ദശാബ്ദം}}',
+'duration-centuries' => '{{PLURAL:$1|ഒരു നൂറ്റാണ്ട്|$1 നൂറ്റാണ്ട്}}',
+'duration-millennia' => '{{PLURAL:$1|ഒരു സഹസ്രാബ്ദം|$1 സഹസ്രാബ്ദം}}',
+
 );
index 7d8b499..3244c60 100644 (file)
@@ -303,7 +303,7 @@ $1',
 'ok' => 'OK',
 'pagetitle' => '$1 - {{SITENAME}}',
 'retrievedfrom' => '"$1" хуудаснаас авсан',
-'youhavenewmessages' => 'Таньд $1 ($2) байна.',
+'youhavenewmessages' => 'Таньд $1 ($2) байна.',
 'newmessageslink' => 'шинэ мессеж',
 'newmessagesdifflink' => 'сүүлийн өөрчлөлт',
 'youhavenewmessagesmulti' => 'Таньд $1 дээр шинэ мессеж ирсэн байна',
@@ -496,11 +496,11 @@ $2',
 'password-login-forbidden' => 'Ийм хэрэглэгчийн, нууц үгээр нэвтрэхийг хориглож байна.',
 'mailmypassword' => 'Мэйл хаягаар шинэ нууц үгийг илгээ',
 'passwordremindertitle' => '{{SITENAME}}-д нэвтрэх түр зуурын шинэ нууц үг',
-'passwordremindertext' => 'Хэн нэгэн (магадгүй та, IP хаяг нь $1) {{SITENAME}} ($4) хуудсанд нэвтрэх шинэ нууц үг явуулах хүсэлтийг тавьсан байна. Түр нууц үг "$3" хэрэглэгч "$2"-д олгогдлоо.
-Хэрэв та үүнийг хүссэн бол холбогдож шинэ нууц үгээ одоо сонгоно уу.
-Таны түр зуурын нууц үг {{PLURAL:$5|нэг өдрийн|$5 өдрийн}} дараа цуцлагдах болно.
+'passwordremindertext' => 'Хэн нэгэн (магадгүй та, $1 гэх IP хаягаас) {{SITENAME}} ($4) хуудсанд нэвтрэх шинэ нууц үг явуулах хүсэлтийг тавьсан байна. "$3" гэсэн түр хугацаанд хэрэглэж болох нууц үгийг хэрэглэгч "$2"-д олгов.
+Хэрэв та ингэхийг хүссэн бол нэвтэрч ороод шинэ нууц үгээ сонгоно уу.
+Таны түр зуурын нууц үгний хугацаа {{PLURAL:$5|нэг өдрийн|$5 өдрийн}} дараа дуусах болно.
 
-Хэрэв энэ хүсэлтийг өөр хүн тавьсан, эсвэл та хуучин нууц үгээ санаж солихыг хүсэхгүй байгаа бол та энэ мэйлийг тоохгүйгээр хуучин нууц үгээ хэвээр хэрэглэж болно.',
+Хэрэв энэ хүсэлтийг өөр хүн тавьсан, эсвэл та хуучин нууц үгээ олоод, солихыг хүсэхгүй байгаа бол та энэ мэйлийг үл ойшоон хуучин нууц үгээ хэрэглэсэн хэвээр байж болно.',
 'noemail' => 'Хэрэглэгч "$1" нь мэйл хаягаа бүртгүүлээгүй байна.',
 'noemailcreate' => 'Та хүчинтэй и-мэйл хаягаа өгөх ёстой',
 'passwordsent' => '"$1"-н бүртгүүлсэн мэйл хаяг руу шинэ нууц үг илгээгдлээ.
@@ -524,10 +524,10 @@ $2',
 'accountcreated' => 'Бүртгэл үүсгэгдлээ',
 'accountcreatedtext' => '$1 хэрэглэгчийн бүртгэл үүсгэгдлээ.',
 'createaccount-title' => '{{SITENAME}}-н бүртгэлийн үүсгэл',
-'createaccount-text' => 'Хэн нэгэн {{SITENAME}}-д ($4) "$2" нэртэй, "$3" нууц үгтэй бүртгэлийг энэ мэйл хаягт үүсгэжээ.
+'createaccount-text' => 'Хэн нэгэн {{SITENAME}}-д ($4) "$2" гэсэн нэрээр, "$3" гэсэн нууц үгтэйгээр таны мэйл хаягийг ашиглан бүртгүүлжээ.
 Та одоо нэвтэрч өөрийн нууц үгээ солих хэрэгтэй.
 
-Хэрэв энэ бүртгэлийг алдаа гаргаж үүсгэсэн бол энэ мэдэгдлийг үл ойшоож болно.',
+Хэрэв буруугаар бүртгүүлсэн бол энэ мэдэгдлийг үл ойшоож болно.',
 'usernamehasherror' => 'Хэрэглэгчийн нэрэнд хаш тэмдэгт орж болохгүй',
 'login-throttled' => 'Та хэт олон удаа нэвтрэх гэж оролдсон байна.
 Хүлээж байгаад дахин оролдого уу.',
@@ -703,7 +703,8 @@ $2',
 Өөрсдийн .css болон .js хуудсуудыг нэрлэхэд жижиг үсэг хэрэглэдэг болохыг сануулж байна. Жишээ нь: {{ns:user}}:Foo/vector.css гэж л хэрэглэх бөгөөд {{ns:user}}:Foo/Vector.css гэхгүй.",
 'updated' => '(Шинэчлэгдсэн)',
 'note' => "'''Анхааруулга:'''",
-'previewnote' => "'''Энэ бол зөвхөн урьдчилж харсан байдал; засварууд одоохондоо хадгалагдаагүй байна!'''",
+'previewnote' => "'''Энэ бол зөвхөн урьдчилж харсан байдал.'''
+Таны хийсэн өөрчлөлтүүдийг одоохондоо хадгалаагүй байгаа!",
 'previewconflict' => 'Энэ урьдчилж харсан байдал нь дээд талын засварлах талбарын текстийг хадгалахад харагдах байдлыг харуулна.',
 'session_fail_preview' => "'''Уучлаарай! Мэдээлэл алдагдснаас болж таны засварыг боловсруулж чадсангүй. Дахин оролдож үзнэ үү. Ингээд ч болохгүй байвал сайтаас гарч дахин нэвтэрч орж үзнэ үү.'''",
 'session_fail_preview_html' => "'''Уучлаарай! Мэдээлэл алдагдснаас болж таны засварыг боловсруулж чадсангүй.'''
@@ -795,7 +796,7 @@ $2 дуудлагаас доош байх ёстой, харин одоо $1 б
 Эдгээр аргументуудыг тооцсонгүй.",
 'post-expand-template-argument-category' => 'Орхигдсон загварын аргументуудтай хуудаснууд',
 'parser-template-loop-warning' => 'Загвар тойрч буйг тогтоов: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Загварын рекурсийн гүний хязгаараас ихэдлээ ($1)',
+'parser-template-recursion-depth-warning' => 'Загварын рекурсийн хэмжээний хязгаараас хэтрэв ($1)',
 'language-converter-depth-warning' => 'Хэл хооронд хөрвүүлэх гүний хязгаараас хэтрэв ($1)',
 
 # "Undo" feature
@@ -803,7 +804,7 @@ $2 дуудлагаас доош байх ёстой, харин одоо $1 б
 Доорх харьцуулалтыг шалгаж үнэхээр хиймээр байгаа зүйл мөн үү гэдгээ нотлоорой. Дараа нь засварыг дуусгахын тулд өөрчлөлтүүдээ хадгална уу.',
 'undo-failure' => 'Хоорондын засваруудаас болж засвар цуцлагдах боломжгүй байна.',
 'undo-norev' => 'Засвар оршдогүүй эсвэл устгагдсан тул цуцлаж чадсангүй.',
-'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Яриа]]) хэрэглэгчийн $1 засварыг цуцлах',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Яриа]]) хэрэглэгчийн $1 засварыг цуцлах',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Хэрэглэгчийн бүртгэлийг үүсгэж чадсангүй.',
@@ -833,7 +834,7 @@ $3-н тодорхойлсон шалтгаан нь ''$2''",
 'history-show-deleted' => 'Зөвхөн устгагдсаныг',
 'histfirst' => 'Эхний',
 'histlast' => 'Сүүлийн',
-'historysize' => '($1 байт)',
+'historysize' => '($1 байт)',
 'historyempty' => '(хоосон байна)',
 
 # Revision feed
@@ -972,7 +973,7 @@ $1",
 
 # Merge log
 'mergelog' => 'Нэгтгэлийн лог',
-'pagemerge-logentry' => '[[$1]]-г [[$2]] руу нэгтгэлээ ($3 хүртэлх засварууд)',
+'pagemerge-logentry' => '[[$1]]-г [[$2]] руу нэгтгэлээ ($3 хүртэлх засварууд)',
 'revertmerge' => 'Нэгтгэлийг буцаах',
 'mergelogpagetext' => 'Доорх нь нэг хуудасны түүхийг өөр түүхтэй нэгтгэсэн хамгийн сүүлийн нэгтгэлүүд юм.',
 
@@ -991,7 +992,7 @@ $1",
 'searchresults' => 'Хайлтын үр дүн',
 'searchresults-title' => '"$1" гэх хайлтын үр дүн',
 'searchresulttext' => '{{SITENAME}}-с хайх тухай дэлгэрэнгүй мэдээллийг [[{{MediaWiki:Helppage}}|{{int:help}}]] хуудаснаас авна уу.',
-'searchsubtitle' => 'Та \'\'\'[[:$1]]\'\'\' гэж хайлаа ([[Special:Prefixindex/$1|"$1-р эхлэсэн бүх хуудас]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"-д холбогдсон бүх хуудас]])',
+'searchsubtitle' => 'Та \'\'\'[[:$1]]\'\'\' гэж хайлаа ([[Special:Prefixindex/$1|"$1-р эхлэсэн бүх хуудас]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"-д холбогдсон бүх хуудас]])',
 'searchsubtitleinvalid' => "Та '''$1''' гэж хайлаа",
 'toomanymatches' => 'Хэт олон илэрц илэрлээ. Өөр үгээр хайна уу.',
 'titlematches' => 'Хуудасны гарчигтай таарсан хуудсууд',
@@ -1019,7 +1020,7 @@ $1",
 'searchprofile-images-tooltip' => 'Файлуудаас хайх',
 'searchprofile-everything-tooltip' => 'Бүх агуулгаас хайх (үүнд ярианы хуудсуудыг оролцуулах)',
 'searchprofile-advanced-tooltip' => 'Сонгосон нэрний зайнуудаас хайх',
-'search-result-size' => '$1 ($2 үг)',
+'search-result-size' => '$1 (нийт $2 үг)',
 'search-result-category-size' => '{{PLURAL:$1|1 гишүүн|$1 гишүүн}} ({{PLURAL:$2|1 дэд ангилал|$2 дэд ангилал}}, {{PLURAL:$3|1 файл|$3 файл}})',
 'search-result-score' => 'Холбоо хамаарал: $1%',
 'search-redirect' => '(чиглүүлэгч $1)',
@@ -1342,7 +1343,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 'recentchanges-label-bot' => 'Энэ засварыг бот гүйцэтгэсэн байна',
 'recentchanges-label-unpatrolled' => 'Энэ засварыг одоогийн байдлаар манаагүй байна',
 'rcnote' => "Доорх нь $5, $4-ий байдлаарх сүүлийн '''$2''' өдрийн турших '''$1''' засвар юм.",
-'rcnotefrom' => "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэл харуулагдсан) юм.",
+'rcnotefrom' => "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
 'rclistfrom' => '$1-с хойших шинэ засваруудыг үзүүлэх',
 'rcshowhideminor' => 'Бага зэргийн засваруудыг $1',
 'rcshowhidebots' => 'Роботуудыг $1',
@@ -1359,7 +1360,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 'newpageletter' => 'Ш',
 'boteditletter' => 'р',
 'number_of_watching_users_pageview' => '[$1 хэрэглэгч харж байна]',
-'rc_categories' => 'Ангиллуудад хязгаарлах ("|" тэмдгээр тусгаарлах)',
+'rc_categories' => 'Ангиллуудад хязгаарлах ("|" тэмдгээр тусгаарлана)',
 'rc_categories_any' => 'Хамаагүй',
 'rc-change-size-new' => 'Өөрчилсний дараа $1 {{PLURAL:$1|байт|байт}}',
 'newsectionsummary' => '/* $1 */ шинэ хэсэг',
@@ -1384,8 +1385,8 @@ $1 тэмдэгтээс богино байх ёстой.',
 'upload-tryagain' => 'Өөрчилсан файлын тодорхойлолтыг явуулах',
 'uploadnologin' => 'Нэвтрээгүй байна',
 'uploadnologintext' => 'Та файл оруулахын тулд [[Special:UserLogin|нэвтэрч орсон]] байх шаардлагатай.',
-'upload_directory_missing' => 'Ð\9eÑ\80Ñ\83Ñ\83лалÑ\82Ñ\8bн Ð»Ð°Ð²Ð»Ð°Ñ\85 ï¼\88$1ï¼\89 Ð¾Ð»Ð´Ð¾Ñ\85гүй Ð±Ð°Ð¹Ð³Ð°Ð° Ð±Ó©Ð³Ó©Ó©Ð´ Ð²Ñ\8dбÑ\81еÑ\80вÑ\8dÑ\80 Ò¯Ò¯Ñ\81гÑ\8dÑ\8dгүй Ð±Ð°Ð¹Ð¶ Ð¼Ð°Ð³Ð°Ð´Ð³Ò¯Ð¹ Ð±Ð°Ð¹Ð½Ð°.',
-'upload_directory_read_only' => 'Файл Ð¾Ñ\80Ñ\83Ñ\83лаÑ\85 ÐºÐ°Ñ\82алог ï¼\88$1ï¼\89 Ð½Ñ\8c Ð²Ñ\8dбÑ\81еÑ\80веÑ\80Ñ\82 Ð±Ð¸Ñ\87игдÑ\8dх боломгүй байна.',
+'upload_directory_missing' => 'Ð\90плоÑ\83д Ñ\81ан ($1) Ð¾Ð»Ð´Ð¾Ñ\85гүй Ð±Ð°Ð¹Ð³Ð°Ð° Ð±Ó©Ð³Ó©Ó©Ð´ Ð²Ñ\8dбÑ\81еÑ\80веÑ\80 Ò¯Ò¯Ð½Ð¸Ð¹Ð³ Ò¯Ò¯Ñ\81гÑ\8dж Ñ\87адÑ\81ангүй.',
+'upload_directory_read_only' => 'Ð\90плоÑ\83д Ñ\81ан ($1) Ñ\80Ñ\83Ñ\83 Ð²Ñ\8dбÑ\81еÑ\80веÑ\80 Ð±Ð¸Ñ\87их боломгүй байна.',
 'uploaderror' => 'Файл оруулахад алдаа гарлаа',
 'upload-recreate-warning' => "'''Анхаар: Тэрхүү нэртэй файл нь устгагдсан эсвэл зөөгдсөн байна..'''
 
@@ -1424,7 +1425,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 Ашиглахыг зөвлөж буй {{PLURAL:\$3|файлын төрөл|файлын төрлүүд}} нь \$2.",
 'filetype-banned-type' => "'''\".\$1\"''' нь зөвшөөрөгдөхгүй файлын төрөл байна.
 Зөвшөөрөгдөх {{PLURAL:\$3|файлын төрөл|файлын төрлүүд}} нь \$2.",
-'filetype-missing' => 'Энэ файлд өргөтгөл байхгүй байна (".jpg" гэх мэт).',
+'filetype-missing' => 'Энэ файлд өргөтгөл байхгүй байна (".jpg" гэх мэт).',
 'empty-file' => 'Таны явуулсан файл хоосон байв.',
 'file-too-large' => 'Таны явуулсан файл хэтэрхий том байв.',
 'filename-tooshort' => 'Файлын нэр хэтэрхий богино байна.',
@@ -1465,8 +1466,8 @@ $1 тэмдэгтээс богино байх ёстой.',
 Файлаа оруулахыг хүсч байвал шинэ нэр өгөөд дахин оролдоно уу.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Энэ файл нь дараах {{PLURAL:$1|файлтай|файлуудтай}} ижил байна:',
-'file-deleted-duplicate' => 'Энэ файлтай ([[:$1]]) яг ижилхэн файл урьд өмнө устгагдсан байна.
\94аÑ\85ин оруулахынхаа өмнө тэрхүү файлын устгалын түүхийг харна уу.',
+'file-deleted-duplicate' => 'Энэ файлтай ([[:$1]]) яг ижилхэн файлыг урьд өмнө устгасан байна.
\94аÑ\85иРоруулахынхаа өмнө тэрхүү файлын устгалын түүхийг харна уу.',
 'uploadwarning' => 'Хуулах үеийн анхааруулга',
 'uploadwarning-text' => 'Доорх файлын тодорхойлолтыг өөрчлөөд дахин оролдоно уу.',
 'savefile' => 'Файлыг хадгалах',
@@ -1613,7 +1614,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 [[Special:WhatLinksHere/$2|Бүтэн жагсаалт]] мөн байгаа.',
 'nolinkstoimage' => 'Энэ файлд холбогдсон хуудас байхгүй байна.',
 'morelinkstoimage' => 'Энэ файлд руух [[Special:WhatLinksHere/$1|илүү олон холбоос]] үзэх.',
-'duplicatesoffile' => 'Дараах {{PLURAL:$1|файл|$1 файл}} нь энэ файлтай яг ижилхэн байна ([[Special:FileDuplicateSearch/$2|дэлгэрэнгүй мэдээлэл]]):',
+'duplicatesoffile' => 'Дараах {{PLURAL:$1|файл|$1 файл}} нь энэ файлтай яг ижилхэн байна ([[Special:FileDuplicateSearch/$2|дэлгэрэнгүй мэдээлэл]])',
 'sharedupload' => 'Энэ файл нь $1-ийнх бөгөөд бусад төслүүдэд ашиглах боломжтой',
 'sharedupload-desc-there' => 'Энэ файл нь $1-нх бөгөөд бусад төслүүд үүнийг хэрэглэх боломжтой.
 Дэлгэрэнгүй мэдээллийг [$2 файлын тайлбарын хуудаснаас] харна уу.',
@@ -1807,8 +1808,8 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 # Special:AllPages
 'allpages' => 'Бүх хуудас',
 'alphaindexline' => '$1-с $2 хүртэл',
-'nextpage' => 'Дараагийн хуудас ($1)',
-'prevpage' => 'Өмнөх хуудас ($1)',
+'nextpage' => 'Дараагийн хуудас ($1)',
+'prevpage' => 'Өмнөх хуудас ($1)',
 'allpagesfrom' => 'Хамгийн эхэлж харуулах хуудас:',
 'allpagesto' => 'Дараах гэж дуусах хуудсуудыг үзүүлэх:',
 'allarticles' => 'Бүх хуудас',
@@ -2116,7 +2117,7 @@ $NEWPAGE
 'undeleterevdel' => 'Дээд хуудас буюу файлын засвар бага зэргээр устгагдах явдал гарах бол хуудас сэргээгдэхгүй.
 Ийм тохиолдолд та хамгийн сүүлд устгагдсан засварыг нууцлахаа, эсвэл тэмдэглэхээ болих шаардлагатай.',
 'undeletehistorynoadmin' => 'Энэ өгүүлэл устгагдсан. Үүний устгагдсан шалтгаан нь устгалын өмнө энэ хуудсыг засварласан хэрэглэгчдийн тухай мэдээллүүдтэй хамт доорх тайланд өгөгдсөн байгаа. Эдгээр устгагдсан хувилбаруудад яг юу байсныг зөвхөн администраторууд л харж чадна.',
-'undelete-revision' => '$3 хэрэглэгчийн $1-н ($2-ий байдлаарх) устгасан засвар',
+'undelete-revision' => '$3 хэрэглэгчийн засварласан $1 хуудасны ($4, $5-ийн байдлаарх) засварыг устгав.',
 'undeleterevision-missing' => 'Хүчингүй эсвэл алга болсон засвар.
 Таньд буруу холбоос байна, эсвэл засвар сэргээгдсэн, эсвэл архиваас устгагдсан байж болзошгүй.',
 'undelete-nodiff' => 'Өмнөх засвар олдсонгүй.',
@@ -2160,7 +2161,7 @@ $1',
 'contributions' => 'Хэрэглэгчийн хувь нэмэр',
 'contributions-title' => '$1 хэрэглэгчийн хувь нэмэр',
 'mycontris' => 'Миний оруулсан хувь нэмэр',
-'contribsub2' => 'Хэрэглэгчийн нэр: $1 ($2)',
+'contribsub2' => 'Хэрэглэгч: $1 ($2)',
 'nocontribs' => 'Энэ шалгуурт тохирох өөрчилсөн зүйлүүд олдсонгүй.',
 'uctop' => '(дээд)',
 'month' => 'Дараах сараас (өмнөх засварууд нь ч орно):',
@@ -2689,7 +2690,7 @@ $1',
 # Bad image list
 'bad_image_list' => 'Формат дараах байдлаар байна:
 
-Зөвхөн жагсаагдсан зүйлс (*-аар эхлэх мөрүүд) тооцогдоно.
+Зөвхөн жагсаагдсан зүйлс (*-аар эхлэх мөрүүд) тооцогдоно.
 Мөр дэх эхний линк муу файл руух холбоос байж таарна.
 Үүнтэй адил мөр дэх бусад линкүүд тооцогдохгүй. Өөрөөр хэлбэл, файлын орж болзошгүй хуудсууд юм.',
 
@@ -2699,8 +2700,8 @@ $1',
 Хэрэв энэ файл анхныхаа байдлаас өөрчлөгдсөн бол зарим мэдээлэл нь одоогийн хувилбартайгаа нийцэхгүй байж магадгүй.',
 'metadata-expand' => 'Дэлгэрэнгүй мэдээллийг харуулах',
 'metadata-collapse' => 'Дэлгэрэнгүй мэдээллийг нуух',
-'metadata-fields' => 'Энэ мэдэгдэлд байгаа EXIF мэдээллийн талбарууд мэдээллийн хүснэгт буулгагдсан үед зургын хуудсанд харагдана.
\91Ñ\83Ñ\81ад Ð½Ñ\8c Ð°Ð½Ñ\85нааÑ\81аа Ñ\85аÑ\80агдаÑ\85гүй Ð±Ð°Ð¹Ð½а.
+'metadata-fields' => 'Энэ мэдэгдэлд байгаа зурагний мэдээллийн талбарууд нь мэдээллийн хүснэгт буулгагдсан үед зургын хуудсанд харагдана.
\91Ñ\83Ñ\81дÑ\8bг Ð°Ð½Ñ\85нÑ\8b Ñ\82оÑ\85иÑ\80гоогооÑ\80 Ð½Ñ\83Ñ\83Ñ\86алÑ\81ан Ð±Ð°Ð¹Ð³Ð°а.
 * make
 * model
 * datetimeoriginal
@@ -2758,7 +2759,7 @@ $1',
 'exif-subsectimeoriginal' => 'ОгнооЦагАнхны дэдсекунд',
 'exif-subsectimedigitized' => 'ОгнооЦагДижитал дэдсекунд',
 'exif-exposuretime' => 'Гэрэл өгөх хугацаа',
-'exif-exposuretime-format' => '$1 секунд ($2)',
+'exif-exposuretime-format' => '$1 секунд ($2)',
 'exif-fnumber' => 'Харьцангуй диафрагм',
 'exif-exposureprogram' => 'Гэрэл өгөх хугацааны программ',
 'exif-spectralsensitivity' => 'Спектралийн мэдрэмтгий байдал',
@@ -3196,6 +3197,16 @@ $5
 'blankpage' => 'Хоосон хуудас',
 'intentionallyblankpage' => 'Энэхүү хуудсыг албаар хоосон үлдээв.',
 
+# External image whitelist
+'external_image_whitelist' => '#Энэ мөрийг яг хэвээр нь үлдээнэ үү<pre>
+#Доорх хэсэгт regular expression-ээр бичсэн хэсгүүдийг (//-н дунд л байх хэсэг) оруул
+#Эдгээрийг гадаад (шууд холбосон) зургуудын URL-тай тохируулах болно
+#Тохирсон бол зураг болж харагдана, үгүй бол зураг руух холбоос л гарна
+#"#"-аар эхлэсэн мөрүүдийг коммент гэж тооцоно
+#Том жижиг үсэг үл харгалзана
+
+#Дээрх хэсэгт regular expression-ээр бичсэн хэсгүүдийг оруул. Энэ мөрийг яг хэвээр нь үлдээнэ үү</pre>',
+
 # Special:Tags
 'tags' => 'Хүчинтэй өөрчлөлтийн тагууд',
 'tag-filter' => '[[Special:Tags|Тагийн]] шүүлтүүр:',
index d0c529b..5cc70ef 100644 (file)
@@ -340,7 +340,7 @@ $messages = array(
 'tog-previewontop' => 'झलक संपादन खिडकीच्या आधी दाखवा',
 'tog-previewonfirst' => 'पहिल्या संपादनानंतर झलक दाखवा',
 'tog-nocache' => 'न्याहाळकाची पान सय (कॅशिंग) अक्षम (निकमी) करा',
-'tog-enotifwatchlistpages' => 'माà¤\9dà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\80ल (नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयात à¤\85सलà¥\87लà¥\80 à¤¸à¥\82à¤\9aà¥\80) à¤ªà¤¾à¤¨ à¤¬à¤¦à¤²à¤²à¥\8dयास à¤®à¤²à¤¾ à¤\88-मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¾',
+'tog-enotifwatchlistpages' => 'माà¤\9dà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¾à¤¹à¤¾à¤£à¥\8dयात à¤\85सलà¥\87लà¥\80 à¤¸à¥\82à¤\9aà¥\80मधà¥\8dयà¥\87 à¤\85सलà¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤®à¤§à¥\8dयà¥\87 à¤¬à¤¦à¤² à¤\9dालà¥\8dयास à¤®à¤²à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dर (à¤\88-मà¥\87ल) à¤ªà¤¾à¤ à¤µà¤¾.',
 'tog-enotifusertalkpages' => 'माझ्या चर्चा पानावर बदल झाल्यास मला विरोप (ई-मेल) पाठवा',
 'tog-enotifminoredits' => 'मला छोट्या बदलांकरीता सुद्धा विरोप पाठवा',
 'tog-enotifrevealaddr' => 'सूचना विरोपात माझा विरोपाचा (ई-मेल ) पत्ता दाखवा',
@@ -356,7 +356,7 @@ $messages = array(
 'tog-watchlisthidebots' => 'पहाऱ्याच्या सूचीतून सांगकाम्यांचे बदल लपवा',
 'tog-watchlisthideminor' => 'माझ्या पहाऱ्याच्या सूचीतून छोटे बदल लपवा',
 'tog-watchlisthideliu' => 'पहाऱ्याच्या सूचीतून प्रवेश केलेल्या सदस्यांची संपादने लपवा',
-'tog-watchlisthideanons' => 'पहाâ\80\8dऱ्याच्या सूचीतून अनामिक सदस्यांची संपादने लपवा',
+'tog-watchlisthideanons' => 'नितà¥\8dय à¤ªà¤¹à¤¾à¤£्याच्या सूचीतून अनामिक सदस्यांची संपादने लपवा',
 'tog-watchlisthidepatrolled' => 'पहाऱ्याच्या सूचीतून तपासलेली संपादने लपवा',
 'tog-ccmeonemails' => 'मी इतर सदस्यांना पाठविलेल्या ई-मेल च्या प्रती मलाही माझ्या ई-मेल पत्त्यावर पाठवा',
 'tog-diffonly' => 'निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.',
@@ -516,7 +516,7 @@ $messages = array(
 'talkpage' => 'चर्चा पृष्ठ',
 'talkpagelinktext' => 'चर्चा',
 'specialpage' => 'विशेष पृष्ठ',
-'personaltools' => 'वैयक्तिक साधने',
+'personaltools' => 'वैयक्तिक साधने',
 'postcomment' => 'नवीन चर्चा',
 'articlepage' => 'लेख पृष्ठ',
 'talk' => 'चर्चा',
@@ -600,7 +600,7 @@ $1',
 'page-rss-feed' => '"$1" आर.एस.एस.रसद (RSS Feed)',
 'page-atom-feed' => '"$1" ऍटम रसद (Atom Feed)',
 'feed-atom' => 'ॲटम',
-'feed-rss' => 'आर.एस.एस.',
+'feed-rss' => 'आर.एस.एस.',
 'red-link-title' => '$1 (पान अस्तित्वात नाही)',
 'sort-descending' => 'उतरत्या क्रमाने लावा',
 'sort-ascending' => 'चढत्या क्रमाने लावा',
@@ -686,14 +686,14 @@ MySQL returned error "$3: $4".',
 'viewsourcetext' => 'तुम्ही या पानाचा स्रोत पाहू शकता व प्रत करू शकता:',
 'viewyourtext' => 'तुम्ही या पानाचे स्त्रोत पाहू शकता व प्रत करू शकता',
 'protectedinterface' => 'हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.',
-'editinginterface' => "'''सावधान:''' तुम्ही संचेतनाचे(Software) संपर्कमाध्यम मजकुर असलेले पान संपादीत करित  आहात.या पानावरील बदल इतर उपयोगकर्त्यांच्या  उपयोगकर्ता-संपर्कमाध्यमाचे स्वरूप पालटवू शकते.भाषांतरणांकरिता कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/wiki/Main_Page?setlang=mr बीटाविकि] सुविधेचा उपयोग करण्याबद्दल विचार करा.",
+'editinginterface' => "'''सावधान:''' तुम्ही संचेतनाचे (Software) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते. भाषांतरासाठी  कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/wiki/Main_Page?setlang=mr translatewiki.net] सुविधेचा उपयोग करण्याबद्दल विचार करा.",
 'sqlhidden' => 'छूपी एस्क्यूएल पृच्छा (SQL query hidden)',
 'cascadeprotected' => 'हे पान संपादनांपासून सुरक्षित केले गेलेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे, की जे पान/जी पाने शिडी पर्यायाने सुरक्षित आहेत:
 $2',
 'namespaceprotected' => "'''$1''' नामविश्वातील पाने बदलण्याची आपणांस परवानगी नाही.",
 'customcssprotected' => 'या पानावर इतर सदस्याच्या व्यक्तिगत पसंती असल्यामुळे, तुम्हाला हे सीएसएस पान संपादीत करण्याची परवानगी नाही.',
 'customjsprotected' => 'या पानावर इतर सदस्याच्या व्यक्तिगत पसंती असल्यामुळे, तुम्हाला हे JavaScript पान संपादीत करण्याची परवानगी नाही.',
-'ns-specialprotected' => 'विशà¥\87ष à¤ªà¤¾à¤¨à¥\87 à¤¸à¤\82पादà¥\80त करता येत नाहीत.',
+'ns-specialprotected' => 'विशà¥\87ष à¤ªà¤¾à¤¨à¥\87 à¤¸à¤\82पादित करता येत नाहीत.',
 'titleprotected' => "या शीर्षकाचे पान सदस्य [[User:$1|$1]]ने निर्मीत करण्यापासून सुरक्षित केलेले आहे.
 ''$2'' हे कारण नमूद केलेले आहे.",
 
@@ -785,8 +785,8 @@ $2',
 
 जर ही नोंदणी चुकीने झाली असेल तर तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.',
 'usernamehasherror' => 'सदस्यनामात "हॅश" वर्ण असू शकत नाहीत.',
-'login-throttled' => 'तुम्ही प्रवेश करण्यासाठी खूप प्रयत्न केले आहेत.
-कृपया पुन्हा प्रयत्न करण्याआधी थांबा',
+'login-throttled' => 'तुम्ही प्रवेश करण्यासाठी खूप प्रयत्न केले आहेत.
+कृपया पुन्हा प्रयत्न करण्याआधी थांबा',
 'login-abort-generic' => 'तुमचा प्रवेश अयशस्वी होऊन रद्द झाला.',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'तुमचे अदाखल होणे प्रतिबंधित झाले कारण असे दिसते की ते तुटलेल्या न्याहाळकाद्वारे पाठवले गेले.',
@@ -881,7 +881,7 @@ $2',
 'showlivepreview' => 'थेट झलक',
 'showdiff' => 'बदल दाखवा',
 'anoneditwarning' => "'''इशारा:''' तुम्ही विकिपीडियाचे सदस्य म्हणून प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंक पत्ता (आयपी) नोंदला जाईल.",
-'anonpreviewwarning' => "\"'''सावधान:''' à¤¤à¥\81मà¥\8dहà¥\80 à¤µà¤¿à¤\95िपà¥\80डियाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤®à¥\8dहणà¥\82न à¤ªà¥\8dरवà¥\87श (लà¥\89à¤\97-à¤\87न) à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80. à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¸à¤\82पादन à¤\87तिहासात à¤¤à¥\81मà¤\9aा à¤\86य.पà¥\80. à¤\85à¤\82à¤\95पतà¥\8dता (à¤\85â\80\8dà¥\85ड्रेस) नोंदला जाईल.\"",
+'anonpreviewwarning' => "\"'''सावधान:''' à¤¤à¥\81मà¥\8dहà¥\80 à¤µà¤¿à¤\95िपà¥\80डियाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤®à¥\8dहणà¥\82न à¤ªà¥\8dरवà¥\87श (लà¥\89à¤\97-à¤\87न) à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80. à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¸à¤\82पादन à¤\87तिहासात à¤¤à¥\81मà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता (à¤\86य.पà¥\80. à¥²ड्रेस) नोंदला जाईल.\"",
 'missingsummary' => "'''आठवण:''' तूम्ही संपादन सारांश पुरवलेला नाही.आपण जतन करा वर पुन्हा टीचकी मारली तर तेत्या शिवाय जतन होईल.",
 'missingcommenttext' => 'कृपया खाली प्रतिक्रीया भरा.',
 'missingcommentheader' => "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा अधोरेषा दिलेली नाही. आपण पुन्हा जतन करा अशी सूचना केली तर, तुमचे संपादन त्याशिवायच जतन होईल.",
@@ -936,7 +936,7 @@ $2',
 'noarticletext-nopermission' => 'या लेखात सध्या काहीही मजकूर नाही.
 तुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}|मथळ्याच्या शोध घेऊ शकता]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर याद्या शोधा],
 किंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}} लिहू शकता]</span>.',
-'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" à¤¸à¤¦à¤¸à¥\8dय à¤\96ातà¥\87 à¤¨à¥\8bà¤\82दà¥\80à¤\95à¥\84त à¤¨à¤¾à¤¹à¥\80.à¤\95à¥\83पया à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादà¥\80त किंवा नव्याने तयार करू इच्छिता का या बद्दल विचार करा.',
+'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" à¤¸à¤¦à¤¸à¥\8dय à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤¨à¤¾à¤¹à¥\80. à¤\95à¥\83पया à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादित किंवा नव्याने तयार करू इच्छिता का या बद्दल विचार करा.',
 'userpage-userdoesnotexist-view' => 'सदस्यखाते "$1"  हे नोंदलेले नाही.',
 'blocked-notice-logextract' => 'हा सदस्य सध्या प्रतिबंधित आहे.
 सर्वांत नवीन प्रतिबंधन यादी खाली संदर्भासाठी दिली आहे:',
@@ -1232,7 +1232,7 @@ $1",
 'searchresulttext' => '{{SITENAME}} वरील माहिती कशी शोधावी, याच्या माहिती करता पहा - [[{{MediaWiki:Helppage}}|{{SITENAME}} वर शोध कसा घ्यावा]].',
 'searchsubtitle' => 'तुम्ही \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|"$1" ने सुरू होणारी सर्व पाने]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" ला जोडणारी सर्व पाने]]) याचा शोध घेत आहात.',
 'searchsubtitleinvalid' => "तुम्ही '''$1''' या शब्दाचा शोध घेत आहात.",
-'toomanymatches' => 'à¤\96à¥\82प à¤\8fà¤\95सारà¤\96à¥\80 à¤\89तà¥\8dतरà¥\87 à¤®à¤¿à¤³à¤¾à¤²à¥\80, à¤\95à¥\83पया à¤ªà¥\83à¤\9aà¥\8dà¤\9bा à¤µà¥\87à¤\97ळà¥\8dया à¤¤à¤°à¥\8dâ\80\8dहà¥\87नà¥\87 à¤\95रà¥\82न à¤ªà¤¹à¤¾',
+'toomanymatches' => 'à¤\96à¥\82प à¤\8fà¤\95सारà¤\96à¥\80 à¤\89तà¥\8dतरà¥\87 à¤®à¤¿à¤³à¤¾à¤²à¥\80, à¤\95à¥\83पया à¤ªà¥\83à¤\9aà¥\8dà¤\9bा à¤µà¥\87à¤\97ळà¥\8dया à¤¤à¤±à¥\8dहà¥\87नà¥\87 à¤\95रà¥\82न à¤ªà¤¹à¤¾',
 'titlematches' => 'पानाचे शीर्षक जुळते',
 'notitlematches' => 'कोणत्याही पानाचे शीर्षक जुळत नाही',
 'textmatches' => 'पानातील मजकुर जुळतो',
@@ -1421,9 +1421,9 @@ $1",
 'userrights' => 'सदस्य अधिकार व्यवस्थापन',
 'userrights-lookup-user' => 'सदस्य गटांचे(ग्रूप्स) व्यवस्थापन करा.',
 'userrights-user-editname' => 'सदस्य नाव टाका:',
-'editusergroup' => 'सदस्य गट (ग्रूप्स) संपादीत करा',
+'editusergroup' => 'सदस्याचे गट संपादित करा',
 'editinguser' => "सदस्य '''[[User:$1|$1]]''' $2 चे सदस्य अधिकारात बदल केला जात आहे.",
-'userrights-editusergroup' => 'सदस्य मंडळे संपादीत करा',
+'userrights-editusergroup' => 'सदस्याचे गट संपादित करा',
 'saveusergroups' => 'सदस्य गट जतन करा',
 'userrights-groupsmember' => '(चा) सभासद:',
 'userrights-groupsmember-auto' => 'चा निर्विवाद सदस्य:',
@@ -1611,7 +1611,7 @@ $1",
 'recentchangeslinked-title' => '"$1" च्या संदर्भातील बदल',
 'recentchangeslinked-noresult' => 'जोडलेल्या पानांमध्ये दिलेल्या कालावधीत काहीही बदल झालेले नाहीत.',
 'recentchangeslinked-summary' => "हे पृष्ठ एखाद्या विशिष्ट पानाशी (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी) जोडलेल्या पानांवरील बदल दर्शवते.
-तà¥\81मà¤\9aà¥\8dया [[Special:Watchlist|पहारà¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\80ल]] à¤ªà¤¾à¤¨à¥\87 '''ठळà¤\95''' à¤¦à¤¿à¤¸à¤¤à¥\80ल.",
+तà¥\81मà¤\9aà¥\8dया [[Special:Watchlist|नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\80ल]] à¤ªà¤¾à¤¨à¥\87 '''ठळà¤\95''' à¤¦à¤¿à¤¸à¤¤à¥\80ल.",
 'recentchangeslinked-page' => 'पृष्ठ नाव:',
 'recentchangeslinked-to' => 'याऐवजी दिलेल्या पानाला जोडलेल्या पानांवरील बदल दाखवा',
 
@@ -2190,9 +2190,9 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
 'watchnologin' => 'प्रवेश केलेला नाही',
 'watchnologintext' => 'तुमची पहाऱ्याची सूची बदलायची असेल तर तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असलाच पाहीजे.',
 'addwatch' => 'पहाऱ्याच्या सूचीमध्ये टाका',
-'addedwatchtext' => '"[[:$1]]"  à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया  [[Special:Watchlist|पहाऱà¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\8dयà¥\87]] टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील पुढील बदल येथे दाखवले जातील, आणि   [[Special:RecentChanges|अलीकडील बदलांमध्ये]] पान ठळक दिसेल.
+'addedwatchtext' => '"[[:$1]]"  à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया  [[Special:Watchlist|नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80]]मधà¥\8dयà¥\87 टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील पुढील बदल येथे दाखवले जातील, आणि   [[Special:RecentChanges|अलीकडील बदलांमध्ये]] पान ठळक दिसेल.
 
-पहाऱ्याच्या सूचीतून पान काढायचे असेल तर "पहारा काढा" वर टिचकी द्या.',
+नितà¥\8dय à¤ªà¤¹à¤¾à¤£्याच्या सूचीतून पान काढायचे असेल तर "पहारा काढा" वर टिचकी द्या.',
 'removewatch' => 'पहाऱ्याच्या सूचीतून वगळा',
 'removedwatchtext' => '"[[:$1]]" पान तुमच्या [[Special:Watchlist|पहाऱ्याच्या सूची]]तून वगळण्यात आले आहे.',
 'watch' => 'पहारा',
@@ -2201,7 +2201,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
 'unwatchthispage' => 'पहारा काढून टाका',
 'notanarticle' => 'मजकुर विरहीत पान',
 'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
-'watchnochange' => 'पà¥\8dरदरà¥\8dशित à¤\95ालावाधà¥\80त, à¤¤à¥\81मà¥\8dहà¥\80 à¤ªà¤¹à¤¾à¤°à¤¾ à¤ à¥\87वलà¥\87लà¥\80 à¤\95à¥\8bणतà¥\80हà¥\80 à¤¬à¤¾à¤¬ à¤¸à¤\82पादà¥\80त झाली नाही.',
+'watchnochange' => 'पà¥\8dरदरà¥\8dशित à¤\95ालावधà¥\80त, à¤¤à¥\81मà¥\8dहà¥\80 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयासाठà¥\80 à¤ à¥\87वलà¥\87लà¥\80 à¤\95à¥\8bणतà¥\80हà¥\80 à¤¬à¤¾à¤¬ à¤¸à¤\82पादित झाली नाही.',
 'watchlist-details' => '{{PLURAL:$1|$1 पान|$1 पाने}} पहाऱ्याच्या सूचीमध्ये, चर्चा पाने मोजलेले नाहीत.',
 'wlheader-enotif' => '* विपत्र सूचना सुविधा ऊपलब्ध केली.',
 'wlheader-showupdated' => "* तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
@@ -3165,7 +3165,7 @@ $1',
 'exif-countrycreated' => 'देश ज्याच्यात चित्र घेतले',
 'exif-countrycodecreated' => 'ज्या देशात छायाचित्र घेतले त्या देशाचे कोड',
 'exif-provinceorstatecreated' => 'जिथे छायाचित्र काढले तो प्रांत वा देश',
-'exif-citycreated' => 'à¤\9bायाà¤\9aितà¥\8dर à¤\98à¥\87तलà¥\87 â\80\8dâ\80\8dâ\80\8dâ\80\8d(काढले) ते शहर',
+'exif-citycreated' => 'à¤\9bायाà¤\9aितà¥\8dर à¤\9cà¥\8dया à¤¶à¤¹à¤°à¤¾à¤¤ à¤\98à¥\87तलà¥\87 (काढले) ते शहर',
 'exif-sublocationcreated' => 'शहराज्या ज्या परिसरात छायाचित्र काढले तो परिसर',
 'exif-worldregiondest' => 'जगाचा दर्शित केलेला भूभाग(प्रदेश)',
 'exif-countrydest' => 'दर्शविलेला देश',
@@ -3275,7 +3275,7 @@ $1',
 'exif-lightsource-0' => 'अज्ञात',
 'exif-lightsource-1' => 'सूर्यप्रकाश',
 'exif-lightsource-2' => 'फ्लूरोसेंट',
-'exif-lightsource-3' => 'à¤\9fà¤\82à¤\97सà¥\8dà¤\9fà¥\8dन (à¤\87नà¤\95à¥\85नà¥\8dâ\80\8dडà¥\87सà¥\87à¤\82à¤\9f प्रकाश)',
+'exif-lightsource-3' => 'à¤\9fà¤\82à¤\97सà¥\8dà¤\9fà¥\8dन (पà¥\8dरदà¥\80पà¥\8dत प्रकाश)',
 'exif-lightsource-4' => "लख'''लखाट''' (फ्लॅश)",
 'exif-lightsource-9' => 'चांगले हवामान',
 'exif-lightsource-10' => 'ढगाळ हवामान',
@@ -3306,12 +3306,12 @@ $1',
 'exif-focalplaneresolutionunit-2' => 'इंच',
 
 'exif-sensingmethod-1' => 'अव्यक्त',
-'exif-sensingmethod-2' => 'वन à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या à¤¸à¥\87नà¥\8dâ\80\8dसर',
-'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
-'exif-sensingmethod-4' => 'थà¥\8dरà¥\80 à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या à¤¸à¥\87नà¥\8dâ\80\8dसर',
-'exif-sensingmethod-5' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87णà¥\8dशà¥\80यल à¤\8fरà¥\80या à¤¸à¥\87à¤\82सà¥\89र',
-'exif-sensingmethod-7' => 'à¤\9fà¥\8dरायà¥\8dâ\80\8dà¤\8fलिनà¥\80यर à¤¸à¥\87à¤\82सर',
-'exif-sensingmethod-8' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87à¤\82शà¥\80यल à¤²à¤¿à¤¨à¥\80यर à¤¸à¥\87नà¥\8dâ\80\8dसर',
+'exif-sensingmethod-2' => 'वन à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या à¤¸à¥\87à¤\82सर',
+'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
+'exif-sensingmethod-4' => 'थà¥\8dरà¥\80 à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या à¤¸à¥\87à¤\82सर',
+'exif-sensingmethod-5' => 'कलर सिक्वेण्शीयल एरीया सेंसर',
+'exif-sensingmethod-7' => 'ट्रायलिनीयर सेंसर',
+'exif-sensingmethod-8' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87à¤\82शà¥\80यल à¤²à¤¿à¤¨à¥\80यर à¤¸à¥\87à¤\82सर',
 
 'exif-filesource-3' => 'स्थिरचित्र  अंकीय छाउ (डिजीटल स्टील कॅमेरा)',
 
@@ -3332,11 +3332,11 @@ $1',
 'exif-scenecapturetype-2' => 'उभे',
 'exif-scenecapturetype-3' => 'रात्रीचे दृश्य',
 
-'exif-gaincontrol-0' => 'नाही',
-'exif-gaincontrol-1' => 'लà¤\98à¥\81 à¤µà¥\83दà¥\8dधà¥\80 à¤µà¤°',
-'exif-gaincontrol-2' => 'बà¥\83हतà¥\8dâ\80\8c à¤µà¥\83दà¥\8dधà¥\80 à¤µà¤°',
-'exif-gaincontrol-3' => 'लà¤\98à¥\81 à¤µà¥\83दà¥\8dधà¥\80 à¤\96ालà¥\80',
-'exif-gaincontrol-4' => 'बà¥\83हतà¥\8dâ\80\8c à¤µà¥\83दà¥\8dधà¥\80 à¤\96ालà¥\80',
+'exif-gaincontrol-0' => 'à¤\95ाहà¥\80हà¥\80 à¤¨à¤¾à¤¹à¥\80',
+'exif-gaincontrol-1' => 'दà¥\8dयà¥\81ति à¤¥à¥\8bडà¥\80 à¤µà¤¾à¤¢à¤µà¤¾',
+'exif-gaincontrol-2' => 'दà¥\8dयà¥\81ति à¤\85धिà¤\95 à¤µà¤¾à¤¢à¤µà¤¾',
+'exif-gaincontrol-3' => 'दà¥\8dयà¥\81ति à¤¥à¥\8bडà¥\80 à¤\95मà¥\80 à¤\95रा',
+'exif-gaincontrol-4' => 'दà¥\8dयà¥\81ति à¤\85धिà¤\95 à¤\95मà¥\80 à¤\95रा',
 
 'exif-contrast-0' => 'सामान्य',
 'exif-contrast-1' => 'नरम',
@@ -3524,7 +3524,7 @@ $5
 'confirm-watch-button' => 'ठीक आहे',
 'confirm-watch-top' => 'हे पान तुमच्या पहारा सूचीमध्ये टाकायचे?',
 'confirm-unwatch-button' => 'ठीक',
-'confirm-unwatch-top' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढायà¤\9aà¥\87?',
+'confirm-unwatch-top' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढायà¤\9aà¥\87?',
 
 # Multipage image navigation
 'imgmultipageprev' => '← मागील पान',
@@ -3564,18 +3564,18 @@ $5
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => '$1 {{PLURAL:$1|सेकंदाच्या|सेकंदांच्या}} आतले बदल या यादी नसण्याची शक्यता आहे.',
-'lag-warn-high' => 'विदा à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¥\8dयास à¤²à¤¾à¤\97णारà¥\8dâ\80\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 à¤®à¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} à¤¨à¤µà¥\87 à¤¬à¤¦à¤² à¤¯à¤¾ à¤¸à¥\82à¤\9aà¥\80त à¤¨ à¤¦à¤¾à¤\96वलà¥\87 à¤\9cाणà¥\8dयाà¤\9aà¥\80 à¤¶à¤\95à¥\8dयता à¤\86हà¥\87.',
+'lag-warn-high' => 'विदा à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¥\8dयास à¤²à¤¾à¤\97णाऱà¥\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 à¤®à¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} à¤¨à¤µà¥\87 à¤¬à¤¦à¤² à¤¯à¤¾ à¤¸à¥\82à¤\9aà¥\80त à¤\95दाà¤\9aित à¤¦à¤¾à¤\96वलà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\9cाणार.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'चर्चा पाने सोडून, {{PLURAL:$1|1 शीर्षक पान|$1 शीर्षक पाने}} तुमच्या पहाऱ्याच्या सूचीमध्ये आहेत.',
-'watchlistedit-noitems' => 'पहारà¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80त à¤\95à¥\8bणतà¥\87हà¥\80 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤¨ à¤¨à¥\8bà¤\82दलà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80.',
+'watchlistedit-noitems' => 'नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80त à¤\95à¥\8bणतà¥\87हà¥\80 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤¨ à¤¨à¥\8bà¤\82दलà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80.',
 'watchlistedit-normal-title' => 'पहाऱ्याची सूचीचे संपादन करा',
-'watchlistedit-normal-legend' => 'शà¥\80रà¥\8dषà¤\95पानà¥\87 à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤µà¤\97ळा',
+'watchlistedit-normal-legend' => 'शà¥\80रà¥\8dषà¤\95पानà¥\87 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढा',
 'watchlistedit-normal-explain' => 'तुमच्या पहार्‍याच्या सूचीतील अंतर्भूत नामावळी खाली निर्देशीत केली आहे. शीर्षक वगळण्याकरिता, त्या पुढील खिडकी निवडा, आणि शीर्षक वगळावर टिचकी मारा. तुम्ही [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.',
 'watchlistedit-normal-submit' => 'शिर्षक वगळा',
-'watchlistedit-normal-done' => 'तà¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤µà¤\97ळलà¥\87लà¥\80 {{PLURAL:$1|1 à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¤¿र्षके होती }}:',
-'watchlistedit-raw-title' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त à¤\95रा.',
-'watchlistedit-raw-legend' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त à¤\95रा.',
+'watchlistedit-normal-done' => 'तà¥\81मà¤\9aà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤µà¤\97ळलà¥\87लà¥\80 {{PLURAL:$1|1 à¤¶à¥\80रà¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¥\80र्षके होती }}:',
+'watchlistedit-raw-title' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित à¤\95रा',
+'watchlistedit-raw-legend' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित à¤\95रा',
 'watchlistedit-raw-explain' => 'तुमच्या पहाऱ्याच्या सूचीतील अंतर्भूत नामावली खाली निर्देशित केली आहे, एका ओळीत एक नाव या पद्धतीने; ह्या यादीतील नावे वगळून किंवा भर घालून संपादित करून नामावली अद्ययावत(परिष्कृत) करता येते.
 पहाऱ्याची सूची अद्ययावत करा येथे टिचकी मारा.
 तुम्ही [[Special:EditWatchlist|प्रस्थापित संपादकाचा उपयोग]] सुद्धा करू शकता.',
@@ -3588,7 +3588,7 @@ $5
 # Watchlist editing tools
 'watchlisttools-view' => 'सुयोग्य बदल पहा',
 'watchlisttools-edit' => 'पहाऱ्याची  सूची पहा आणि संपादित करा',
-'watchlisttools-raw' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त करा',
+'watchlisttools-raw' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित करा',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|चर्चा]])',
index c410805..fed1422 100644 (file)
@@ -858,7 +858,8 @@ Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
 'updated' => '(Dikemas kini)',
 'note' => "'''Catatan:'''",
 'previewnote' => "'''Ingatlah bahawa ini hanya pralihat.'''
-Perubahan anda belum disimpan! [[#editform|→ Terus menyunting]]",
+Perubahan anda belum disimpan!",
+'continue-editing' => 'Teruskan menyunting',
 'previewconflict' => 'Paparan ini merupakan teks di bahagian atas dalam kotak sunting teks. Teks ini akan disimpan sekiranya anda memilih berbuat demikian.',
 'session_fail_preview' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi. Sila cuba lagi. Jika masalah ini berlanjutan, [[Special:UserLogout|log keluar]] dahulu, kemudian log masuk sekali lagi.'''",
 'session_fail_preview_html' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi.'''
@@ -952,6 +953,10 @@ Argumen-argumen ini telah ditinggalkan.',
 'parser-template-loop-warning' => 'Gelung templat dikesan: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Had pengulangan templat dilebihi ($1)',
 'language-converter-depth-warning' => 'Had kedalaman penukar bahasa dilepasi ($1)',
+'node-count-exceeded-category' => 'Laman yang melebihi had kiraan nod',
+'node-count-exceeded-warning' => 'Laman terlebih kiraan nod',
+'expansion-depth-exceeded-category' => 'Laman yang melebihi had kedalaman peluasan',
+'expansion-depth-exceeded-warning' => 'Laman terlebih dalam peluasan',
 
 # "Undo" feature
 'undo-success' => 'Suntingan ini boleh dibatalkan. Sila semak perbandingan di bawah untuk mengesahkan bahawa anda betul-betul mahu melakukan tindakan ini, kemudian simpan perubahan tersebut.',
@@ -1096,7 +1101,7 @@ Mohon semak log.',
 # Suppression log
 'suppressionlog' => 'Log penahanan',
 'suppressionlogtext' => 'Berikut adalah daftar penghapusan dan sekatan yang melibatkan kandungan yang disembunyikan daripada pentadbir.
-Lihat [[Special:BlockList|senarai sekatan IP]] untuk senarai larangan dan sekatan semasa.',
+Lihat [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan sekatan semasa.',
 
 # History merging
 'mergehistory' => 'Gabungkan sejarah laman',
@@ -2033,6 +2038,11 @@ serta mungkin mempunyai maklumat lanjut mengenai buku yang anda cari:',
 'allpages-bad-ns' => '{{SITENAME}} tidak mempunyai ruang nama "$1".',
 'allpages-hide-redirects' => 'Sorokkan lencongan',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Anda sedang melihat versi dalam cache laman ini yang mungkin selama $1.',
+'cachedspecial-viewing-cached-ts' => 'Anda sedang melihat versi dalam cache laman ini yang mungkin tidak lengkap sepenuhnya.',
+'cachedspecial-refresh-now' => 'Lihat yang terkini.',
+
 # Special:Categories
 'categories' => 'Kategori',
 'categoriespagetext' => '{{PLURAL:$1|Kategori|Kategori-kategori}} berikut mengandungi laman-laman atau media.
@@ -2479,7 +2489,7 @@ dirosakkan).',
 'badipaddress' => 'Alamat IP tidak sah',
 'blockipsuccesssub' => 'Sekatan berjaya',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] telah disekat.
-<br />Sila lihat [[Special:BlockList|senarai sekatan IP]] untuk maklumat lanjut.',
+<br />Sila lihat [[Special:BlockList|senarai sekatan]] untuk menyemak sekatan.',
 'ipb-blockingself' => 'Anda akan menyekat diri sendiri! Pastikah anda mahu berbuat demikian?',
 'ipb-confirmhideuser' => 'Anda akan menyekat seorang pengguna yang menghidupkan "sorokkan pengguna". Ini akan menindaskan nama pengguna itu di semua senarai dan entri log. Pastikah anda mahu berbuat demikian?',
 'ipb-edit-dropdown' => 'Sunting sebab sekatan',
@@ -2530,9 +2540,9 @@ dirosakkan).',
 Log sekatan disediakan di bawah sebagai rujukan:',
 'blocklogentry' => 'menyekat [[$1]] sehingga $2 $3',
 'reblock-logentry' => 'menukar tetapan sekatan [[$1]] yang tamat pada $2 $3',
-'blocklogtext' => 'Ini adalah log bagi sekatan dan penyahsekatan.
-Alamat IP yang disekat secara automatik tidak disenaraikan di sini.
-Sila lihat juga [[Special:BlockList|senarai sekatan IP]] yang sedang berkuatkuasa.',
+'blocklogtext' => 'Ini adalah log bagi tindakan menyekat dan menyahsekat pengguna.
+Alamat-alamat IP yang disekat secara automatik tidak disenaraikan di sini.
+Sila lihat juga [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan sekatan yang sedang berkuatkuasa.',
 'unblocklogentry' => 'menyahsekat $1',
 'block-log-flags-anononly' => 'pengguna tanpa nama sahaja',
 'block-log-flags-nocreate' => 'pembukaan akaun dimatikan',
@@ -3618,6 +3628,11 @@ Anda patut telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING sebuah salinan bagi
 'version-software' => 'Perisian yang dipasang',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Versi',
+'version-entrypoints' => 'URL titik permulaan',
+'version-entrypoints-header-entrypoint' => 'Titik permulaan',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Laluan rencana]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Laluan skrip]',
 
 # Special:FilePath
 'filepath' => 'Laluan fail',
@@ -3806,4 +3821,15 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
 'api-error-uploaddisabled' => 'Ciri muat naik dimatikan di wiki ini.',
 'api-error-verification-error' => 'Fail ini mungkin tercemar atau tersalah sambungannya.',
 
+# Durations
+'duration-seconds' => '$1 saat',
+'duration-minutes' => '$1 minit',
+'duration-hours' => '$1 jam',
+'duration-days' => '$1 hari',
+'duration-weeks' => '$1 minggu',
+'duration-years' => '$1 tahun',
+'duration-decades' => '$1 dekad',
+'duration-centuries' => '$1 abad',
+'duration-millennia' => '$1 alaf',
+
 );
index 4a931db..68a112a 100644 (file)
@@ -934,7 +934,7 @@ Ftakar li l-paġni .css u .js personalizzati għandhom l-ewwel ittra tat-titlu 
 'updated' => '(Aġġornata)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Ftakar li din hija biss dehra proviżorja.'''
-It-tibdiliet tiegħek għadhom ma ġewx salvati! [[#editform|→ Kompli immodifika]]",
+It-tibdiliet tiegħek għadhom ma ġewx salvati!",
 'previewconflict' => "Din il-previżjoni turi l-kliem li jinsab fiż-żona ta' modifika superjuri u turi kif tidher kieku l-paġna kella tiġi modifikata.",
 'session_fail_preview' => "'''Jiddispjaċina imma l-modifika tiegħek ma setgħetx tiġi pproċessata minħabba li ntilfet l-informazzjoni tas-sessjoni.
 Jekk jogħġbok, erġa' pprova. Jekk xorta tibqa' ma taħdimx, ipprova [[Special:UserLogout|oħroġ]] u erġa' idħol.'''",
index 990892b..199d030 100644 (file)
@@ -480,7 +480,8 @@ Tu puodes [[Special:Search/{{PAGENAME}}|percurar pul títalo desta páigina]] no
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} percurar ls registros que téngan a ber],
 ó [{{fullurl:{{FULLPAGENAME}}|action=edit}} eiditar esta páigina]</span>.',
 'note' => "'''Abiso:'''",
-'previewnote' => "'''Esto ye solo ua amostra; las altaraçones inda nun fúrun grabadas!'''",
+'previewnote' => "'''Lhembra-te qu'esto ye solo ua amostra.'''
+Las altaraçones inda nun fúrun grabadas!",
 'editing' => 'A eiditar $1',
 'editingsection' => 'A eiditar $1 (cacho)',
 'yourtext' => 'L tou testo',
index 8f4e6a0..4b54083 100644 (file)
@@ -690,7 +690,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 {{FULLPAGENAME}}|action=edit}} витнемс-петнемс те лопанть]</span>.',
 'updated' => '(Одолгавтозь)',
 'note' => "'''Явт мель:'''",
-'previewnote' => "'''Те - ансяк васнянь невтевкс; полавтоматне зярс апак вансто!'''",
+'previewnote' => "'''Кирдть мельсэ, Те ансяк васнянь невтевкс.'''
+Полавтоматне зярс апак вансто!",
 'editing' => 'Витнят-петнят $1',
 'editingsection' => 'Витнеме-петнеме $1 (секциянть)',
 'editingcomment' => 'Витнят-петнят $1 (од явкс)',
@@ -896,7 +897,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'prefs-personal' => 'Теицядо',
 'prefs-rc' => 'Чиень полавтнемат',
 'prefs-watchlist' => 'Ванома лемрисьме',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}',
 'prefs-watchlist-edits-max' => 'Весемеде покш цётось: 1000',
 'prefs-misc' => 'Минеть-сюнот',
 'prefs-resetpass' => 'Салава валонь полавтома',
@@ -1011,7 +1012,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'right-mergehistory' => 'Вейтьсэндямс лопатнень юрост-путовксост',
 'right-userrights' => 'Витнемс-петнемс совицянь весе видечитнень',
 'right-siteadmin' => 'Датабазань сёлгомо ды панжомо',
-'right-passwordreset' => 'Ð\9bиÑ\8fлгавÑ\82омÑ\81 Ñ\82еиÑ\86Ñ\8fнÑ\8c Ñ\81овамо Ð²Ð°Ð» ([[Special:PasswordReset|баÑ\88ка Ð»Ð¾Ð¿Ð°]])',
+'right-passwordreset' => 'Ð\92аномÑ\81 Ñ\82еиÑ\86Ñ\8fнÑ\8c Ñ\81алава Ð²Ð°Ð»Ð¾Ð½Ñ\8c Ð¿Ð¾Ð»Ð°Ð²Ñ\82ома Ðµ-Ñ\81Ñ\91Ñ\80маÑ\82',
 
 # User rights log
 'rightslog' => 'Уськетеицянть видечинть кемекстома',
@@ -1036,9 +1037,14 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'action-deleterevision' => 'нардамс те лиякстомтоманть',
 'action-browsearchive' => 'вешнемс нардань лопатнестэ',
 'action-undelete' => 'вельмевтемс мекев те лопанть',
+'action-suppressionlog' => 'ваномс те теицянть тевнеде сёрмадовкс',
+'action-block' => 'кардамс те совицянть витнемадо-петнемадо',
 'action-import' => 'совавтомс те лопанть лия Викистэ',
 'action-importupload' => 'совавтомс те лопанть файлань йовкстамо юртсто',
 'action-mergehistory' => 'вейтьсэндямс те лопанть юронзо-путовксонзо',
+'action-userrights' => 'витнемс-петнемс совицянь весе видечитнень',
+'action-userrights-interwiki' => 'витнемс-петнемс лия викитнесэ теицянь видечитнень',
+'action-sendemail' => 'кучомс е-сёрмат',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|полавтнема|полавтнемат}}',
@@ -1088,6 +1094,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'uploadnologin' => 'Эзить сова',
 'uploaderror' => 'Йовкстамсто манявома',
 'upload-permitted' => 'Файлань форматт, конат меревить: $1.',
+'upload-preferred' => 'Файлань типт, конатне паро мельсэ учовить: $1.',
+'upload-prohibited' => 'Файлань типт, конатне кардазь: $1.',
 'uploadlog' => 'Файлань йовкстамодо журнал',
 'uploadlogpage' => 'Файлань йовкстамодо журнал',
 'filename' => 'Файлань лем',
@@ -1123,12 +1131,23 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'upload-options' => 'Йовкстамонь параметрат',
 'watchthisupload' => 'Ваномс те лопанть мельга',
 'upload-success-subj' => 'Совавтовсь кода эряви',
+'upload-failure-subj' => 'Ёвкстамосо стакачи',
+'upload-warning-subj' => 'Ёвкстамодо кардамонь пачтямо',
 
 'upload-proto-error' => 'Аволь истямо протокол',
 'upload-file-error' => 'Потмонь ильведькс',
 'upload-misc-error' => 'Файлань ёвкстамонь апак содань ильведевкс',
 'upload-too-many-redirects' => 'URL адрессэнть пек ламо печтевтемат',
 'upload-unknown-size' => 'Апак содань покшолмазо',
+'upload-http-error' => 'Лиссь HTTP ильведевкс: $1',
+
+# File backend
+'backend-fail-backup' => '$1 файланть эйстэ тееве ванстовкс копия',
+'backend-fail-delete' => '"$1" файлась эзь нардаво.',
+'backend-fail-store' => '$1 файлась эзь ванстово $2 янонтень.',
+'backend-fail-move' => '$1 файлась эзь печтевтеве $2 файлакс.',
+'backend-fail-read' => '"$1" файлась эзь ловново.',
+'backend-fail-create' => '"$1" файлась эзь шкаво.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Совамось кардазь',
@@ -1239,7 +1258,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'statistics-users-active' => 'Чистэ лисийть-совийть',
 'statistics-mostpopular' => 'Весемеде сеедьстэ ванозь лопат',
 
-'disambiguations' => 'Лопат, конат сёрмадстовтовить ламосмустев терминтт',
+'disambiguations' => 'Лопат, конатне сюлмазь чарькодевтемань ламо терминэнь лопас',
 'disambiguationspage' => 'Template:смустень коряс явома',
 
 'doubleredirects' => 'Кавксть ютавтозь',
@@ -1312,8 +1331,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'booksources-go' => 'Адя',
 
 # Special:Log
-'specialloguserlabel' => 'Теицясь:',
-'speciallogtitlelabel' => 'Ð\9aонÑ\8fкÑ\81озо:',
+'specialloguserlabel' => 'ТопавÑ\82Ñ\8bцясь:',
+'speciallogtitlelabel' => 'Ð\9dоÑ\80авомаÑ\82аÑ\80ка (конÑ\8fкÑ\81озо Ñ\8dли Ñ\82еиÑ\86Ñ\8fзо):',
 'log' => 'Совамо-лисема тевть (регистрациясь)',
 'all-logs-page' => 'Весемень туртов весе совамодо-кемекстамодо журналт',
 'logempty' => 'Сови-лиси журналсто а муевить тень марто вейкеть тевть',
@@ -1346,7 +1365,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'sp-deletedcontributions-contribs' => 'путовксонзо',
 
 # Special:LinkSearch
-'linksearch' => 'Ушонь сюлмавомапенеть',
+'linksearch' => 'Ушо ёндонь сюлмавомапенень вешнема',
 'linksearch-pat' => 'Вешнемкс парцун:',
 'linksearch-ns' => 'Лем потмозо:',
 'linksearch-ok' => 'Вешнэмс',
@@ -1378,8 +1397,10 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'mailnologin' => 'Кучомс сёрма парго арась',
 'emailuser' => 'Кучомс е-сёрма те теицянтень',
 'emailpage' => 'Кучт э-сёрма теицянтень',
-'defemailsubject' => '{{SITENAME}} е-сёрма',
+'defemailsubject' => '{{SITENAME}} е-сёрма "$1"-нь пельде',
+'usermaildisabled' => 'Теицянь е-сёрмась пекстазь',
 'noemailtitle' => 'Е-сёрма парго арась',
+'emailusername' => 'Теицянь леметь:',
 'emailusernamesubmit' => 'Максомс',
 'emailfrom' => 'Кинь пельде:',
 'emailto' => 'Кинень:',
@@ -1394,6 +1415,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'watchlist' => 'Мезе мельга мон ванстнян',
 'mywatchlist' => 'Мезе мельга мон ванстнян',
 'watchlistfor2' => '$1-нь туртов $2',
+'nowatchlist' => 'Ванома керьксэзэть мезеяк апак путо.',
 'watchnologin' => 'Апак сова',
 'addedwatchtext' => 'Лопась «[[:$1]]» совавтозь [[Special:Watchlist|ванома потмозот]].
 Седе тов те лопасонть ды мартонзо сюлмавозь кортнема лопасонть теезь витьнематне тешкставтовить те потмонтень, истяжо кармить кикстазь те лопасонть[[Special:RecentChanges|потмо од витнематне]], истя седе шождасто сынь неявить.',
@@ -1517,6 +1539,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 # Namespace form on various pages
 'namespace' => 'Лем потмозо:',
 'invert' => 'Кочказень таркас апаконь кочкамо',
+'namespace_association' => 'Мартонзо сюлмазь лемпотмо',
 'blanknamespace' => '(Прявкс)',
 
 # Contributions
@@ -1572,6 +1595,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'ipboptions' => '2 част:2 hours,1 чи:1 day,3 чить:3 days,1 тарго:1 week,2 таргот:2 weeks,1 ков:1 month,3 ковт:3 months,6 ковт:6 months,1 ие:1 year,певтеме:infinite',
 'ipbotheroption' => 'лия',
 'ipbotherreason' => 'Лия/поладкс тувтал:',
+'ipb-confirm' => 'Кемекстамс саймес саеманть',
 'badipaddress' => 'Амаштовикс IP адрес',
 'blockipsuccesssub' => 'Саймес озавтовсь',
 'ipb-edit-dropdown' => 'Витнемс-петнемс саймес озавтомань тувталтнэнь',
@@ -1580,6 +1604,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'ipb-blocklist-contribs' => '$1 лопас путовкст',
 'unblockip' => 'Нолдамс теицянть сайместэ',
 'ipusubmit' => 'Нардамс те саймас аравтоманть',
+'blocklist' => 'Саймес саень теицят',
 'ipblocklist' => 'Саймес саень теицят',
 'ipblocklist-legend' => 'Вешнемс саймас саезь теиця',
 'blocklist-target' => 'Норовамо тарка',
@@ -1655,7 +1680,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'revertmove' => 'велявтодо',
 'delete_and_move' => 'Нардык ды печтевтик',
 'delete_and_move_confirm' => 'Нардыка те лопанть',
-'delete_and_move_reason' => 'Печтевтемга нардазь',
+'delete_and_move_reason' => '«[[$1]]» нардазель од таркань теемга',
 'immobile-source-namespace' => '"$1" лемпотмосонть лопатне а печтевтевить',
 'immobile-target-namespace' => '"$1" лемпотмонтень лопатне а печтевтевить',
 'immobile-source-page' => 'Те лопась одокс а лемдеви.',
@@ -1922,8 +1947,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'exif-orientation-1' => 'Свалшкань',
 'exif-orientation-3' => 'Велявтомс 180°',
 'exif-orientation-5' => 'Чаравтозь 90° чинь каршо, мейле велявтозь прянзо лангс',
-'exif-orientation-6' => 'ЧаÑ\80авÑ\82озÑ\8c 90° Ñ\87и Ð¼ÐµÐ»Ñ\8cга',
-'exif-orientation-8' => 'Чаравтозь 90° чинь каршо',
+'exif-orientation-6' => 'ЧаÑ\80авÑ\82озÑ\8c 90° Ñ\87и ÐºÐ°Ñ\80Ñ\88о',
+'exif-orientation-8' => 'Чаравтозь 90° чи мельга',
 
 'exif-componentsconfiguration-0' => 'арась',
 
@@ -2169,4 +2194,13 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 # New logging system
 'newuserlog-byemail' => 'салава валот кучозь е-сёрмасо',
 
+# Feedback
+'feedback-subject' => 'Мезде:',
+'feedback-message' => 'Пачтямнэсь:',
+'feedback-cancel' => 'А теемс',
+'feedback-close' => 'Анок',
+
+# API errors
+'api-error-unknownerror' => 'Апак содань ильведевкс: «$1».',
+
 );
index f4377de..6261670 100644 (file)
@@ -27,7 +27,7 @@ $messages = array(
 'tog-underline' => 'Liân-kiat oē té-sûn:',
 'tog-justify' => 'pâi-chê  tōaⁿ-lo̍h',
 'tog-hideminor' => 'Am chòe-kīn ê sió kái-piàn',
-'tog-hidepatrolled' => 'Am chòe-kīn sûn koè--ê  kái-piàn',
+'tog-hidepatrolled' => '最近改的,若巡過就掩掉',
 'tog-newpageshidepatrolled' => 'Sin-ia̍h ê chheng-toaⁿ am sûn koè--ê',
 'tog-extendwatchlist' => 'Tián-khui kàm-sī-toaⁿ khoàⁿ só͘-ū ê kái-piàn, m̄-chí sī choè-kīn--ê',
 'tog-usenewrc' => 'Ēng ka-kiông pán khoàⁿ chòe-kīn ê kái-piàn (su-iàu JavaScript)',
@@ -155,7 +155,7 @@ $messages = array(
 'article' => 'Loē-iông ia̍h',
 'newwindow' => '(ē khui sin thang-á hián-sī)',
 'cancel' => 'Chhú-siau',
-'moredotdotdot' => 'Iáu-ū',
+'moredotdotdot' => '猶有',
 'mypage' => 'Góa ê ia̍h',
 'mytalk' => 'Góa ê thó-lūn',
 'anontalk' => 'Chit ê IP ê thó-lūn-ia̍h',
@@ -359,7 +359,7 @@ Che it-poaⁿ sī in-ūi koè-sî ê cheng-chha ia̍h sī le̍k-sú liân-kiat 
 Nā m̄-sī hit chióng chêng-hêng, lí khó-lêng tú tio̍h nńg-thé ê chhò-ngō͘. Chhiáⁿ pò hō͘ chi̍t ūi [[Special:ListUsers/sysop|koán-lí-goân]], ūi liân-kiat hiâ khì lâu thong-ti .',
 'missingarticle-rev' => '(修訂本#: $1)',
 'missingarticle-diff' => '(精差:$1, $2)',
-'readonly_lag' => '資料庫已經自動鎖牢咧,從屬資料庫伺服器當咧更新綴到主伺服器',
+'readonly_lag' => '佇附屬資料庫伺服器對主伺服器來更新的時陣,資料庫就已經自動鎖牢咧。',
 'internalerror' => 'Loē-pō͘ ê chhò-ngō͘',
 'internalerror_info' => 'Loē-pō͘ ê chhò-ngō͘: $1',
 'fileappenderrorread' => 'Ka-ji̍p(append) ê sî bô-hoat-tō͘ thak "$1".',
@@ -688,7 +688,8 @@ Kháu-chō ê sin bi̍t-bé thang tī teng-ji̍p liáu tī ''[[Special:ChangePas
 'updated' => '(改過矣)',
 'note' => "'''Chù-ì:'''",
 'previewnote' => "'''Thê-chhéⁿ lí, che chí-sī  hō͘ lí sian khoàⁿ chi̍t-ē.'''
-Lí kái--ê iáu-bōe pó-chûn--khí-lâi ![[#editform|→kè-sio̍k pian-chi̍p]]",
+Lí kái--ê iáu-bōe pó-chûn--khí-lâi !",
+'continue-editing' => '繼續編輯',
 'previewconflict' => '這个先看覓會反應你文字編輯區的內容,顯示佇面頂。佇你保存了就會公開。',
 'session_fail_preview' => "'''Pháiⁿ-sè! Gún chiām-sî bô hoat-tō͘ chhú-lí lí ê pian-chi̍p (goân-in: \"phàng-kiàn sú-iōng kî-kan ê chu-liāu\"). Lô-hoân têng chhì khoàⁿ-māi. Ká-sú iû-goân bô-hāu, ē-sái teng-chhut koh-chài teng-ji̍p hoān-sè tō ē-tit kái-koat.'''",
 'session_fail_preview_html' => "'''歹勢!因為phàng見資料,阮無法度處理你的編輯。'''
@@ -923,8 +924,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => '隱藏記錄',
-'suppressionlogtext' => '下跤是管理員為著隱藏文章所做的刣掉抑封鎖的清單。
-若欲看這馬禁止使用、封鎖的清單,請看[[Special:BlockList|IP封鎖清單]]。',
+'suppressionlogtext' => '下跤是管理員為著藏文章所做的刣掉,抑封鎖的清單。
+若欲看這馬禁止使用、封鎖的清單,請看[[Special:BlockList|封鎖清單]]。',
 
 # History merging
 'mergehistory' => '合併兩个頁的修改歷史:',
@@ -1374,13 +1375,13 @@ Tī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--
 
 這頁有刣掉佮徙走的記錄通參考:",
 'uploadtext' => "用下跤的表來共檔案上載。
-若欲看抑是揣往過上載的檔案,會使進入[[Special:FileList|檔案上載清單]],(重)上載嘛會記錄佇[[Special:Log/upload|上傳記錄]],若刣掉就會記錄佇[[Special:Log/delete|刪除記錄]]。
+若欲看,抑是揣往過上載的檔案,會使入去[[Special:FileList|檔案上載清單]]。上載嘛會記錄佇[[Special:Log/upload|上載記錄]],若刣掉就會記錄佇[[Special:Log/delete|刣掉記錄]]。
 
-若欲佇頁加入檔案,用下跤的一種方式來連結:
+上載後,若欲佇頁加入檔案,會使用下跤的一種方式來連結:
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''使用檔案的完整版本
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替換文字]]</nowiki></tt>'''用一个囥佇倒爿的一个200 像素圖相框,「替換文字」做說明
 * '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''直接連結到檔案,毋過無顯示檔案",
-'upload-permitted' => '准許的檔案類型: $1',
+'upload-permitted' => '通用的檔案類型: $1',
 'upload-preferred' => '建議的檔案類型: $1',
 'upload-prohibited' => '禁止的檔案類型: $1。',
 'uploadlog' => '上載記錄',
@@ -1870,6 +1871,11 @@ Chhiáⁿ chù-ì: kî-thaⁿ ê bāng-chām ū khó-lêng iōng URL ti̍t-chiap
 'allpages-bad-ns' => '佇{{SITENAME}}無"$1"這个名空間。',
 'allpages-hide-redirects' => '掩轉頁',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => '你當咧看這頁的快取(cached)版本,彼可能是第$1舊的。',
+'cachedspecial-viewing-cached-ts' => '你當咧看這頁的快取版本,彼可能佮這馬的無仝款。',
+'cachedspecial-refresh-now' => '看上新。',
+
 # Special:Categories
 'categories' => 'Lūi-pia̍t',
 'categoriespagetext' => 'Ē-kha {{PLURAL:$1| ê ūi-pia̍t|ê ūi-pia̍t}} ū ia̍h ia̍h-sī mûi-thé.
@@ -2312,7 +2318,7 @@ $1',
 'ipb-confirm' => '確定封鎖',
 'badipaddress' => 'Bô-hāu ê IP chū-chí',
 'blockipsuccesssub' => 'Hong-só sêng-kong',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] í-keng pī hong-só. <br />Khì [[Special:BlockList|IP hong-só lia̍t-toaⁿ]] review hong-só ê IP.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] í-keng pī hong-só. <br />Khì [[Special:BlockList|hong-só lia̍t-toaⁿ]] thang khoàⁿ pī hong-só ê .',
 'ipb-blockingself' => '你欲封鎖你家己!你敢確定欲按呢做?',
 'ipb-confirmhideuser' => '你是欲封鎖一个用者佮隱藏伊的用者名稱,這會隱藏用者名稱出現佇所有的表佮記錄的項目當中,你敢確定欲按呢做?',
 'ipb-edit-dropdown' => '編輯封鎖的理由',
@@ -2365,7 +2371,7 @@ $1 ê kìm-chí lí-iû sī in-ūi "$2".',
 下跤有封鎖的記錄會當參考:',
 'blocklogentry' => 'hong-só [[$1]], siat kî-hān chì $2 $3',
 'reblock-logentry' => '改[[$1]]的封鎖到期時間 $2 $3',
-'blocklogtext' => 'Chit-ê log lia̍t-chhut block/unblock ê tōng-chok. Chū-tōng block ê IP chū-chí bô lia̍t--chhut-lâi ([[Special:BlockList]] ū hiān-chú-sî ū-hāu ê block/ban o·-miâ-toaⁿ).',
+'blocklogtext' => 'Chit-ê kì-lio̍k lia̍t-chhut hong-só/khui-só ê tōng-chok. Chū-tōng block ê IP tē-chí bô lia̍t--chhut-lâi ([[Special:BlockList|hong-só chheng-toaⁿ]] ū hiān-chú-sî ū-hāu ê kìm-chí hong-só o·-miâ-toaⁿ).',
 'unblocklogentry' => '解除封鎖$1',
 'block-log-flags-anononly' => '只會當是無名氏用者',
 'block-log-flags-nocreate' => 'Khui kháu-chō thêng-iōng ah',
@@ -3410,6 +3416,9 @@ MediaWiki是為著使用的目的才發佈,毋過無負任何擔保責任;
 'version-software' => '已經安裝的軟體',
 'version-software-product' => '產品',
 'version-software-version' => '版本',
+'version-entrypoints' => '進入點網址',
+'version-entrypoints-header-entrypoint' => '進入點',
+'version-entrypoints-header-url' => '網址',
 
 # Special:FilePath
 'filepath' => 'Tóng-àn ê soàⁿ-lō·',
@@ -3598,4 +3607,15 @@ MediaWiki是為著使用的目的才發佈,毋過無負任何擔保責任;
 'api-error-uploaddisabled' => '佇這个Wiki袂當上載。',
 'api-error-verification-error' => '這个檔案可能已經毀掉,抑是檔案尾仔名稱毋著。',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|秒|秒}}',
+'duration-minutes' => '$1 {{PLURAL:$1|分鐘|分鐘}}',
+'duration-hours' => '$1 {{PLURAL:$1|點鐘|點鐘}}',
+'duration-days' => '$1 {{PLURAL:$1|工|工}}',
+'duration-weeks' => '$1 {{PLURAL:$1|禮拜|禮拜}}',
+'duration-years' => '$1 {{PLURAL:$1|冬|冬}}',
+'duration-decades' => '$1 {{PLURAL:$1|十冬|十冬}}',
+'duration-centuries' => '$1 {{PLURAL:$1|百年|百年}}',
+'duration-millennia' => '$1 {{PLURAL:$1|千年|千年}}',
+
 );
index b9b35a8..08bf37a 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Annabel
+ * @author AvatarTeam
  * @author B4bol4t
  * @author DasRakel
  * @author Effeietsanders
@@ -376,8 +377,8 @@ $messages = array(
 'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische verwijzing)',
 'tog-externaleditor' => 'Standaard een externe tekstbewerker gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
 'tog-externaldiff' => 'Standaard een extern vergelijkingsprogramma gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-showjumplinks' => '“ga naar”-toegankelijkheidsverwijzingen inschakelen',
-'tog-uselivepreview' => '“live voorvertoning” gebruiken (vereist JavaScript – experimenteel)',
+'tog-showjumplinks' => '"ga naar"-toegankelijkheidsverwijzingen inschakelen',
+'tog-uselivepreview' => '"live voorvertoning" gebruiken (vereist JavaScript – experimenteel)',
 'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
 'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
 'tog-watchlisthidebots' => 'Botbewerkingen op mijn volglijst verbergen',
@@ -457,9 +458,9 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorie|Categorieën}}',
-'category_header' => 'Pagina’s in categorie “$1”',
+'category_header' => 'Pagina’s in categorie "$1"',
 'subcategories' => 'Ondercategorieën',
-'category-media-header' => 'Media in categorie “$1”',
+'category-media-header' => 'Media in categorie "$1"',
 'category-empty' => "''Deze categorie bevat geen pagina’s of media.''",
 'hidden-categories' => 'Verborgen {{PLURAL:$1|categorie|categorieën}}',
 'hidden-category-category' => 'Verborgen categorieën',
@@ -521,7 +522,7 @@ $messages = array(
 'searchbutton' => 'Zoeken',
 'go' => 'OK',
 'searcharticle' => 'OK',
-'history' => 'Paginageschiedenis',
+'history' => 'Geschiedenis',
 'history_short' => 'Geschiedenis',
 'updatedmarker' => 'bewerkt sinds mijn laatste bezoek',
 'printableversion' => 'Printervriendelijke versie',
@@ -630,8 +631,8 @@ Meer informatie is beschikbaar op de pagina [[Special:Version|softwareversie]].'
 'feed-unavailable' => 'Syndicatiefeeds zijn niet beschikbaar',
 'site-rss-feed' => '$1 RSS-feed',
 'site-atom-feed' => '$1 Atom-feed',
-'page-rss-feed' => '“$1” RSS-feed',
-'page-atom-feed' => '“$1” Atom-feed',
+'page-rss-feed' => '"$1" RSS-feed',
+'page-atom-feed' => '"$1" Atom-feed',
 'red-link-title' => '$1 (de pagina bestaat niet)',
 'sort-descending' => 'Aflopend sorteren',
 'sort-ascending' => 'Oplopend sorteren',
@@ -665,14 +666,14 @@ Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|{{in
 Mogelijk zit er een fout in de software.
 Het laatste verzoek aan de database was:
 <blockquote><tt>$1</tt></blockquote>
-vanuit de functie “<tt>$2</tt>”.
-De database gaf de volgende foutmelding “<tt>$3: $4</tt>”.',
+vanuit de functie "<tt>$2</tt>".
+De database gaf de volgende foutmelding "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
 Het laatste verzoek aan de database was:
-“$1”
-vanuit de functie “$2”.
-De database gaf de volgende foutmelding: “$3: $4”',
-'laggedslavemode' => "'''Waarschuwing:''' de pagina kan verouder zijn.",
+"$1"
+vanuit de functie "$2".
+De database gaf de volgende foutmelding: "$3: $4"',
+'laggedslavemode' => "'''Waarschuwing:''' in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
 'readonly' => 'Database geblokkeerd',
 'enterlockreason' => 'Geef een reden op voor de blokkade en geef op wanneer die waarschijnlijk wordt opgeheven',
 'readonlytext' => 'De database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud. Na afronding wordt de functionaliteit hersteld.
@@ -694,7 +695,7 @@ Maak hiervan melding bij een [[Special:ListUsers/sysop|beheerder]] van {{SITENAM
 'filecopyerror' => 'Bestand "$1" kon niet naar "$2" gekopieerd worden.',
 'filerenameerror' => '"$1" kon niet hernoemd worden naar "$2".',
 'filedeleteerror' => 'Bestand "$1" kon niet verwijderd worden.',
-'directorycreateerror' => 'Map “$1” kon niet aangemaakt worden.',
+'directorycreateerror' => 'De map "$1" kon niet aangemaakt worden.',
 'filenotfound' => 'Bestand "$1" kon niet gevonden worden.',
 'fileexistserror' => 'Schrijven naar bestand "$1" onmogelijk: het bestand bestaat al.',
 'unexpected' => 'Onverwachte waarde: "$1"="$2".',
@@ -705,7 +706,7 @@ Mogelijk is deze al door iemand anders verwijderd.',
 'cannotdelete-title' => 'Pagina "$1" kan niet verwijderd worden',
 'badtitle' => 'Ongeldige paginanaam',
 'badtitletext' => 'De naam van de opgevraagde pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikinaamverwijzing.
-Wellicht bevat de paginanaam niet toegestane karakters.',
+Wellicht bevat de paginanaam niet toegestane tekens.',
 'perfcached' => 'Deze gegevens komen uit een cache en zijn mogelijk niet actueel. Er {{PLURAL:$1|is maximaal één resultaat|zijn maximaal $1 resultaten}} beschikbaar in de cache.',
 'perfcachedts' => 'Deze gegevens komen uit een cache die voor het laatst is bijgewerkt op $2 om $3. Er {{PLURAL:$4|is maximaal één resultaat|zijn maximaal $4 resultaten}} beschikbaar in de cache.',
 'querypage-no-updates' => 'Deze pagina wordt niet bijgewerkt.
@@ -724,7 +725,7 @@ Bewerken is niet mogelijk.',
 'viewsourcetext' => 'U kunt de brontekst van deze pagina bekijken en kopiëren:',
 'viewyourtext' => "U kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
 'protectedinterface' => 'Deze pagina bevat tekst voor berichten van de software en is beveiligd om misbruik te voorkomen.',
-'editinginterface' => "'''Waarschuwing:''' U bewerkt een pagina die interfacetekst voor de software bevat.
+'editinginterface' => "'''Waarschuwing:''' u bewerkt een pagina die interfacetekst voor de software bevat.
 Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen.
 Overweeg voor vertalingen om [//translatewiki.net/wiki/Main_Page?setlang=nl translatewiki.net] te gebruiken, het vertaalproject voor MediaWiki.",
 'sqlhidden' => '(SQL-zoekopdracht verborgen)',
@@ -850,7 +851,7 @@ Het wachtwoord voor "$2" is "$3".
 Meld u aan en wijzig uw wachtwoord.
 
 Negeer dit bericht als deze gebruiker zonder uw medeweten is aangemaakt.',
-'usernamehasherror' => 'Een gebruikersnaam mag het karakter hekje ("#") niet bevatten.',
+'usernamehasherror' => 'Een gebruikersnaam mag het teken hekje ("#") niet bevatten.',
 'login-throttled' => 'U hebt recentelijk te vaak geprobeerd aan te melden met een onjuist wachtwoord.
 Wacht even voordat u het opnieuw probeert.',
 'login-abort-generic' => 'U bent niet aangemeld. De procedure is afgebroken.',
@@ -961,7 +962,7 @@ Uw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt.",
 'missingsummary' => "'''Herinnering:''' u hebt geen bewerkingssamenvatting opgegeven.
 Als u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
 'missingcommenttext' => 'Plaats uw opmerking hieronder.',
-'missingcommentheader' => "'''Let op:''' U hebt geen onderwerp/kop voor deze opmerking opgegeven.
+'missingcommentheader' => "'''Let op:''' u hebt geen onderwerp/kop voor deze opmerking opgegeven.
 Als u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
 'summary-preview' => 'Bewerkingssamenvatting nakijken:',
 'subject-preview' => 'Onderwerp/kop nakijken:',
@@ -1031,10 +1032,10 @@ De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergege
 * '''Firefox / Safari:''' houd ''Shift'' ingedrukt terwijl u op ''Vernieuwen'' klikt of druk op ''Ctrl-F5'' of ''Ctrl-R'' (''⌘-Shift-R'' op een Mac)
 * '''Google Chrome:''' druk op ''Ctrl-Shift-R'' (''⌘-Shift-R'' op een Mac)
 * '''Internet Explorer:''' houd ''Ctrl'' ingedrukt terwijl u op ''Vernieuwen'' klikt of druk op ''Ctrl-F5''
-* '''Konqueror: '''klik op ''Reload'' of druk op ''F5''
+* '''Konqueror:''' klik op ''Reload'' of druk op ''F5''
 * '''Opera:''' leeg uw cache in ''Extra → Voorkeuren''",
-'usercssyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om uw nieuwe CSS te testen alvorens op te slaan.",
-'userjsyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om uw nieuwe JavaScript te testen alvorens op te slaan.",
+'usercssyoucanpreview' => "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe CSS te testen alvorens op te slaan.",
+'userjsyoucanpreview' => "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe JavaScript te testen alvorens op te slaan.",
 'usercsspreview' => "'''Dit is alleen een voorvertoning van uw persoonlijke CSS.'''
 '''Deze is nog niet opgeslagen!'''",
 'userjspreview' => "'''Let op: u test nu uw persoonlijke JavaScript.'''
@@ -1048,7 +1049,8 @@ Uw eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns
 'updated' => '(Bijgewerkt)',
 'note' => "'''Opmerking:'''",
 'previewnote' => "'''Let op: dit is een controlepagina.'''
-Uw tekst is niet opgeslagen! [[#editform|→ Doorgaan met bewerken]]",
+Uw tekst is niet opgeslagen!",
+'continue-editing' => 'Doorgaan met bewerken',
 'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als u deze opslaat.',
 'session_fail_preview' => "'''Uw bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
 Probeer het opnieuw.
@@ -1075,10 +1077,10 @@ U dient uw bewerkingen in te voegen in de bestaande tekst.
 '''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als u op \"{{int:savearticle}}\" klikt.",
 'yourtext' => 'Uw tekst',
 'storedversion' => 'Opgeslagen versie',
-'nonunicodebrowser' => "'''Waarschuwing: Uw browser kan niet goed overweg met unicode.'''
-Hiermee wordt door de MediaWiki-software rekening gehouden zodat u toch zonder problemen pagina's kunt bewerken: niet-ASCII karakters worden in het bewerkingsveld weergegeven als hexadecimale codes.",
-'editingold' => "'''Waarschuwing: U bewerkt een oude versie van deze pagina.'''
-Als u uw bewerking opslaat, gaan alle wijzigingen die na deze versie gemaakt zijn verloren.",
+'nonunicodebrowser' => "'''Waarschuwing: uw browser kan niet goed overweg met Unicode.'''
+Hiermee wordt door de MediaWiki-software rekening gehouden zodat u toch zonder problemen pagina's kunt bewerken: niet-ASCII tekens worden in het bewerkingsveld weergegeven als hexadecimale codes.",
+'editingold' => "'''Waarschuwing: u bewerkt een oude versie van deze pagina.'''
+Als u uw bewerking opslaat, gaan alle wijzigingen verloren die na deze versie zijn gemaakt.",
 'yourdiff' => 'Wijzigingen',
 'copyrightwarning' => "Let op: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de \$2 (zie \$1 voor details).
 Als u niet wilt dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor \"Pagina opslaan\".<br />
@@ -1090,7 +1092,7 @@ U belooft ook dat u de oorspronkelijke auteur bent van dit materiaal of dat u he
 '''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
 'longpageerror' => "'''Fout: de tekst die u hebt toegevoegd is {{PLURAL:$1|één kilobyte|$1 kilobyte}} groot, wat groter is dan het maximum van {{PLURAL:$2|één kilobyte|$2 kilobyte}}.'''
 Opslaan is niet mogelijk.",
-'readonlywarning' => "'''Waarschuwing: de database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud, dus u kunt deze nu niet opslaan.'''
+'readonlywarning' => "'''Waarschuwing: u kunt deze bewerking nu niet opslaan omdat de database is geblokkeerd voor bewerkingen wegens onderhoudswerkzaamheden.'''
 Het is misschien verstandig om uw tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.
 
 Een beheerder heeft de database geblokkeerd om de volgende reden: $1",
@@ -1148,6 +1150,10 @@ Deze parameters zijn weggelaten.',
 'parser-template-loop-warning' => 'Er is een kringloop in sjablonen geconstateerd: [[$1]]',
 'parser-template-recursion-depth-warning' => 'De recursiediepte voor sjablonen is overschreden ($1)',
 'language-converter-depth-warning' => 'De dieptelimiet voor de taalconvertor is overschreden ($1)',
+'node-count-exceeded-category' => "Pagina's waar het maximaal aantal nodes is overschreden",
+'node-count-exceeded-warning' => 'Op de pagina is het maximale aantal nodes overschreden',
+'expansion-depth-exceeded-category' => "Pagina's waar de expansiediepte is overschreden",
+'expansion-depth-exceeded-warning' => 'De pagina bevat te veel sjablonen',
 
 # "Undo" feature
 'undo-success' => 'Deze bewerking kan ongedaan gemaakt worden.
@@ -1155,7 +1161,7 @@ Hieronder staat de tekst waarin de wijziging ongedaan is gemaakt.
 Controleer voor het opslaan of het resultaat gewenst is.',
 'undo-failure' => 'De wijziging kan niet ongedaan gemaakt worden vanwege andere strijdige wijzigingen.',
 'undo-norev' => 'De bewerking kon niet ongedaan gemaakt worden, omdat die niet bestaat of is verwijderd.',
-'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt.',
+'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Registreren is mislukt.',
@@ -1229,7 +1235,7 @@ U kunt deze verschillen bekijken. Er kunnen details te vinden zijn in het [{{ful
 'rev-showdeleted' => 'weergeven',
 'revisiondelete' => 'Versies verwijderen of terugplaatsen',
 'revdelete-nooldid-title' => 'Ongeldige doelversie',
-'revdelete-nooldid-text' => 'U hebt geen doelversie(s) voor deze handeling opgegeven, de aangegeven versie bestaat niet of u probeert de laatste versie te verbergen.',
+'revdelete-nooldid-text' => 'U hebt geen doelversie(s) voor deze handeling opgegeven. De aangegeven versie bestaat niet of u probeert de laatste versie te verbergen.',
 'revdelete-nologtype-title' => 'Er is geen logboektype opgegeven',
 'revdelete-nologtype-text' => 'U hebt geen logboektype opgegeven om deze handeling op uit te voeren.',
 'revdelete-nologid-title' => 'Ongeldige logboekregel',
@@ -1256,7 +1262,7 @@ Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud benaderen en de ve
 'revdelete-radio-set' => 'Ja',
 'revdelete-radio-unset' => 'Nee',
 'revdelete-suppress' => 'Gegevens voor zowel beheerders als anderen onderdrukken',
-'revdelete-unsuppress' => 'Beperkingen op teruggezette wijzigingen verwijderen',
+'revdelete-unsuppress' => 'Beperkingen op teruggeplaatste wijzigingen verwijderen',
 'revdelete-log' => 'Reden:',
 'revdelete-submit' => 'Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}',
 'revdelete-success' => "'''De zichtbaarheid van de wijziging is bijgewerkt.'''",
@@ -1268,7 +1274,7 @@ $1",
 'revdel-restore' => 'Zichtbaarheid wijzigen',
 'revdel-restore-deleted' => 'verwijderde versies',
 'revdel-restore-visible' => 'zichtbare versies',
-'pagehist' => 'paginageschiedenis',
+'pagehist' => 'Geschiedenis',
 'deletedhist' => 'verwijderde geschiedenis',
 'revdelete-hide-current' => 'Er is een fout opgetreden bij het verbergen van het object van $1 om $2 uur: dit is de huidige versie.
 Deze versie kan niet verborgen worden.',
@@ -1293,7 +1299,7 @@ Controleer de logboeken.',
 # Suppression log
 'suppressionlog' => 'Verbergingslogboek',
 'suppressionlogtext' => 'De onderstaande lijst bevat de verwijderingen en blokkades die voor beheerders verborgen zijn.
-In de [[Special:BlockList|IP-blokkeerlijst]] zijn de huidige blokkades te bekijken.',
+In de [[Special:BlockList|blokkadelijst]] zijn de huidige blokkades te bekijken.',
 
 # History merging
 'mergehistory' => "Geschiedenis van pagina's samenvoegen",
@@ -1341,7 +1347,7 @@ Let op dat het gebruiken van de navigatieverwijzingen deze kolom opnieuw instelt
 'searchresults' => 'Zoekresultaten',
 'searchresults-title' => 'Zoekresultaten voor "$1"',
 'searchresulttext' => 'Voor meer informatie over zoeken op {{SITENAME}}, zie [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'U zocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
+'searchsubtitle' => 'U hebt gezocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
 'searchsubtitleinvalid' => "U hebt gezocht naar '''$1'''",
 'toomanymatches' => 'Er waren te veel resultaten.
 Probeer een andere zoekopdracht.',
@@ -1390,7 +1396,7 @@ Probeer een andere zoekopdracht.',
 'showingresultsnum' => "Hieronder {{PLURAL:$3|staat '''1''' resultaat|staan '''$3''' resultaten}} vanaf #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultaten '''$1 - $2''' van '''$3'''}} voor '''$4'''",
 'nonefound' => "'''Opmerking''': standaard worden niet alle naamruimten doorzocht.
-Als u in uw zoekopdracht als voorvoegsel \"''all:''\" gebruikt worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
+Als u in uw zoekopdracht als voorvoegsel \"''all:''\" gebruikt, worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
 U kunt ook een naamruimte als voorvoegsel gebruiken.",
 'search-nonefound' => 'Er zijn geen resultaten voor uw zoekopdracht.',
 'powersearch' => 'Uitgebreid zoeken',
@@ -1458,7 +1464,7 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 'recentchangescount' => 'Standaard aantal weer te geven bewerkingen:',
 'prefs-help-recentchangescount' => "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
 'prefs-help-watchlist-token' => 'Door hier een geheime sleutel in te vullen wordt een RSS-feed voor uw volglijst aangemaakt.
-Iedereen die deze sleutel kent kan uw volglijst lezen, dus kies een veilige sleutel.
+Iedereen die deze sleutel kent, kan uw volglijst lezen. Kies dus een veilige sleutel.
 Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
 'savedprefs' => 'Uw voorkeuren zijn opgeslagen.',
 'timezonelegend' => 'Tijdzone:',
@@ -1513,7 +1519,8 @@ Deze moet minder dan $1 {{PLURAL:$1|karakters|karakters}} bevatten.',
 'prefs-help-gender' => 'Optioneel: dit wordt gebruikt om gebruikers correct aan te spreken in de software.
 Deze informatie is zichtbaar voor andere gebruikers.',
 'email' => 'E-mail',
-'prefs-help-realname' => 'Echte naam is optioneel, als u deze opgeeft kan deze naam gebruikt worden om u erkenning te geven voor uw werk.',
+'prefs-help-realname' => 'Echte naam is optioneel.
+Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor uw werk.',
 'prefs-help-email' => 'E-mailadres is optioneel, maar maakt het mogelijk om u uw wachtwoord te e-mailen als u het bent vergeten.',
 'prefs-help-email-others' => 'U kunt ook anderen in staat stellen per e-mail contact met u op te nemen via een verwijzing op uw gebruikers- en overlegpagina zonder dat u uw identiteit prijsgeeft.',
 'prefs-help-email-required' => 'Hiervoor is een e-mailadres nodig.',
@@ -1553,7 +1560,7 @@ Deze informatie is zichtbaar voor andere gebruikers.',
 'userrights-reason' => 'Reden:',
 'userrights-no-interwiki' => "U hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
 'userrights-nodatabase' => 'De database $1 bestaat niet of is geen lokale database.',
-'userrights-nologin' => 'U moet zich [[Special:UserLogin|aanmelden]] met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
+'userrights-nologin' => 'U moet [[Special:UserLogin|aangemeld]] zijn met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
 'userrights-notallowed' => 'U hebt geen rechten om gebruikersrechten toe te voegen of te verwijderen.',
 'userrights-changeable-col' => 'Groepen die u kunt beheren',
 'userrights-unchangeable-col' => 'Groepen die u niet kunt beheren',
@@ -1729,7 +1736,7 @@ Deze informatie is zichtbaar voor andere gebruikers.',
 'recentchangeslinked-toolbox' => 'Verwante wijzigingen',
 'recentchangeslinked-title' => 'Wijzigingen verwant aan "$1"',
 'recentchangeslinked-noresult' => "Er zijn in de opgegeven periode geen bewerkingen geweest op de pagina's waarheen vanaf hier verwezen wordt.",
-'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een aangegeven pagina of vanuit pagina's in een aangegeven pagina een categorie.
+'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een aangegeven pagina of vanaf pagina's in een aangegeven pagina een categorie.
 Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
 'recentchangeslinked-page' => 'Paginanaam:',
 'recentchangeslinked-to' => "Wijzigingen aan pagina's met verwijzingen naar deze pagina bekijken",
@@ -1791,7 +1798,7 @@ Aangewezen {{PLURAL:\$3|bestandstype is|bestandstypes zijn}} \$2.",
 'filetype-banned' => 'Het bestand dat u probeerde te uploaden was van een niet toegelaten bestandstype.',
 'verification-error' => 'De verificatie van het bestand dat u probeerde te uploaden is mislukt.',
 'hookaborted' => 'De wijziging die u probeerde te maken is afgebroken door een uitbreidingshook.',
-'illegal-filename' => 'Deze bestandsnaam is niet toegelaten.',
+'illegal-filename' => 'Deze bestandsnaam is niet toegestaan.',
 'overwrite' => 'Het overschrijven van een bestand bestand is niet toegestaan.',
 'unknown-error' => 'Er is een onbekende fout opgetreden.',
 'tmp-create-error' => 'Het was niet mogelijk een tijdelijk bestand aan te maken.',
@@ -1915,7 +1922,7 @@ Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop
 'backend-fail-synced' => 'Het bestand "$1" bevindt zich in een inconsistente toestand in de interne opslagbackends.',
 'backend-fail-connect' => 'Het was niet mogelijk een verbinding te maken met het opslagbackend "$1".',
 'backend-fail-internal' => 'Er is een onbekende fout opgetreden in het opslagbackend "$1".',
-'backend-fail-contenttype' => 'Kon het inhoudstype van het bestand om op "$1" op te slaan niet bepalen.',
+'backend-fail-contenttype' => 'Het inhoudstype van het bestand om in de opslag "$1" op te slaan kon niet bepaald worden.',
 'backend-fail-batchsize' => 'Taak met $1 {{PLURAL:$1|bestandshandeling|bestandshandelingen}} in het opslagbackend; de limiet is $2 {{PLURAL:$2|handeling|handelingen}}.',
 
 # File journal errors
@@ -1979,6 +1986,7 @@ Om beveiligingsreden is img_auth.php uitgeschakeld.',
 'http-curl-error' => 'Fout bij het ophalen van URL: $1',
 'http-host-unreachable' => 'De URL is niet bereikbaar.',
 'http-bad-status' => 'Er is een probleem opgetreden bij het HTTP-verzoek: $1 $2',
+'http-truncated-body' => 'De inhoud van het verzoek is slechts gedeeltelijk ontvangen.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Kon de URL niet bereiken',
@@ -2134,8 +2142,8 @@ Vergeet niet de "Verwijzingen naar deze pagina" te controleren alvorens dit sjab
 'disambiguations' => "Pagina's die verwijzen naar doorverwijspagina's",
 'disambiguationspage' => 'Template:Doorverwijspagina',
 'disambiguations-text' => "Hieronder staan pagina's die verwijzen naar een '''doorverwijspagina'''.
-Deze horen waarschijnlijk direct naar het juiste onderwerp te verwijzen.
-<br />Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]]",
+Deze horen waarschijnlijk direct naar het juiste onderwerp te verwijzen.<br />
+Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dubbele doorverwijzingen',
 'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
@@ -2261,10 +2269,15 @@ U kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlette
 'allpagessubmit' => 'OK',
 'allpagesprefix' => "Pagina's bekijken die beginnen met:",
 'allpagesbadtitle' => 'De opgegeven paginanaam is ongeldig of had een intertaal- of interwikivoorvoegsel.
-Mogelijk bevatte de naam karakters die niet gebruikt mogen worden in paginanamen.',
+Mogelijk bevatte de naam tekens die niet gebruikt mogen worden in paginanamen.',
 'allpages-bad-ns' => '{{SITENAME}} heeft geen naamruimte "$1".',
 'allpages-hide-redirects' => 'Doorverwijzingen verbergen',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'U bekijkt een cacheversie van deze pagina, die maximaal $1 oud is.',
+'cachedspecial-viewing-cached-ts' => 'U bekijkt een cacheversie van deze pagina, die mogelijk niet volledig is bijgewerkt.',
+'cachedspecial-refresh-now' => 'Meest recente weergeven.',
+
 # Special:Categories
 'categories' => 'Categorieën',
 'categoriespagetext' => "De volgende {{PLURAL:$1|categorie bevat|categorieën bevatten}} pagina's of mediabestanden.
@@ -2348,13 +2361,13 @@ De ontvanger kan dus direct naar u reageren.',
 'emailtarget' => 'Voer de geadresseerde in',
 'emailusername' => 'Gebruikersnaam:',
 'emailusernamesubmit' => 'Opslaan',
-'email-legend' => 'Een e-mail versturen naar een andere gebruiker van {{SITENAME}}',
+'email-legend' => 'Een e-mail verzenden naar een andere gebruiker van {{SITENAME}}',
 'emailfrom' => 'Van:',
 'emailto' => 'Aan:',
 'emailsubject' => 'Onderwerp:',
 'emailmessage' => 'Bericht:',
 'emailsend' => 'Verzenden',
-'emailccme' => 'Een kopie van dit bericht naar mijn e-mailadres sturen.',
+'emailccme' => 'Een kopie van dit bericht naar mijn e-mailadres zenden.',
 'emailccsubject' => 'Kopie van uw bericht aan $1: $2',
 'emailsent' => 'E-mail verzonden',
 'emailsenttext' => 'Uw e-mail is verzonden.',
@@ -2412,19 +2425,19 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
 'enotif_anon_editor' => 'anonieme gebruiker $1',
 'enotif_body' => 'Beste $WATCHINGUSERNAME,
 
-De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR, zie $PAGETITLE_URL voor de huidige versie.
+De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR. Zie $PAGETITLE_URL voor de huidige versie.
 
 $NEWPAGE
 
 Samenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT
 
 Contactgegevens van de auteur:
-E-mail: $PAGEEDITOR_EMAIL
+E-mailadres: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
 Tenzij u deze pagina bezoekt, komen er geen verdere berichten. Op uw volglijst kunt u voor alle gevolgde pagina\'s de waarschuwingsinstellingen opschonen.
 
-             Groet van uw {{SITENAME}}-waarschuwingssysteem.
+Groet van uw {{SITENAME}}-waarschuwingssysteem.
 
 --
 U kunt uw e-mailinstellingen wijzigen op:
@@ -2436,7 +2449,7 @@ U kunt uw volglijstinstellingen wijzigen op:
 U kunt de pagina van uw volglijst verwijderen via de volgende verwijzing:
 $UNWATCHURL
 
-Feedback en andere assistentie:
+Terugkoppeling en verdere assistentie:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -2503,7 +2516,7 @@ Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveil
 'modifiedarticleprotection' => 'heeft het beveiligingsniveau voor "[[$1]]" gewijzigd',
 'unprotectedarticle' => 'heeft de beveiliging van "[[$1]]" opgeheven',
 'movedarticleprotection' => 'heeft beveiligingsinstellingen verplaatst van "[[$2]]" naar "[[$1]]"',
-'protect-title' => 'Instellen van beveiligingsniveau voor "$1"',
+'protect-title' => 'Beveiligingsniveau instellen voor "$1"',
 'protect-title-notallowed' => 'Beveiligingsniveau voor "$1" bekijken',
 'prot_1movedto2' => '[[$1]] is hernoemd naar [[$2]]',
 'protect-badnamespace-title' => 'Niet te beveiligen naamruimte',
@@ -2516,7 +2529,7 @@ Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveil
 'protect-unchain-permissions' => 'Overige beveiligingsinstellingen beschikbaar maken',
 'protect-text' => "Hier kunt u het beveiligingsniveau voor de pagina '''$1''' bekijken en wijzigen.",
 'protect-locked-blocked' => "U kunt het beveiligingsniveau niet wijzigen terwijl u geblokkeerd bent.
-Hier zijn de huidige instellingen voor de pagina '''$1''':",
+Dit zijn de huidige instellingen voor de pagina '''$1''':",
 'protect-locked-dblock' => "Het beveiligingsniveau kan niet worden gewijzigd, omdat de database gesloten is.
 Hier zijn de huidige instellingen voor de pagina '''$1''':",
 'protect-locked-access' => "U hebt geen rechten om het beveiligingsniveau te wijzigen.
@@ -2587,7 +2600,7 @@ Mogelijk hebt u een verkeerde verwijzing of is de versie hersteld of verwijderd
 'undeletelink' => 'bekijken/terugplaatsen',
 'undeleteviewlink' => 'bekijken',
 'undeletereset' => 'Fomulier wissen',
-'undeleteinvert' => 'Omgekeerde selectie',
+'undeleteinvert' => 'Selectie omkeren',
 'undeletecomment' => 'Reden:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} teruggeplaatst',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst',
@@ -2606,7 +2619,7 @@ In het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen
 'undelete-filename-mismatch' => 'Bestandsversie van tijdstip $1 kon niet hersteld worden: bestandsnaam klopte niet',
 'undelete-bad-store-key' => 'Bestandsversie van tijdstip $1 kon niet hersteld worden: het bestand miste al voordat het werd verwijderd.',
 'undelete-cleanup-error' => 'Fout bij het herstellen van ongebruikt archiefbestand "$1".',
-'undelete-missing-filearchive' => 'Het lukt niet om ID $1 terug te plaatsen, omdat deze niet in de database te vinden is.
+'undelete-missing-filearchive' => 'Het is niet mogelijk om ID $1 terug te plaatsen, omdat deze niet in de database te vinden is.
 Misschien is deze versie al teruggeplaatst.',
 'undelete-error' => 'Er is een fout opgetreden tijdens het verwijderen van de pagina',
 'undelete-error-short' => 'Fout bij het herstellen van bestand: $1',
@@ -2618,7 +2631,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => 'Naamruimte:',
-'invert' => 'Omgekeerde selectie',
+'invert' => 'Selectie omkeren',
 'tooltip-invert' => 'Vink dit aan om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)',
 'namespace_association' => 'Gekoppelde naamruimte',
 'tooltip-namespace_association' => 'Vink dit aan om ook wijzigingen weer te geven in de overleg- of onderwerpnaamruimte die bij de geselecteerde naamruimte hoort',
@@ -2710,7 +2723,7 @@ Geef hieronder een reden op (bijvoorbeeld welke pagina's gevandaliseerd zijn).",
 'badipaddress' => 'Geen geldig IP-adres',
 'blockipsuccesssub' => 'De blokkering is ingesteld',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] is geblokkeerd.<br />
-Zie de [[Special:BlockList|Lijst van geblokkeerde IP-adressen]] voor recente blokkades.',
+Zie de [[Special:BlockList|blokkadelijst]] voor recente blokkades.',
 'ipb-blockingself' => 'U staat op het punt uzelf te blokkeren. Weet u zeker dat u dat wilt doen?',
 'ipb-confirmhideuser' => 'U staat op het punt een verborgen gebruiker te blokkeren. Hiervoor worden gebruikersnamen in alle lijsten en logboekregels verborgen. Weet u het zeker?',
 'ipb-edit-dropdown' => 'Lijst van redenen bewerken',
@@ -2760,11 +2773,11 @@ Zie de [[Special:BlockList|Lijst van geblokkeerde IP-adressen]] voor recente blo
 Het blokkeerlogboek wordt hieronder ter referentie weergegeven:',
 'blocklog-showsuppresslog' => 'Deze gebruiker is voorheen geblokkeerd geweest en er zijn (delen van) bewerkingen van deze gebruiker verborgen.
 Het verbergingslogboek wordt hieronder ter referentie weergegeven:',
-'blocklogentry' => 'blokkeerde [[$1]] met als vervaltijd $2 $3',
+'blocklogentry' => 'heeft [[$1]] geblokkeerd met als vervaltijd $2 $3',
 'reblock-logentry' => 'heeft de blokkade voor [[$1]] gewijzigd met als vervaldatum $2 $3',
 'blocklogtext' => 'Hier ziet u een lijst van de recente blokkeringen en deblokkeringen.
 Automatische blokkeringen en deblokkeringen komen niet in het logboek.
-Zie ook [[Special:BlockList|Geblokkeerde IP-adressen en gebruikers]].',
+Zie ook de [[Special:BlockList|blokkadelijst]] voor de op dit moment actieve blokkades.',
 'unblocklogentry' => 'heeft de blokkade van $1 opgeheven',
 'block-log-flags-anononly' => 'alleen anoniemen',
 'block-log-flags-nocreate' => 'registreren gebruikers geblokkeerd',
@@ -2806,8 +2819,7 @@ Omdat u het recht 'hideuser' niet hebt, kunt u de blokkade van de gebruiker niet
 # Developer tools
 'lockdb' => 'Database blokkeren',
 'unlockdb' => 'Blokkering van de database opheffen',
-'lockdbtext' => "Waarschuwing: de database blokkeren heeft tot gevolg dat geen enkele gebruiker meer in staat is pagina's te bewerken, voorkeuren te wijzigen of iets anders te doen waarvoor wijzigingen in de database nodig zijn.
-
+'lockdbtext' => "Als u de database blokkeert, kunnen gebruikers geen pagina's meer bewerken, geen voorkeuren wijzigen of iets anders te doen waarvoor wijzigingen in de database nodig zijn.
 Bevestig dat u deze handeling wilt uitvoeren en dat u de database vrijgeeft nadat het onderhoud is uitgevoerd.",
 'unlockdbtext' => "Na het vrijgeven van de database kunnen gebruikers weer pagina's bewerken, hun voorkeuren wijzigen of iets anders te doen waarvoor er wijzigingen in de database nodig zijn.
 
@@ -2856,8 +2868,7 @@ Zorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
 * De overlegpagina onder de nieuwe naam al bestaat;
 * U het onderstaande vinkje deselecteert.",
 'movearticle' => 'Te hernoemen pagina:',
-'moveuserpage-warning' => "'''Waarschuwing:''' U gaat een gebruikerspagina hernoemen.
-Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
+'moveuserpage-warning' => "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
 'movenologin' => 'Niet aangemeld',
 'movenologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.',
 'movenotallowed' => "U hebt geen rechten om pagina's te hernoemen.",
@@ -2910,9 +2921,9 @@ Wilt u deze verwijderen om plaats te maken voor de te hernoemen pagina?',
 'imageinvalidfilename' => 'De nieuwe bestandsnaam is ongeldig',
 'fix-double-redirects' => 'Alle doorverwijzingen bijwerken die verwijzen naar de originele paginanaam',
 'move-leave-redirect' => 'Een doorverwijzing achterlaten',
-'protectedpagemovewarning' => "'''Waarschuwing:''' Deze pagina kan alleen door beheerders hernoemd worden.
+'protectedpagemovewarning' => "'''Waarschuwing:''' deze pagina kan alleen door beheerders hernoemd worden.
 De laatste logboekregel staat hieronder:",
-'semiprotectedpagemovewarning' => "'''Let op:''' Deze pagina kan alleen door geregistreerde gebruikers hernoemd worden.
+'semiprotectedpagemovewarning' => "'''Let op:''' deze pagina kan alleen door geregistreerde gebruikers hernoemd worden.
 De laatste logboekregel staat hieronder:",
 'move-over-sharedrepo' => '== Het bestand bestaat al ==
 [[:$1]] bestaat al in een gedeelde mediadatabank.
@@ -2949,7 +2960,7 @@ In het laatste geval kunt u ook een verwijzing gebruiken, bijvoorbeeld [[{{#Spec
 'allmessagescurrent' => 'Huidige inhoud',
 'allmessagestext' => 'Hieronder staan de systeemberichten uit de MediaWiki-naamruimte.
 Ga naar [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//translatewiki.net translatewiki.net] als u wilt bijdragen aan de algemene vertaling voor MediaWiki.',
-'allmessagesnotsupportedDB' => "Deze pagina kan niet gebruikt worden, omdat '''\$wgUseDatabaseMessages''' is uitgeschakeld.",
+'allmessagesnotsupportedDB' => "Deze pagina kan niet worden gebruikt, omdat '''\$wgUseDatabaseMessages''' is uitgeschakeld.",
 'allmessages-filter-legend' => 'Filter',
 'allmessages-filter' => 'Filteren op aangepast:',
 'allmessages-filter-unmodified' => 'Ongewijzigd',
@@ -3023,7 +3034,7 @@ Een tijdelijke map is niet aanwezig.',
 # Import log
 'importlogpage' => 'Importlogboek',
 'importlogpagetext' => "Administratieve import van pagina's met geschiedenis van andere wiki's.",
-'import-logentry-upload' => 'importeerde [[$1]] via een bestandsupload',
+'import-logentry-upload' => 'heeft [[$1]] geïmporteerd via een bestandsupload',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|versie|versies}}',
 'import-logentry-interwiki' => 'importeerde $1 via transwiki',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versie|versies}} van $2',
@@ -3051,9 +3062,10 @@ Een tijdelijke map is niet aanwezig.',
 'tooltip-pt-anonlogin' => 'U wordt van harte uitgenodigd om u aan te melden als gebruiker, maar dit is niet verplicht',
 'tooltip-pt-logout' => 'Afmelden',
 'tooltip-ca-talk' => 'Overleg over deze pagina',
-'tooltip-ca-edit' => 'U kunt deze pagina bewerken. Gebruik de voorbeeldweergaveknop alvorens te bewaren.',
+'tooltip-ca-edit' => 'U kunt deze pagina bewerken. Gebruik de knop "Bewerking ter controle bekijken" voordat u de pagina opslaat',
 'tooltip-ca-addsection' => 'Nieuw kopje toevoegen',
-'tooltip-ca-viewsource' => 'Deze pagina is beveiligd. U kunt wel de broncode bekijken.',
+'tooltip-ca-viewsource' => 'Deze pagina is beveiligd.
+U kunt wel de broncode bekijken.',
 'tooltip-ca-history' => 'Eerdere versies van deze pagina',
 'tooltip-ca-protect' => 'Deze pagina beveiligen',
 'tooltip-ca-unprotect' => 'De beveiliging voor deze pagina wijzigen',
@@ -3062,7 +3074,7 @@ Een tijdelijke map is niet aanwezig.',
 'tooltip-ca-move' => 'Deze pagina hernoemen',
 'tooltip-ca-watch' => 'Deze pagina aan mijn volglijst toevoegen',
 'tooltip-ca-unwatch' => 'Deze pagina van mijn volglijst verwijderen',
-'tooltip-search' => '{{SITENAME}} doorzoeken',
+'tooltip-search' => 'Zoeken in {{SITENAME}}',
 'tooltip-search-go' => 'Naar een pagina met deze naam gaan als die bestaat',
 'tooltip-search-fulltext' => "Alle pagina's op deze tekst doorzoeken",
 'tooltip-p-logo' => 'Naar de hoofdpagina gaan',
@@ -3195,7 +3207,7 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'markaspatrolleddiff' => 'Als gecontroleerd markeren',
 'markaspatrolledtext' => 'Deze pagina als gecontroleerd markeren',
 'markedaspatrolled' => 'Gemarkeerd als gecontroleerd',
-'markedaspatrolledtext' => 'De geselecteerde versie van [[:$1]] is gemarkeerd als gecontroleerd.',
+'markedaspatrolledtext' => 'De geselecteerde bewerking van [[:$1]] is gemarkeerd als gecontroleerd.',
 'rcpatroldisabled' => 'De controlemogelijkheid op recente wijzigingen is uitgeschakeld.',
 'rcpatroldisabledtext' => 'De mogelijkheid om recente wijzigingen als gecontroleerd aan te merken is op dit ogenblik uitgeschakeld.',
 'markedaspatrollederror' => 'Kan niet als gecontroleerd worden aangemerkt',
@@ -3224,8 +3236,7 @@ $1',
 
 # Media information
 'mediawarning' => "'''Waarschuwing''': dit bestandstype bevat mogelijk programmacode die uw systeem schade kan berokkenen.",
-'imagemaxsize' => "Maximale afmetingen van afbeeldingen:<br />
-''(voor op de beschrijvingspagina)''",
+'imagemaxsize' => "Maximale afmetingen van afbeeldingen:<br />''(voor op de beschrijvingspagina)''",
 'thumbsize' => 'Grootte miniatuurafbeelding:',
 'widthheight' => '$1 × $2',
 'widthheightpage' => "$1 × $2, $3 {{PLURAL:$3|pagina|pagina's}}",
@@ -3273,8 +3284,8 @@ Alle volgende verwijzingen die op dezelfde regel staan, worden behandeld als uit
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => 'Dit bestand bevat aanvullende informatie, die door een fotocamera, scanner of fotobewerkingsprogramma toegevoegd kan zijn.
-Als het bestand aangepast is, komen details mogelijk niet overeen met het gewijzigde bestand.',
+'metadata-help' => 'Dit bestand bevat aanvullende gegevens, die waarschijnlijk door een fotocamera, scanner of fotobewerkingsprogramma toegevoegd zijn.
+Als het bestand is aangepast, komen sommige details mogelijk niet overeen met het gewijzigde bestand.',
 'metadata-expand' => 'Uitgebreide gegevens bekijken',
 'metadata-collapse' => 'Uitgebreide gegevens verbergen',
 'metadata-fields' => 'De afbeeldingsmetadatavelden in dit bericht worden ook weergegeven op een afbeeldingspagina als de metadatatabel ingeklapt is.
@@ -3813,11 +3824,11 @@ Bevestig dat u de pagina opnieuw wilt aanmaken.',
 'livepreview-ready' => 'Bezig met laden… Klaar!',
 'livepreview-failed' => 'Live voorvertoning mislukt!
 Probeer de normale voorvertoning.',
-'livepreview-error' => 'Verbinden mislukt: $1 “$2”.
-Probeer normale voorvertoning.',
+'livepreview-error' => 'Verbinden mislukt: $1 "$2".
+Probeer normale voorvertoning te gebruiken.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Veranderingen die nieuwer zijn dan $1 {{PLURAL:$1|seconde|seconden}} worden misschien niet weergegeven in deze lijst.',
+'lag-warn-normal' => 'Wijzigingen in de afgelopen {{PLURAL:$1|seconde|$1 seconden}} worden misschien niet weergegeven in deze lijst.',
 'lag-warn-high' => 'Door een hoge database-servertoevoer zijn wijzigingen nieuwer dan $1 {{PLURAL:$1|seconde|seconden}} mogelijk niet beschikbaar in de lijst.',
 
 # Watchlist editor
@@ -3826,7 +3837,7 @@ Probeer normale voorvertoning.',
 'watchlistedit-normal-title' => 'Volglijst bewerken',
 'watchlistedit-normal-legend' => 'Pagina’s van uw volglijst verwijderen',
 'watchlistedit-normal-explain' => 'Hieronder worden de pagina’s op uw volglijst weergegeven.
-Klik op het vierkantje ernaast en daarna op "{{int:Watchlistedit-normal-submit}}" om een pagina te verwijderen.
+Klik op het vinkvakje ernaast en daarna op "{{int:Watchlistedit-normal-submit}}" om een pagina te verwijderen.
 U kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].',
 'watchlistedit-normal-submit' => "Pagina's verwijderen",
 'watchlistedit-normal-done' => 'Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina’s}} verwijderd van uw volglijst:',
@@ -3867,7 +3878,7 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Onbekende tag "$1"',
-'duplicate-defaultsort' => 'Waarschuwing: De standaardsortering "$2" krijgt voorrang voor de sortering "$1".',
+'duplicate-defaultsort' => '\'\'\'Waarschuwing:\'\'\' de standaardsortering "$2" krijgt voorrang voor de sortering "$1".',
 
 # Special:Version
 'version' => 'Versie',
@@ -3897,6 +3908,11 @@ Samen met dit programma hoort u een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van
 'version-software' => 'Geïnstalleerde software',
 'version-software-product' => 'Product',
 'version-software-version' => 'Versie',
+'version-entrypoints' => "URL's voor ingangen",
+'version-entrypoints-header-entrypoint' => 'Ingang',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
 
 # Special:FilePath
 'filepath' => 'Bestandslocatie',
@@ -4006,7 +4022,7 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'logentry-delete-event' => '$1 heeft de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
 'logentry-delete-revision' => '$1 heeft de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
 'logentry-delete-event-legacy' => '$1 heeft de zichtbaarheid van logboekregels van $3 gewijzigd',
-'logentry-delete-revision-legacy' => '$1 heeft de zichtbaarheid van versies van de pagina $3 gewijzigd.',
+'logentry-delete-revision-legacy' => '$1 heeft de zichtbaarheid van versies van de pagina $3 gewijzigd',
 'logentry-suppress-delete' => '$1 heeft de pagina $3 onderdrukt',
 'logentry-suppress-event' => '$1 heeft heimelijk de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
 'logentry-suppress-revision' => '$1 heeft heimelijk de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
@@ -4021,8 +4037,8 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'revdelete-restricted' => 'heeft beperkingen aan beheerders opgelegd',
 'revdelete-unrestricted' => 'heeft beperkingen voor beheerders opgeheven',
 'logentry-move-move' => '$1 heeft pagina $3 naar $4 hernoemd',
-'logentry-move-move-noredirect' => '$1 hernoemde pagina $3 naar $4 zonder een doorverwijzing achter te laten',
-'logentry-move-move_redir' => '$1 hernoemde pagina $3 naar $4 over een doorverwijzing',
+'logentry-move-move-noredirect' => '$1 heeft de pagina $3 hernoemd naar $4 zonder een doorverwijzing achter te laten',
+'logentry-move-move_redir' => '$1 heeft pagina $3 hernoemd naar $4 over een doorverwijzing',
 'logentry-move-move_redir-noredirect' => '$1 heeft pagina $3 naar $4 hernoemd over een doorverwijzing zonder een doorverwijzing achter te laten',
 'logentry-patrol-patrol' => '$1 heeft versie $4 van pagina $3 als gecontroleerd gemarkeerd',
 'logentry-patrol-patrol-auto' => '$1 heeft versie $4 van pagina $3 automatisch als gecontroleerd gemarkeerd',
@@ -4034,7 +4050,7 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 
 # Feedback
 'feedback-bugornote' => 'Als u zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].
-Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw commentaar zal worden toegevoegd aan de pagina "[$3 $2]", samen met uw gebruikersnaam en de browser die u gebruikt.',
+Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt dan toegevoegd aan de pagina "[$3 $2]", samen met uw gebruikersnaam en de browser die u gebruikt.',
 'feedback-subject' => 'Onderwerp:',
 'feedback-message' => 'Bericht:',
 'feedback-cancel' => 'Annuleren',
@@ -4086,4 +4102,15 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw commentaar za
 'api-error-uploaddisabled' => 'Uploaden is niet mogelijk in deze wiki.',
 'api-error-verification-error' => 'Dit bestand is mogelijk beschadigd of heeft een onjuiste extensie.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|seconde|seconden}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuut|minuten}}',
+'duration-hours' => '$1 {{PLURAL:$1|uur|uren}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dagen}}',
+'duration-weeks' => '$1 {{PLURAL:$1|week|weken}}',
+'duration-years' => '$1 {{PLURAL:$1|jaar|jaar}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennium|decennia}}',
+'duration-centuries' => '$1 {{PLURAL:$1|eeuw|eeuwen}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
 );
index 3a2fe29..dbf76bd 100644 (file)
@@ -916,7 +916,9 @@ Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
 'userinvalidcssjstitle' => "'''Åtvaring:''' Det finst ikkje noka sidedrakt som heiter «$1». Hugs på at vanlege .css- og .js-sider brukar titlar med små bokstavar, til dømes {{ns:user}}:Døme/vector.css, og ikkje {{ns:user}}:Døme/Vector.css.",
 'updated' => '(Oppdatert)',
 'note' => "'''Merk:'''",
-'previewnote' => "'''Hugs at dette berre er ei førehandsvising og at teksten ikkje er lagra!'''",
+'previewnote' => "'''Hugsa at dette berre er ei førehandsvising.'''
+Endringane dine er ikkje lagra enno!",
+'continue-editing' => 'Endra vidare',
 'previewconflict' => 'Dette er ei førehandsvising av teksten i endringsboksen over, slik han vil sjå ut om du lagrar han',
 'session_fail_preview' => "'''Orsak! Endringa di kunne ikkje lagrast. Ver venleg og prøv ein gong til. Dersom det framleis ikkje går, prøv å logge deg ut og inn att.'''",
 'session_fail_preview_html' => "'''Beklagar! Endringa di kunne ikkje lagrast.'''
@@ -927,6 +929,7 @@ Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
 'token_suffix_mismatch' => "'''Endringa di vart avvist fordi klienten/nettlesaren din lagar teiknfeil i teksten. Dette vart gjort for å hindre øydelegging av teksten på sida. Slikt kan av og til hende når ein brukar feilprogrammerte og vevbaserte anonyme proxytenester.'''",
 'edit_form_incomplete' => 'Delar av redigeringsskjemaet nådde ikkje fram til tenaren; dobbelsjekk at redigeringa er korrekt, og prøv om att.',
 'editing' => 'Endrar $1',
+'creating' => 'Opprettar $1',
 'editingsection' => 'Endrar $1 (bolk)',
 'editingcomment' => 'Endrar $1 (ny bolk)',
 'editconflict' => 'Endringskonflikt: $1',
@@ -1562,6 +1565,7 @@ Dette kan ikke tilbakestillast.',
 'newsectionsummary' => '/* $1 */ ny bolk',
 'rc-enhanced-expand' => 'Vis detaljar (krev JavaScript)',
 'rc-enhanced-hide' => 'Skjul detaljar',
+'rc-old-title' => 'opphavleg oppretta som «$1»',
 
 # Recent changes linked
 'recentchangeslinked' => 'Relaterte endringar',
@@ -1980,8 +1984,8 @@ Merk at andre internettsider kan ha direkte lenkjer til filer, og difor kan file
 # Special:AllPages
 'allpages' => 'Alle sider',
 'alphaindexline' => '$1 til $2',
-'nextpage' => 'Neste side ($1)',
-'prevpage' => 'Førre side ($1)',
+'nextpage' => 'Neste sida ($1)',
+'prevpage' => 'Førre sida ($1)',
 'allpagesfrom' => 'Vis sider frå:',
 'allpagesto' => 'Vis sider til og med:',
 'allarticles' => 'Alle sider',
@@ -1993,6 +1997,7 @@ Merk at andre internettsider kan ha direkte lenkjer til filer, og difor kan file
 'allpagesprefix' => 'Vis sider med prefikset:',
 'allpagesbadtitle' => 'Det oppgjevne sidenamnet var ugyldig eller hadde eit interwiki-prefiks. Det kan også ha hatt eitt eller fleire teikn som ikkje kan brukast i sidenamn.',
 'allpages-bad-ns' => '{{SITENAME}} har ikkje namnerommet «$1».',
+'allpages-hide-redirects' => 'Gøym omdirigeringar',
 
 # Special:Categories
 'categories' => 'Kategoriar',
@@ -2566,7 +2571,7 @@ I desse falla lyt du flytte eller flette saman sida manuelt.",
 
 Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje rom for flytting?',
 'delete_and_move_confirm' => 'Ja, slett sida',
-'delete_and_move_reason' => 'Sletta for å gi rom for flytting frå "[[$1]]"',
+'delete_and_move_reason' => 'Sletta for å gje rom for flytting frå «[[$1]]»',
 'selfmove' => 'Kjelde- og måltitlane er like; kan ikkje flytte sida over seg sjølv.',
 'immobile-source-namespace' => 'Kan ikkje flytte sider i namnerommet «$1»',
 'immobile-target-namespace' => 'Kan ikkje flytte sider til namnerommet «$1»',
@@ -2869,6 +2874,7 @@ $1',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|rame|ramer}}',
 'file-info-png-looped' => '↓oppatteke',
 'file-info-png-repeat' => 'spela av {{PLURAL:$1|éin gong|$1 gonger}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|bilete|bilete}}',
 
 # Special:NewFiles
 'newimages' => 'Filgalleri',
@@ -2882,6 +2888,13 @@ $1',
 'bydate' => 'etter dato',
 'sp-newimages-showfrom' => 'Vis nye filer frå og med $2 $1',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekund|$1 sekund}}',
+'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutt}}',
+'hours' => '{{PLURAL:$1|$1 time|$1 timar}}',
+'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'ago' => '$1 sidan',
+
 # Bad image list
 'bad_image_list' => 'Formatet er slik:
 
@@ -3043,6 +3056,7 @@ Andre er gøymde som standard.
 'exif-headline' => 'Overskrift',
 'exif-credit' => 'Opphavrettseigar/filgjevar',
 'exif-source' => 'Kjelde',
+'exif-writer' => 'Forfattar',
 'exif-languagecode' => 'Språk',
 'exif-iimversion' => 'IIM-versjon',
 'exif-iimcategory' => 'Kategori',
@@ -3213,6 +3227,8 @@ Andre er gøymde som standard.
 'exif-gpsdestdistance-m' => 'Miles',
 'exif-gpsdestdistance-n' => 'Nautiske mil',
 
+'exif-gpsdop-good' => 'God ($1)',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Verkeleg retning',
 'exif-gpsdirection-m' => 'Magnetisk retning',
@@ -3321,16 +3337,16 @@ Du må stadfeste at du verkeleg vil nyopprette denne sida.",
 'confirm-unwatch-top' => 'Fjern denne sida frå overvakingslista di?',
 
 # Multipage image navigation
-'imgmultipageprev' => '← førre side',
-'imgmultipagenext' => 'neste side →',
+'imgmultipageprev' => '← førre sida',
+'imgmultipagenext' => 'neste sida →',
 'imgmultigo' => 'Gå!',
 'imgmultigoto' => 'Gå til sida $1',
 
 # Table pager
 'ascending_abbrev' => 'stigande',
 'descending_abbrev' => 'synkande',
-'table_pager_next' => 'Neste side',
-'table_pager_prev' => 'Førre side',
+'table_pager_next' => 'Neste sida',
+'table_pager_prev' => 'Førre sida',
 'table_pager_first' => 'Fyrste side',
 'table_pager_last' => 'Siste side',
 'table_pager_limit' => 'Vis $1 element per side',
@@ -3566,4 +3582,15 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 'api-error-uploaddisabled' => 'Det er ikkje høve til å lasta opp filer til wikien.',
 'api-error-verification-error' => 'Fila kan vera øydelagd eller ha rang filending.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minutt|minutt}}',
+'duration-hours' => '$1 {{PLURAL:$1|time|timar}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dagar}}',
+'duration-weeks' => '$1 {{PLURAL:$1|veke|veker}}',
+'duration-years' => '$1 {{PLURAL:$1|år|år}}',
+'duration-decades' => '$1 {{PLURAL:$1|tiår|tiår}}',
+'duration-centuries' => '$1 {{PLURAL:$1|hundreår|hundreår}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tusenår|tusenår}}',
+
 );
index b887d73..7a88814 100644 (file)
@@ -645,6 +645,7 @@ Informatz-ne un [[Special:ListUsers/sysop|administrator]] aprèp aver notada l
 'badarticleerror' => 'Aquesta accion pòt pas èsser efectuada sus aquesta pagina.',
 'cannotdelete' => 'Impossible de suprimir la pagina o lo fichièr « $1 ».
 Benlèu la supression ja es estada efectuada per qualqu’un mai.',
+'cannotdelete-title' => 'Impossible de suprimir la pagina "$1"',
 'badtitle' => 'Títol marrit',
 'badtitletext' => 'Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.',
 'perfcached' => 'Aquò es una version en amagatal e es benlèu pas a jorn. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -654,6 +655,7 @@ Benlèu la supression ja es estada efectuada per qualqu’un mai.',
 Foncion : $1<br />
 Requèsta : $2',
 'viewsource' => 'Vejatz lo tèxte font',
+'viewsource-title' => 'Veire la font de $1',
 'actionthrottled' => 'Accion limitada',
 'actionthrottledtext' => "Per luchar contra lo spam, l’utilizacion d'aquesta accion es limitada a un cèrt nombre de còps dins una sosta pro corta. S'avèra qu'avètz depassat aqueste limit. Ensajatz tornamai dins qualques minutas.",
 'protectedpagetext' => 'Aquesta pagina es estada protegida per empachar sa modificacion.',
@@ -913,6 +915,7 @@ La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d
 'updated' => '(Mes a jorn)',
 'note' => "'''Nòta :'''",
 'previewnote' => "'''Atencion, aqueste tèxte es sonque una previsualizacion e es pas encara estat salvat !'''",
+'continue-editing' => "Contunhar l'edicion",
 'previewconflict' => 'Aquesta previsualizacion fa veire lo tèxte de la bóstia de modificacion superiora coma apareisserà se causissètz de lo salvar.',
 'session_fail_preview' => "'''Podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions concernent vòstra sesilha.
 Ensajatz tornarmai.
@@ -925,6 +928,7 @@ S'aquò fracassa encara, [[Special:UserLogout|desconnectatz-vos]], puèi connect
 S'aquò capita pas un còp de mai, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.'''",
 'token_suffix_mismatch' => "'''Vòstra modificacion es pas estada acceptada perque vòstre navigador a mesclat los caractèrs de ponctuacion dins l’identificant d’edicion. La modificacion es estada regetada per empachar la corrupcion del tèxte de l’article. Aqueste problèma se produtz quand utilizatz un mandatari (proxy) anonim problematic.'''",
 'editing' => 'Modificacion de $1',
+'creating' => 'Creacion de $1',
 'editingsection' => 'Modificacion de $1 (seccion)',
 'editingcomment' => 'Modificacion de $1 (seccion novèla)',
 'editconflict' => 'Conflicte de modificacion : $1',
@@ -981,6 +985,7 @@ Sembla que siá estada suprimida.',
 'edit-no-change' => 'Vòstra modificacion es estada ignorada perque cap de cambiament es pas estat fach dins lo tèxte.',
 'edit-already-exists' => 'La pagina novèla a pogut èsser creada .
 Existís ja.',
+'defaultmessagetext' => 'Messatge per defaut',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Atencion : Aquesta pagina conten tròp d’apèls dispendioses de foncions del parser.
@@ -1517,6 +1522,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'action-userrights' => 'modificar totes los dreches d’utilizaire',
 'action-userrights-interwiki' => 'modificar los dreches d’utilizaire e los sus d’autres wikis',
 'action-siteadmin' => 'varrolhar o desvarrolhar la banca de donadas',
+'action-sendemail' => 'mandar corrièrs electronics',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
@@ -1780,6 +1786,7 @@ La tièra seguenta aficha {{PLURAL:$1|lo primièr ligam de pagina|los $1 primiè
 Una [[Special:WhatLinksHere/$2|tièra completa]] es disponibla.',
 'nolinkstoimage' => 'Cap de pagina compòrta pas de ligam cap a aqueste imatge.',
 'morelinkstoimage' => 'Vejatz [[Special:WhatLinksHere/$1|mai de ligams]] cap a aqueste imatge.',
+'linkstoimage-redirect' => '$1 (redireccion de fichièr) $2',
 'duplicatesoffile' => "{{PLURAL:$1|Lo fichièr seguent es un duplicata|Los fichièrs seguents son de duplicatas}} d'aqueste fichièr ([[Special:FileDuplicateSearch/$2|mai de detalhs]]):",
 'sharedupload' => 'Aqueste fichièr proven de $1 e pòt èsser utilizat per d’autres projèctes.',
 'sharedupload-desc-there' => "Aqueste fichièr proven de $1 e pòt èsser utilizat per d'autres projèctes. Vejatz [$2 sa pagina de descripcion] per mai d'entresenhas.",
@@ -1876,6 +1883,7 @@ Una pagina es tractada coma una pagina d’omonimia s'utiliza un modèl qu'es li
 Cada entrada conten de ligams cap a la primièra e la segonda redireccions, e mai la primièra linha de tèxte de la segonda pagina, çò que provesís, de costuma, la « vertadièra » pagina cibla, cap a la quala la primièra redireccion deuriá redirigir.
 Las entradas <del>barradas</del> son estadas resolgudas.',
 'double-redirect-fixed-move' => '[[$1]] es estat renomenat, aquò es ara una redireccion cap a [[$2]]',
+'double-redirect-fixed-maintenance' => 'Correccion de  la doble redireccion de [[$1]] a [[$2]]',
 'double-redirect-fixer' => 'Corrector de redireccion',
 
 'brokenredirects' => 'Redireccions copadas',
@@ -2094,8 +2102,10 @@ L'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras pre
 'watchnologin' => 'Vos sètz pas identificat(ada)',
 'watchnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
 per modificar vòstra lista de seguiment.',
+'addwatch' => 'Ajustar a la lista de seguiment',
 'addedwatchtext' => 'La pagina "[[:$1]]" es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]].
 Las modificacions venentas d\'aquesta pagina e de la pagina de discussion associada seràn repertoriadas aicí, e la pagina apareisserà <b>en gras</b> dins la [[Special:RecentChanges|tièra dels darrièrs cambiaments]] per èsser localizada mai aisidament.',
+'removewatch' => 'Suprimir de la lista de seguiment',
 'removedwatchtext' => 'La pagina « [[:$1]] » es estada levada de vòstra [[Special:Watchlist|lista de seguiment]].',
 'watch' => 'Seguir',
 'watchthispage' => 'Seguir aquesta pagina',
@@ -2419,6 +2429,7 @@ Podètz consultar la [[Special:BlockList|lista dels comptes e de las adreças IP
 a partir d'una adreça IP precedentament blocada.",
 'ipusubmit' => 'Suprimir aqueste blocatge',
 'unblocked' => '[[User:$1|$1]] es estat desblocat',
+'unblocked-range' => '$1 es estat desblocat',
 'unblocked-id' => 'Lo blocatge $1 es estat levat',
 'blocklist' => 'Utilizaires o adreças IP blocats',
 'ipblocklist' => 'Utilizaires o adreças IP blocats',
@@ -2787,6 +2798,13 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
 'spam_reverting' => 'Restabliment de la darrièra version que conten pas de ligam cap a $1',
 'spam_blanking' => 'Totas las versions que contenon de ligams cap a $1 son blanquidas',
 
+# Info page
+'pageinfo-subjectpage' => 'Pagina',
+'pageinfo-edits' => "Nombre d'edicions",
+'pageinfo-authors' => "Nombre d'autors distints",
+'pageinfo-views' => 'Nombre de vistas',
+'pageinfo-viewsperedit' => 'Visitas per modificacions',
+
 # Skin names
 'skinname-standard' => 'Estandard',
 'skinname-nostalgia' => 'Nostalgia',
@@ -3154,6 +3172,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-gpsdirection-m' => 'Nòrd magnetic',
 
 'exif-iimcategory-edu' => 'Educacion',
+'exif-iimcategory-evn' => 'Environament',
 'exif-iimcategory-hth' => 'Santat',
 'exif-iimcategory-lab' => 'Tribailh',
 'exif-iimcategory-pol' => 'Politic',
@@ -3264,6 +3283,7 @@ Confirmatz que desiratz tornar crear aqueste article.",
 'table_pager_first' => 'Primièra pagina',
 'table_pager_last' => 'Darrièra pagina',
 'table_pager_limit' => 'Far veire $1 elements per pagina',
+'table_pager_limit_label' => 'Elements per pagina:',
 'table_pager_limit_submit' => 'Accedir',
 'table_pager_empty' => 'Cap de resultat',
 
@@ -3405,6 +3425,7 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 # Special:ComparePages
 'compare-page1' => 'Pagina 1',
 'compare-page2' => 'Pagina 2',
+'compare-submit' => 'Comparar',
 
 # Database error messages
 'dberr-header' => 'Aqueste wiki a un problèma',
index ad8d236..7fc3eb5 100644 (file)
@@ -328,7 +328,7 @@ $messages = array(
 'january' => 'ଜାନୁଆରୀ',
 'february' => 'ଫେବୃଆରୀ',
 'march' => 'ମାର୍ଚ୍ଚ',
-'april' => 'à¬\8fପà­\8dରିଲ',
+'april' => 'à¬\85ପà­\8dରà­\87ଲ',
 'may_long' => 'ମେ',
 'june' => 'ଜୁନ',
 'july' => 'ଜୁଲାଇ',
@@ -340,7 +340,7 @@ $messages = array(
 'january-gen' => 'ଜାନୁଆରୀ',
 'february-gen' => 'ଫେବୃଆରୀ',
 'march-gen' => 'ମାର୍ଚ୍ଚ',
-'april-gen' => 'à¬\8fପà­\8dରିଲ',
+'april-gen' => 'à¬\85ପà­\8dରà­\87ଲ',
 'may-gen' => 'ମେ',
 'june-gen' => 'ଜୁନ',
 'july-gen' => 'ଜୁଲାଇ',
@@ -352,7 +352,7 @@ $messages = array(
 'jan' => 'ଜାନୁଆରୀ',
 'feb' => 'ଫେବୃଆରୀ',
 'mar' => 'ମାର୍ଚ୍ଚ',
-'apr' => 'à¬\8fପà­\8dରିଲ',
+'apr' => 'à¬\85ପà­\8dରà­\87ଲ',
 'may' => 'ମେ',
 'jun' => 'ଜୁନ',
 'jul' => 'ଜୁଲାଇ',
@@ -517,10 +517,10 @@ $1',
 'newmessageslink' => 'ନୂଆ ମେସେଜ',
 'newmessagesdifflink' => 'ଶେଷ ବଦଳ',
 'youhavenewmessagesmulti' => '$1 ତାରିଖରେ ନୂଆ ଚିଠିଟିଏ ଆସିଛି',
-'editsection' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
-'editold' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'editsection' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
+'editold' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'viewsourceold' => 'ମୂଳାଧାର ଦେଖିବେ',
-'editlink' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'editlink' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'viewsourcelink' => 'ମୂଳାଧାର ଦେଖିବେ',
 'editsectionhint' => '$1 ଭାଗଟିକୁ ବଦଳାଇବେ',
 'toc' => 'ଭିତର ଚିଜ',
@@ -2004,7 +2004,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
 
 'brokenredirects' => 'ଭଙ୍ଗା ପୁନପ୍ରେରଣ',
 'brokenredirectstext' => 'ତଳଲିଖିତ ପୁନପ୍ରେରଣ ସବୁ ସ୍ଥିତିହିନ ପୃଷ୍ଠାମାନଙ୍କୁ ପୁନପ୍ରେରିତ ହୋଇଥାଏ :',
-'brokenredirects-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'brokenredirects-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'brokenredirects-delete' => 'ଲିଭାଇବେ',
 
 'withoutinterwiki' => 'ଭାଷାର ଲିଙ୍କ ନଥିବା ପୃଷ୍ଠାମାନ',
@@ -2404,7 +2404,7 @@ $2ଙ୍କ ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସ୍କର
 'pagesize' => '(ବାଇଟ)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'restriction-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'restriction-move' => 'ଘୁଞ୍ଚାଇବେ',
 'restriction-create' => 'ଗଢ଼ନ୍ତୁ',
 'restriction-upload' => 'ଅପଲୋଡ଼ କରନ୍ତୁ',
@@ -3729,7 +3729,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'tags-display-header' => 'ବଦଳ ତାଲିକାରେ ଦେଖଣା',
 'tags-description-header' => 'ଅର୍ଥର ପୁରା ବିବରଣୀ',
 'tags-hitcount-header' => 'ଚିହ୍ନିତ ବଦଳ',
-'tags-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'tags-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'tags-hitcount' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}',
 
 # Special:ComparePages
index 9492418..2d4e482 100644 (file)
@@ -450,7 +450,7 @@ $2',
 Æхгæныны бындур уыд "\'\'$2\'\'".',
 'filereadonlyerror' => 'Нæ уайы фæивын файл "$1" уый тыххæй æмæ репозиторий "$2" кусы æрмæст фæрсыны уавæры.
 
-РаздæÑ\85Ñ\82 Ð±Ñ\8bндÑ\83Ñ\80 Ñ\83 "\'\'$3\'\'".',
+РадгæÑ\81, ÐºÃ¦Ñ\86Ñ\8b Ñ\81æвæÑ\80дÑ\82а Ð°Ñ\86Ñ\8b Ñ\83авæÑ\80, Ð½Ñ\8bÑ\83Ñ\83агÑ\8aÑ\82а Ð°Ñ\85æм Ð°Ð¼Ð¾Ð½Ã¦Ð½: "\'\'$3\'\'".',
 
 # Virus scanner
 'virus-badscanner' => "Æвзæр æвæрд: Нæзонгæ вирусты скане: ''$1''",
@@ -465,7 +465,7 @@ $2',
 'welcomecreation' => '== Ӕгас цу, $1! ==
 Дæ аккаунт арæзт æрцыдис.
 Ма дæ ферох уæт æркæсын дæ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} фадæттæм]].',
-'yourname' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼:',
+'yourname' => 'ФæÑ\81номÑ\8bг:',
 'yourpassword' => 'Пароль:',
 'yourpasswordagain' => 'Дæ пароль иу хатт ма:',
 'remembermypassword' => 'Бахъуыды мæ кæнæд ашы браузеры (максимум $1 {{PLURAL:$1|бонмæ|бонмæ}})',
@@ -489,7 +489,7 @@ $2',
 'createaccountmail' => 'адрисмæ гæсгæ',
 'createaccountreason' => 'Бындур:',
 'badretype' => 'Дыууæ хатты иу пароль хъуамæ ныффыстаис',
-'userexists' => 'Уыцы ном нæвдæлон у.
+'userexists' => 'Уыцы фæсномыг нæвдæлон у.
 Дæ хорзæхæй, равзар æндæр.',
 'loginerror' => 'Бахизыны рæдыд',
 'createaccounterror' => 'Нæ рауадис аккаунт саразын: $1',
@@ -502,23 +502,23 @@ $2',
 Дæ хорзæхæй, баиу цæ кæн æмæ нæуæгæй бафæлвар.',
 'nocookiesfornew' => 'Архайæджы аккаунт нæ сарæзт ис, уымæн æмæ йын мах нæ базыдтам йæ равзæрæн.
 Бацархай, цæмæй cookies иу уой, анæуæг кæн ацы фарс æмæ ногæй бафæлвар.',
-'noname' => 'Ð\94Ñ\8b Ð½Ã¦ Ð½Ñ\8bÑ\84Ñ\84Ñ\8bÑ\81Ñ\82ай Ñ\80аÑ\81Ñ\82 Ð°Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼.',
+'noname' => 'РаÑ\81Ñ\82 Ñ\84æÑ\81номÑ\8bг Ð½Ã¦ Ð½Ñ\8bÑ\84Ñ\84Ñ\8bÑ\81Ñ\82ай.',
 'loginsuccesstitle' => 'Бахизын рауадис',
 'loginsuccess' => "'''Ныр ды дæ хыст {{grammar:genitive|{{SITENAME}}}} куыд \"\$1\".'''",
 'nosuchuser' => 'Нæй ахæм архайæг "$1" номимæ.
 Архайджыты нæмттæ хатынц дамгъæты регистр.
 Сбæрæг æй кæн, раст ныффыстай ном, æви [[Special:UserLogin/signup|бакæн ног аккаунт]].',
-'nosuchusershort' => 'Нæй архайæг "$1" номимæ.
-Фен, ном раст ныффыстай, æви нæ.',
-'nouserspecified' => 'Ды хъуамæ зæгъай дæ ном.',
+'nosuchusershort' => 'Нæй архайæг "$1" фæсномыгимæ.
+Фен, фæсномыг раст ныффыстай, æви нæ.',
+'nouserspecified' => 'Ды хъуамæ зæгъай дæ фæсномыг.',
 'login-userblocked' => 'Ацы архайæг хъодыгонд у. Нæй гæнæн бахизын.',
 'wrongpassword' => 'Цы пароль ныффыстай, уый раст нæу.
 Лæмбынæгæй ныффысс дæ пароль',
 'wrongpasswordempty' => 'Пароль афтид у.
 Бафæлвар ногæй.',
 'passwordtooshort' => 'Паролтæ хъуамæ уой уæддæр {{PLURAL:$1|1 дамгъæйы|$1 дамгъæйы}} дæргъæн.',
-'password-name-match' => 'Дæ парол ма хъуамæ уа дæ номы хуызæн.',
-'password-login-forbidden' => 'Ацы архайæджы ном æмæ паролæй нæй гæнæн архайын.',
+'password-name-match' => 'Дæ парол ма хъуамæ уа дæ фæсномыгы хуызæн.',
+'password-login-forbidden' => 'Ацы фæсномыг æмæ паролæй нæй гæнæн архайын.',
 'mailmypassword' => 'Рарвит мæм ног пароль',
 'passwordremindertitle' => 'Ног рæстæгмæ пароль {{grammar:dative|{{SITENAME}}}}',
 'passwordremindertext' => 'Чидæр (æвæццæгæн ды, $1 IP адрисæй) æрдомтта ног парол {{grammar:dative|{{SITENAME}}}} ($4). "$2" архайæгæн арæзт æрцыд рæстæгмæ парол. Парол у "$3". Кæд уый ды уыдтæ, уæд дын ныр хъæудзæн бахизын æмæ равзарын ног парол.
@@ -531,8 +531,23 @@ $2',
 'blocked-mailpassword' => 'Дæ IP адрис уыд хъодыгонд ивынæй æмæ цæмæй мачи разнаггад кæна, уы тыххæй дзы нæй гæнæн парол раивын дæр.',
 'eauthentsent' => 'Бæлвырдгæнæн фыстæг æрвыст æрцыд амынд e-mail адрисмæ.
 Цæмæй дæм æндæр фыстæджытæ дæр цæуой, уый тыххæй дын хъæудзæн сæххæст кæнын фыстæджы фыст амындтытæ. Уый фæстæ сбæлвыд уыдзæн аккаунт æцæгдæр дæу кæй у, уый.',
+'throttled-mailpassword' => 'Паролрымысæн нырид æрвыст æрцыд фæстаг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.
+Цæмæй мачи разнагкад кæна, уый тыххæй æрмæст иу хатт ис гæнæн райсын рымысæнфыстæг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.',
 'mailerror' => 'Фыстæг арвитыны рæдыд: $1',
+'acct_creation_throttle_hit' => 'Ацы викимæ дæ IP адрисæй чи æрбацыдис, уыдон фæстаг боны мидæг бакодтой {{PLURAL:$1|1 аккаунт|$1 аккаунты}}. Уымæй фылдæр нæй гæнæн ахæм рæстæгмæ.
+Уый тыххæй, ацы тæккæ, ацы IP адрисæй уазджытæн сæ бон нæу бакæнын аккаунттæ.',
+'emailauthenticated' => 'Дæ e-mail уыд бæлвырдгонд $2 $3 сахатыл.',
+'emailnotauthenticated' => 'Дæ e-mail адрис нырмæ нæу бæлвырдгонд.
+Иу e-mail дæр дæм нæ уыдзæн æрвыст ацы функцитæй.',
+'noemailprefs' => 'Бафысс e-mail адрис дæ фадæтты, цæмæй ацы функцитæ кусой.',
 'emailconfirmlink' => 'Дæ электронон посты адрис сфидар кæн',
+'invalidemailaddress' => 'E-mail нæй гæнæн райсын, уымæн æмæ йæ формат раст нæу.
+Бафысс раст форматы адрис кæнæ та йæ сафтид кæн.',
+'cannotchangeemail' => 'Аккаунты e-mail нæй гæнæн ивын ацы викийы.',
+'emaildisabled' => 'Ацы сайтæн йæ бон нæу æрвитын e-mail.',
+'accountcreated' => 'Аккаунт конд æрцыд',
+'accountcreatedtext' => '$1 архайæджы аккаунт конд æрцыд.',
+'createaccount-title' => '{{grammar:genitive|{{SITENAME}}}} аккант бакæнын',
 'loginlanguagelabel' => 'Æвзаг: $1',
 
 # Change password dialog
@@ -545,9 +560,9 @@ $2',
 'resetpass-temp-password' => 'Рæстæгмæ пароль:',
 
 # Special:PasswordReset
-'passwordreset-username' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼:',
+'passwordreset-username' => 'ФæÑ\81номÑ\8bг:',
 'passwordreset-email' => 'Электрон посты адрис:',
-'passwordreset-emailelement' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼: $1
+'passwordreset-emailelement' => 'ФæÑ\81номÑ\8bг: $1
 Рæстæгмæ пароль: $2',
 
 # Special:ChangeEmail
@@ -600,7 +615,7 @@ $2',
 кæнæ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} агурын йæ кой логты]</span>.',
 'note' => "'''Бафиппай:'''",
 'previewnote' => "'''Зон æй, æмæ ай у æрмæстдæр разбакаст.'''
-Дæ ивдтытæ нырмæ æвæрд не рцыдысты! [[#editform|→ Дарддæр ивын]]",
+Дæ ивдтытæ нырмæ æвæрд не рцыдысты!",
 'editing' => 'Ивд цæуы $1',
 'editingsection' => 'Ивыс $1 (фарсы хай)',
 'editconflict' => 'Ивыны конфликт: $1',
@@ -658,11 +673,11 @@ $2',
 'history-feed-item-nocomment' => '$1 $2',
 
 # Revision deletion
-'rev-deleted-comment' => '(ивды афыст æппæрст æрцыд)',
-'rev-deleted-user' => '(архайæджы ном аппæрст у)',
-'rev-deleted-event' => '(фыст аппæрст у)',
+'rev-deleted-comment' => '(ивды афыст хафт у)',
+'rev-deleted-user' => '(фæсномыг хафт у)',
+'rev-deleted-event' => '(фыст хафт у)',
 'rev-delundel' => 'равдисын/айсын',
-'revisiondelete' => 'Ð\90ппаÑ\80 / Ñ\80аÑ\86аÑ\80аз фарсы фæлтæртæ',
+'revisiondelete' => 'СÑ\85аÑ\84Ñ\8bн/Ñ\80аÑ\86аÑ\80азÑ\8bн фарсы фæлтæртæ',
 'revdel-restore' => 'ивын зынæн',
 'revdel-restore-deleted' => 'хафт ивдтытæ',
 'revdel-restore-visible' => 'зынгæ ивдтытæ',
@@ -778,7 +793,7 @@ $2',
 'prefs-custom-css' => 'Хиæвæрд CSS',
 'prefs-custom-js' => 'Хиæвæрд JavaScript',
 'youremail' => 'E-mail:',
-'username' => 'РегиÑ\81Ñ\82Ñ\80аÑ\86игонд Ð½Ð¾Ð¼:',
+'username' => 'ФæÑ\81номÑ\8bг:',
 'uid' => 'Архайæджы ID:',
 'yourrealname' => 'Æцæг ном:',
 'yourlanguage' => 'Техникон фыстыты æвзаг:',
@@ -838,7 +853,7 @@ $2',
 'action-edit' => 'ацы фарс ивын',
 'action-createpage' => 'фæрстæ кæнын',
 'action-createtalk' => 'тæрхоны фæрстæ кæнын',
-'action-createaccount' => 'ацы архайæджы ном аразын',
+'action-createaccount' => 'саразын ацы архайæджы аккаунт',
 'action-minoredit' => 'ацы ивд чысылæй нысан кæнын',
 'action-move' => 'ацы фарсы ном ивын',
 'action-movefile' => 'ацы файлы ном ивын',
@@ -895,7 +910,7 @@ $3',
 'uploaderror' => 'Файл сæвæрыны рæдыд',
 'uploadlogpage' => 'Æвгæндты лог',
 'filename' => 'Файлы ном',
-'filedesc' => 'Ð\98вдÑ\82Ñ\8bÑ\82Ñ\8b Ð°фыст:',
+'filedesc' => 'Ð\90фыст:',
 'minlength1' => 'Файлы номы хъуамæ æппынкъаддæр иу дамгъæ уа.',
 'badfilename' => 'Нывы ном ивд æрцыдис. Ныр хуины «$1».',
 'savefile' => 'Бавæр æй',
@@ -1124,7 +1139,7 @@ $3',
 'sp-contributions-logs' => 'логтæ',
 'sp-contributions-talk' => 'ныхас',
 'sp-contributions-search' => 'Бавæрд агурæн',
-'sp-contributions-username' => 'IP адрис кæнæ архайæджы ном:',
+'sp-contributions-username' => 'IP адрис кæнæ фæсномыг:',
 'sp-contributions-toponly' => 'Æвдисæт æрмæст фæстаг ивдтытæ',
 'sp-contributions-submit' => 'Агурын',
 
index b652786..13911c9 100644 (file)
@@ -149,6 +149,7 @@ $messages = array(
 'category-subcat-count' => '{{ਕੁਲ   $2 ਸ਼੍ਰੇਣੀਆਂ ਵਿਚੌਂ , PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼ ਹੇਠ ਲਿਖੀ ਸ਼੍ਰੇਣੀ ਹੈ|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਨਿਮਿਨਲਿਖਿਤ {{PLURAL:$1|ਉਪ ਸ਼੍ਰੇਣੀ ਹੈ|$1ਉਪਸ਼੍ਰੇਣੀਆਂ ਹਨ}}  }}',
 'category-article-count' => '{{ ਕੁਲ $2 ਲੇਖਾਂ ਵਿਚੌਂ , PLURAL:$2| ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼  ਨਿਮਨਲਿਖਿਤ  {{PLURAL:$1|ਲੇਖ ਹੈ|$1 ਲੇਖ ਹਨ}}, }}',
 'listingcontinuesabbrev' => 'ਅਗੇ.',
+'noindex-category' => 'ਕ੍ਰਮਸੂਚੀ ਰਹਿਤ ਸਫ਼ੇ',
 
 'about' => 'ਇਸ ਬਾਰੇ',
 'article' => 'ਸਮੱਗਰੀ ਪੇਜ',
@@ -324,6 +325,7 @@ A list of valid special pages can be found at [[Special:SpecialPages]].',
 'internalerror' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ',
 'internalerror_info' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ: $1',
 'badtitle' => 'ਗਲਤ ਟਾਇਟਲ',
+'badtitletext' => 'ਤੁਹਾਡਾ ਅਰਜ਼ਿਤ ਸਿਰਲੇਖ ਅਪ੍ਰਮਾਣਿਕ,ਖਾਲੀ ਯਾ ਗਲਤ ਜੁੜਿਆ ਹੋਇਆ ਅੰਤਰ-ਭਾਸ਼ਾ ਯਾ ਅੰਤਰ-ਵਿਕਿ ਸਿਰਲੇਖ ਹੈ।ਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਵਿਚ ਇਕ ਦੋ ਅੱਖਰ ਐਸੇ ਹੋਣ ਜੋ ਸਿਰਲੇਖ ਵਿਚ ਵਰਤੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
 'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'protectedpagetext' => 'ਇਸ ਪੰਨੇ ਨੂੰ ਐਡਿਟ ਕਰਨ ਦੀ ਮਨਾਹੀ ਹੈ।',
 'viewsourcetext' => 'ਤੁਸੀਂ ਇਸ ਪੰਨੇ ਦਾ ਸੋਮਾ ਦੇਖ ਸਕਦੇ ਹੋ ਤੇ ਉਸ ਦਾ ਉਤਾਰਾ ਵੀ ਲੈ ਸਕਦੇ ਹੋ।',
@@ -470,7 +472,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 ਯਾ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਨ ਕਰ ਸਕਦੇ ਹੋ]</span>।',
 'updated' => '(ਅੱਪਡੇਟ)',
 'note' => "'''ਨੋਟ:'''",
-'previewnote' => "'''ਇਹ ਸਿਰਫ਼ ਇੱਕ ਝਲਕ ਹੈ; ਬਦਲਾਅ ਹਾਲੇ ਸੰਭਾਲੇ ਨਹੀਂ ਗਏ ਹਨ!'''",
+'previewnote' => 'ਇਹ ਸਿਰਫ਼ ਇੱਕ ਝਲਕ ਹੈ; ਬਦਲਾਅ ਹਾਲੇ ਸੰਭਾਲੇ ਨਹੀਂ ਗਏ ਹਨ!',
 'editing' => '$1 ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ',
 'editingsection' => '$1 (ਸ਼ੈਕਸ਼ਨ) ਸੋਧ',
 'editingcomment' => '$1 (ਟਿੱਪਣੀ) ਸੋਧ',
@@ -478,7 +480,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'yourtext' => 'ਤੁਹਾਡਾ ਟੈਕਸਟ',
 'storedversion' => 'ਸੰਭਾਲਿਆ ਵਰਜਨ',
 'yourdiff' => 'ਅੰਤਰ',
-'templatesused' => 'à¨\87ਸ à¨ªà©\87à¨\9c à¨\89ੱਤà©\87 à¨\9fà©\88ਪਲà©\87à¨\9f à¨µà¨°à¨¤à¨¿à¨\86 à¨\9cਾà¨\82ਦਾ à¨¹à©\88:',
+'templatesused' => 'à¨\87ਸ à¨¸à¨«à©\87 à¨¤à©\87 à¨ªà©\8dਰà©\8dਯà©\8bà¨\97ਿਤ {{PLURAL:$1|ਫਰਮਾ|ਫਰਮà©\87}}:',
 'templatesusedpreview' => "{{PLURAL:$1|ਟੈਪਲੇਟ|ਟੈਪਲੇਟ}} ਇਹ ਝਲਕ 'ਚ ਵਰਤੇ ਜਾਂਦੇ ਹਨ:",
 'templatesusedsection' => 'ਇਹ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਟੈਪਲੇਟ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ:',
 'template-protected' => '(ਸੁਰੱਖਿਅਤ)',
@@ -489,6 +491,8 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''ਖ਼ਬਰਦਾਰ: ਸੰਚੇ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਕੁਝ ਸੰਚੇ ਛੁਟ ਜਾਣਗੇ।",
 'post-expand-template-inclusion-category' => 'ਉਹ ਪੰਨੇ ਜਿਥੇ ਸੰਚਿਆਂ ਦਾ ਅਕਾਰ ਨਿਣਮਿਤ ਹੱਦ ਤੌਂ ਵੱਧ ਹੈ।',
+'post-expand-template-argument-warning' => "'''ਖ਼ਬਰਦਾਰ'''ਇਸ ਸਫ਼ੇ ਤੇ ਕਿਸੇ ਫ਼ਰਮੇ ਵਿਚ ਘੱਟੋ ਘੱਟ ਇਕ ਸਁਘਟਕ ਐਸਾ ਹੈ ਜਿਸ ਦਾ ਵਿਸਤ੍ਰਿਤ ਰੂਪ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਐਸੇ ਸਁਘਟਕਾਂ ਨੂਁ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
+'post-expand-template-argument-category' => 'ਐਸੇ ਸਫ਼ੇ ਜਿਨ੍ਹਾਂ ਵਿਚ ਫ਼ਰਮੇ ਦੇ ਸਁਘਟਕ ਛੁੱਟ ਗਏ ਹਨ ।',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'ਅਕਾਊਂਟ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
@@ -507,6 +511,8 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'last' => 'ਆਖਰੀ',
 'page_first' => 'ਪਹਿਲਾਂ',
 'page_last' => 'ਆਖਰੀ',
+'history-fieldset-title' => 'ਇਤਿਹਾਸ ਤੇ ਇਕ ਨਜ਼ਰ ਮਾਰੋ ।',
+'history-show-deleted' => 'ਕੇਵਲ ਮਿਟਾਏ ਗਏ',
 'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾਂ',
 'histlast' => 'ਸਭ ਤੋਂ ਨਵਾਂ',
 'historysize' => '($1 ਬਾਈਟ)',
@@ -538,6 +544,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'revertmerge' => 'ਬਿਨ-ਮਿਲਾਨ',
 
 # Diffs
+'history-title' => '"$1" ਦੀ ਸ਼ੋਧ ਤਵਾਰੀਖ',
 'difference' => '(ਰੀਵਿਜ਼ਨ ਵਿੱਚ ਅੰਤਰ)',
 'lineno' => 'ਲਾਈਨ $1:',
 'compareselectedversions' => 'ਚੁਣੇ ਵਰਜਨਾਂ ਦੀ ਤੁਲਨਾ',
@@ -560,6 +567,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 ਅਗਲਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
 'shown-title' => 'ਪ੍ਰਤੀ ਪੇਜ਼ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}} ਵੇਖਾਓ',
 'viewprevnext' => 'ਵੇਖੋ ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''ਇਸ ਵਿਕਿ ਤੇ \"[[:\$1]]\" ਨਾਮ ਦਾ ਇਕ ਸਫ਼ਾ ਹੈ'''",
 'searchmenu-new' => "'''ਇਸ ਵਿਕਿ ਪਰ \"[[:\$1]]\" ਨਾਮ ਨਾਲ ਪੰਨਾ ਬਣਾਓ!'''",
 'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
 'searchprofile-articles' => 'ਸਮੱਗਰੀ ਪੇਜ',
@@ -667,6 +675,9 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 # User rights log
 'rightsnone' => '(ਕੋਈ ਨਹੀਂ)',
 
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'ਇਹ ਪੰਨਾ ਸੋਧੋ',
+
 # Recent changes
 'recentchanges' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ',
 'recentchanges-legend' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ ਚੋਣਾਂ',
@@ -699,6 +710,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'recentchangeslinked-feed' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
 'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
 'recentchangeslinked-title' => '"$1" ਨਾਲ ਸੰਬੰਧਿਤ ਬਦਲਾਅ',
+'recentchangeslinked-noresult' => 'ਜੁੜੇ ਹੋਏ ਸਫਿਆਂ ਤੇ ,ਦਿੱਤੇ ਸਮੇਂ ਵਿਚ ਕੁਝ ਨਹੀਂ ਬਦਲਿਆ ।',
 'recentchangeslinked-summary' => 'ਇਹ ਸੂਚੀ ਊਨ੍ਹਾਂ ਪੰਨਿਆਂ ,ਜੋ ਇਕ ਖਾਸ ਪੰਨੇ ਨਾਲ ਸੰਬੰਧਿਤ ਹਨ, (ਯਾ ਕਿਸੇ ਖਾਸ ਸ਼੍ਰੇਣੀ ਦੇ ਮੈਂਬਰਾਂ) ਦੇ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਵਾਂ ਨੂੰ ਦਰਸ਼ਾਂਦੀ ਹੈ [[Special:Watchlist|ਤੁਹਾਡੀ ਦ੍ਰਿਸ਼ਟੀ ਗੋਚਰ ਸੂਚੀ]] ਵਿਚ ਮੌਜੂਦ ਪੰਨੇ ਮੋਟੇ ਅਖਰਾਂ ਵਿਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
 'recentchangeslinked-page' => 'ਸਫ਼ਾ ਨਾਂ:',
 'recentchangeslinked-to' => 'ਇਸ ਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਦਿਖਾਓ',
@@ -745,7 +757,7 @@ to upload files.',
 'upload-curl-error28' => 'ਅੱਪਲੋਡ ਟਾਈਮ-ਆਉਟ',
 
 'license' => 'ਲਾਈਸੈਂਸਿੰਗ:',
-'license-header' => 'ਲਾà¨\88ਸà©\88à¨\82ਸਿੰà¨\97:',
+'license-header' => 'ਵਰਤਣ à¨²à¨\88 à¨®à©°à¨\9c਼à©\82ਰà©\80 à¨¦à©\87ਣਾ',
 'nolicense' => 'ਕੁਝ ਵੀ ਚੁਣਿਆ',
 'license-nopreview' => '(ਝਲਕ ਉਪਲੱਬਧ ਨਹੀਂ)',
 'upload_source_file' => ' (ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਇੱਕ ਫਾਇਲ)',
@@ -777,6 +789,7 @@ to upload files.',
 'filehist-comment' => 'ਟਿੱਪਣੀ',
 'imagelinks' => 'ਫ਼ਾਈਲ ਦੀ ਵਰਤੌਂ',
 'linkstoimage' => 'ਹੇਠ ਲਿਖਿਤ {{PLURAL:$1|ਪੰਨੇ ਦਾ ਹਵਾਲਾ ਹੈ|$1 ਪੰਨੇ ਦੇ ਹਵਾਲੇ ਹਨ}} to this file:',
+'nolinkstoimage' => 'ਇਸ ਮਿਸਲ ਨਾਲ ਕੋਈ ਵਿ ਸਫ਼ੇ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ ।',
 'sharedupload-desc-here' => 'ਇਹ ਮਿਸਲ $1 ਦੀ ਹੈ ਅਤੇ ਹੋਰ ਪ੍ਰਾਜੈਕਟਾਂ ਵਿਚ ਵੀ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ । ਇਸ ਦੇ [$2 ਮਿਸਲ ਵਾਲੇ ਬ੍ਰਿਤਾਂਤ ਪੰਨੇ] ਵਿਚ ਮੌਜੂਦ ਵਰਨਣ ਨਿਮਨ ਲਿਖਿਤ ਹੈ।',
 'uploadnewversion-linktext' => 'ਇਸ ਫਾਇਲ ਦਾ ਇੱਕ ਨਵਾਂ ਵਰਜਨ ਅੱਪਲੋਡ ਕਰੋ',
 
@@ -857,6 +870,7 @@ to upload files.',
 
 # Special:LinkSearch
 'linksearch' => 'ਬਾਹਰੀ ਲਿੰਕ',
+'linksearch-line' => '$2 ਵਿਚ $1 ਬਾਹਰੀ ਸਿਰਨਾਵਾਂ ਹੈ',
 
 # Special:ListUsers
 'listusers-submit' => 'ਵੇਖੋ',
@@ -884,6 +898,7 @@ to upload files.',
 # Watchlist
 'watchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
 'mywatchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
+'watchlistfor2' => '$1 $2 ਲਈ',
 'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'watch' => 'ਵਾਚ',
 'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
@@ -909,6 +924,7 @@ to upload files.',
 'delete-confirm' => '"$1" ਹਟਾਓ',
 'delete-legend' => 'ਹਟਾਓ',
 'actioncomplete' => 'ਐਕਸ਼ਨ ਪੂਰਾ ਹੋਇਆ',
+'actionfailed' => 'ਹਰਕਤ ਨਿਸ਼ਫ਼ਲ',
 'dellogpage' => 'ਹਟਾਉਣ ਲਾਗ',
 'deletecomment' => 'ਕਾਰਨ:',
 'deleteotherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
@@ -961,9 +977,12 @@ to upload files.',
 'mycontris' => 'ਮੇਰਾ ਯੋਗਦਾਨ',
 'contribsub2' => '$1 ($2) ਲਈ',
 'uctop' => '(ਉੱਤੇ)',
+'month' => 'ਇਸ(ਯਾ ਹੋਰ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੌਂ',
+'year' => 'ਇਸ(ਜਾਂ ਹੋਰ ਪਿਛਲੇ) ਸਾਲ ਤੌਂ',
 
 'sp-contributions-newbies-sub' => 'ਨਵੇਂ ਅਕਾਊਂਟਾਂ ਲਈ',
 'sp-contributions-blocklog' => 'ਪਾਬੰਦੀ ਲਾਗ',
+'sp-contributions-uploads' => 'ਅਪਲੋਡ',
 'sp-contributions-logs' => 'ਲਾਗ',
 'sp-contributions-talk' => 'ਗੱਲਬਾਤ',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
@@ -983,6 +1002,7 @@ to upload files.',
 'whatlinkshere-next' => '{{PLURAL:$1|ਅਗਲਾ|ਅਗਲੇ $1}}',
 'whatlinkshere-links' => '← ਲਿੰਕ',
 'whatlinkshere-hideredirs' => '$1 ਗੈਰਸਿਧਾ',
+'whatlinkshere-hidetrans' => '$1 ਇੱਥੇ ਕੀ ਕੀ ਜੁੜਦਾ ਹੈ।',
 'whatlinkshere-hidelinks' => '$1 ਲਿੰਕ',
 'whatlinkshere-hideimages' => '$1 ਸੰਬੰਧਿਤ ਚਿਤਰ',
 'whatlinkshere-filters' => 'ਫਿਲਟਰ',
@@ -1051,6 +1071,7 @@ to upload files.',
 # Thumbnails
 'thumbnail-more' => 'ਫੈਲਾਓ',
 'filemissing' => 'ਫਾਇਲ ਗੁੰਮ ਹੈ',
+'thumbnail_error' => 'ਅਁਗੂਠਾ ਝਲਕ ਬਨਾਉਣ ਵਿਚ ਗਲਤੀ ਹੋਈ ਹੈ : $1',
 
 # Special:Import
 'import' => 'ਪੇਜ ਇੰਪੋਰਟ ਕਰੋ',
@@ -1115,10 +1136,12 @@ to upload files.',
 'tooltip-ca-nstab-template' => 'ਟੈਪਲੇਟ ਵੇਖੋ',
 'tooltip-ca-nstab-help' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
 'tooltip-ca-nstab-category' => 'ਕੈਟਾਗਰੀ ਪੇਜ ਵੇਖੋ',
+'tooltip-minoredit' => 'ਇਸ ਤੇ ਛੋਟੇ ਬਦਲਾਅ ਦਾ  ਨਿਸ਼ਾਨ ਲਾਓ',
 'tooltip-save' => 'ਆਪਣੇ ਬਦਲਾਅ ਸੰਭਾਲੋ',
 'tooltip-preview' => 'ਆਪਣੇ ਬਦਲਾਅ ਦੀ ਝਲਕ ਵੇਖੋ, ਸੰਭਾਲਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ ਜੀ!',
 'tooltip-diff' => 'ਇਸ ਪਾਠ ਵਿਚ ਆਪਣੇ ਕੀਤੇ ਹੋਏ ਬਦਲਾਅ ਦੇਖੋ',
 'tooltip-compareselectedversions' => 'ਇਸ ਪੰਨੇ ਦੇ ਚੁਣੇ ਹੋਏ ਸ਼ੋਧਾਂ ਵਿਚ ਫ਼ਰਕ ਦੇਖੋ',
+'tooltip-watch' => 'ਇਹ ਸਫ਼ੇ ਨੂੰ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
 'tooltip-upload' => 'ਅੱਪਲੋਡ ਸਟਾਰਟ ਕਰੋ',
 'tooltip-rollback' => "'' ਵਾਪਸ ਲੈ ਜਾਓ '' ਇਕ ਝਟਕੇ ਵਿਚ ਹੀ ਪਿਛਲੇ ਯੂਜ਼ਰ ਦੇ ਬਦਲਾਵਾਂ ਨੂੰ ਗਾਇਬ ਕਰ ਦੇਂਦਾ ਹੈ।",
 'tooltip-undo' => '" ਪੁਰਾਣੀ ਹਾਲਤ ਵਿਚ ਪਰਤੋ " ਇਸ ਬਦਲਾਅ ਨੂੰ ਰੱਦ ਕਰਕੇ ਸੰਪਾਦਨ ਫਾਰਮ ਨੂੰ ਝਲਕ ਦੇ ਅੰਦਾਜ਼ ਵਿਚ ਦਿਖਾਂਦਾ ਹੈ।
@@ -1167,6 +1190,7 @@ to upload files.',
 # Metadata
 'metadata' => 'ਮੇਟਾ ਡੈਟਾ',
 'metadata-help' => 'ਇਸ ਮਿਸਲ ਵਿਚ ਵਾਧੂ ਜਾਨਕਾਰੀਆਂ ਹਨ , ਜੋ ਸ਼ਾਇਦ ਉਸ ਕੈਮਰੇ ਯਾ ਸਕੈਨਰ ਦੀ ਦੇਣ ਹਨ ਜੋਕਿ ਇਸ ਮਿਸਲ ਨੂੰ ਬਨਾਉਣ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।ਅਗ਼ਰ ਇਹ ਮਿਸਲ ਬਦਲਾਈ ਗਈ ਹੈ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕੁਝ ਵੇਰਵੇ ਬਦਲੀ ਮਿਸਲ ਦਾ ਸਹੀ ਰੂਪਮਾਨ ਨਾ ਹੋਣ।',
+'metadata-fields' => 'ਮੈਟਾਡੈਟਾ ਸੂਚੀ ਪਟ ਨੂੰ ਛੋਟਾ ਕਰਣ ਨਾਲ ਇਸ ਸੁਨੇਹੇ ਵਿਚ ਸੂਚੀਬੱਧ ਫ਼ੀਲਡ ਮੂਰਤ ਦੇ ਦ੍ਰਿਸ਼ ਵਿਚ ਸ਼ਾਮਲ ਕੀਤੇ ਜਾਣਗੇ।ਬਾਕੀ ਫ਼ੀਲਡਾਂ ਨੂੰ ਛਿਪਾਇਆ ਜਾਏਗਾ।',
 
 # EXIF tags
 'exif-imagewidth' => 'ਚੌੜਾਈ',
index bac0984..41bb259 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Als-Holder
  * @author M-sch
+ * @author Manuae
  * @author SPS
  * @author Xqt
  */
@@ -19,380 +20,395 @@ $messages = array(
 # User preference toggles
 'tog-showtoolbar' => "Werkzaich zum Bearwaide zaische (dodezu braucht's JavaScript)",
 
-'underline-always'  => 'Immer',
-'underline-never'   => 'Garnet',
+'underline-always' => 'Immer',
+'underline-never' => 'Garnet',
 'underline-default' => 'Des nemme, was em Broweser gsaacht hoscht.',
 
 # Dates
-'january'       => 'Jänner',
-'february'      => 'Fewwer',
-'march'         => 'März',
-'april'         => 'Abril',
-'may_long'      => 'Mai',
-'june'          => 'Juni',
-'july'          => 'Juli',
-'august'        => 'Auguscht',
-'september'     => 'Sebdember',
-'october'       => 'Ogdower',
-'november'      => 'November',
-'december'      => 'Dezember',
-'january-gen'   => 'Jänner',
-'february-gen'  => 'Fewwer',
-'march-gen'     => 'März',
-'april-gen'     => 'Abril',
-'may-gen'       => 'Mai',
-'june-gen'      => 'Juni',
-'july-gen'      => 'Juli',
-'august-gen'    => 'Auguscht',
+'january' => 'Jänner',
+'february' => 'Fewwer',
+'march' => 'März',
+'april' => 'Abril',
+'may_long' => 'Mai',
+'june' => 'Juni',
+'july' => 'Juli',
+'august' => 'Auguscht',
+'september' => 'Sebdember',
+'october' => 'Ogdower',
+'november' => 'November',
+'december' => 'Dezember',
+'january-gen' => 'Jänner',
+'february-gen' => 'Fewwer',
+'march-gen' => 'März',
+'april-gen' => 'Abril',
+'may-gen' => 'Mai',
+'june-gen' => 'Juni',
+'july-gen' => 'Juli',
+'august-gen' => 'Auguscht',
 'september-gen' => 'Sebdember',
-'october-gen'   => 'Ogdower',
-'november-gen'  => 'November',
-'december-gen'  => 'Dezember',
-'jan'           => 'Jän',
-'feb'           => 'Few',
-'mar'           => 'Mär',
-'apr'           => 'Abr',
-'may'           => 'Mai',
-'jun'           => 'Jun',
-'jul'           => 'Jul',
-'aug'           => 'Aug',
-'sep'           => 'Seb',
-'oct'           => 'Ogd',
-'nov'           => 'Nov',
-'dec'           => 'Dez',
+'october-gen' => 'Ogdower',
+'november-gen' => 'November',
+'december-gen' => 'Dezember',
+'jan' => 'Jän',
+'feb' => 'Few',
+'mar' => 'Mär',
+'apr' => 'Abr',
+'may' => 'Mai',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Aug',
+'sep' => 'Seb',
+'oct' => 'Ogd',
+'nov' => 'Nov',
+'dec' => 'Dez',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Kadegorie|Kadegorie}}',
-'category_header'        => 'Saide in de Kadegorie „$1“',
-'subcategories'          => 'Unnerkadegorie',
-'category-media-header'  => 'Medie in de Kadegorie „$1“',
-'hidden-categories'      => '{{PLURAL:$1|Versteckelte Kadegorie|Versteckelte Kadegorie}}',
-'category-subcat-count'  => '{{PLURAL:$2|Die Kategorie hot die Unnerkategorie:|{{PLURAL:$1|Die Unnerkategori isch eni vun insgsamt $2 Unnerkategorie in derre Kategorie:|S werre $1 vun insgsamt $2 Unnerkategorie in derre Kategorie aagezeicht:}}}}',
+'pagecategories' => '{{PLURAL:$1|Kadegorie|Kadegorie}}',
+'category_header' => 'Saide in de Kadegorie „$1“',
+'subcategories' => 'Unnerkadegorie',
+'category-media-header' => 'Medie in de Kadegorie „$1“',
+'hidden-categories' => '{{PLURAL:$1|Versteckelte Kadegorie|Versteckelte Kadegorie}}',
+'category-subcat-count' => '{{PLURAL:$2|Die Kategorie hot die Unnerkategorie:|{{PLURAL:$1|Die Unnerkategori isch eni vun insgsamt $2 Unnerkategorie in derre Kategorie:|S werre $1 vun insgsamt $2 Unnerkategorie in derre Kategorie aagezeicht:}}}}',
 'category-article-count' => "{{PLURAL:$2|In derre Kadegorie hot's numme die Said.|Die {{PLURAL:$1|Said|$1 Saide}} gebbt's in derre Kadegorie, vun insgsamt $2.}}",
 'listingcontinuesabbrev' => '(Forts.)',
 
-'about'      => 'Iwwer',
-'newwindow'  => '(werd im e naie Fenschter uffgmacht)',
-'cancel'     => 'Abbreche',
-'mytalk'     => 'Gebabbel mit dir',
+'about' => 'Iwwer',
+'newwindow' => '(werd im e naie Fenschter uffgmacht)',
+'cancel' => 'Abbreche',
+'mytalk' => 'Gebabbel mit dir',
 'navigation' => 'Navigation',
 
 # Cologne Blue skin
-'qbfind'      => 'Finne',
-'qbedit'      => 'Bearwaide',
+'qbfind' => 'Finne',
+'qbedit' => 'Bearwaide',
 'qbmyoptions' => 'Mai Saide',
 
 # Vector skin
 'vector-action-move' => 'Verschiewe',
-'vector-view-edit'   => 'Bearwaide',
-
-'errorpagetitle'   => 'Fehler',
-'returnto'         => 'Zrick zu $1.',
-'tagline'          => 'Vun {{SITENAME}}',
-'help'             => 'Hilfe',
-'search'           => 'Suche',
-'searchbutton'     => 'Suche',
-'go'               => 'Adiggel',
-'searcharticle'    => 'Suche',
-'history'          => 'Gschicht vun de Said',
-'history_short'    => 'Versione',
+'vector-view-edit' => 'Bearwaide',
+
+'errorpagetitle' => 'Fehler',
+'returnto' => 'Zrick zu $1.',
+'tagline' => 'Vun {{SITENAME}}',
+'help' => 'Hilfe',
+'search' => 'Suche',
+'searchbutton' => 'Suche',
+'go' => 'Adiggel',
+'searcharticle' => 'Suche',
+'history' => 'Gschicht vun de Said',
+'history_short' => 'Versione',
 'printableversion' => 'Druck-Aasicht',
-'permalink'        => 'Permanentlink',
-'print'            => 'Ausdrugge',
-'edit'             => 'Bearwaide',
-'create'           => 'Aaleche',
-'editthispage'     => 'Die Said bearwaide',
-'delete'           => 'Lesche',
-'undelete_short'   => '{{PLURAL:$1|ä Ännerung|$1 Ännerunge}} widderherschdelle',
-'protect'          => 'schitze',
-'protect_change'   => 'ännere',
-'unprotect'        => 'Widder freigewwe',
-'newpage'          => 'Naie Said',
-'talkpage'         => 'Iwwer die Said dischbediere',
+'permalink' => 'Permanentlink',
+'print' => 'Ausdrugge',
+'edit' => 'Bearwaide',
+'create' => 'Aaleche',
+'editthispage' => 'Die Said bearwaide',
+'delete' => 'Lesche',
+'undelete_short' => '{{PLURAL:$1|ä Ännerung|$1 Ännerunge}} widderherschdelle',
+'protect' => 'schitze',
+'protect_change' => 'ännere',
+'unprotect' => 'Widder freigewwe',
+'newpage' => 'Naie Said',
+'talkpage' => 'Iwwer die Said dischbediere',
 'talkpagelinktext' => 'Dischbediere',
-'personaltools'    => 'Perseenliche Werkzeische',
-'talk'             => 'Dischbediere',
-'views'            => 'Wievielmol aageguckt',
-'toolbox'          => 'Werkzaich',
-'otherlanguages'   => 'In annere Sproche',
-'redirectedfrom'   => '(Wairrerglaidet vun $1)',
-'redirectpagesub'  => 'Wairerlaidungssaid',
-'lastmodifiedat'   => 'Die Said isch zum ledschde Mol gänneret woore am $1, am $2.',
-'viewcount'        => 'Die Seid isch bis jetzerd {{PLURAL:$1|$1|$1}} mol uffgerufe worre.',
-'jumpto'           => 'Spring zu:',
+'personaltools' => 'Perseenliche Werkzeische',
+'talk' => 'Dischbediere',
+'views' => 'Wievielmol aageguckt',
+'toolbox' => 'Werkzaich',
+'otherlanguages' => 'In annere Sproche',
+'redirectedfrom' => '(Wairrerglaidet vun $1)',
+'redirectpagesub' => 'Wairerlaidungssaid',
+'lastmodifiedat' => 'Die Said isch zum ledschde Mol gänneret woore am $1, am $2.',
+'viewcount' => 'Die Seid isch bis jetzerd {{PLURAL:$1|$1|$1}} mol uffgerufe worre.',
+'jumpto' => 'Spring zu:',
 'jumptonavigation' => 'Navigation',
-'jumptosearch'     => 'Suche',
+'jumptosearch' => 'Suche',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => 'Iwwer {{SITENAME}}',
-'aboutpage'            => 'Project:Iwwer',
-'copyright'            => 'Was do drin schdeht isch unner $1 verfiechbar.',
-'copyrightpage'        => '{{ns:project}}:Urhewerrecht',
-'currentevents'        => 'Was grad so bassiert isch',
-'disclaimers'          => 'Hafdungsausschluß',
-'disclaimerpage'       => 'Project:Impressum',
-'edithelp'             => 'Hilf fer s Bearwaide',
-'edithelppage'         => 'Help:Ännere',
-'helppage'             => 'Help:Inhalt',
-'mainpage'             => 'Hääptsaid',
+'aboutsite' => 'Iwwer {{SITENAME}}',
+'aboutpage' => 'Project:Iwwer',
+'copyright' => 'Was do drin schdeht isch unner $1 verfiechbar.',
+'copyrightpage' => '{{ns:project}}:Urhewerrecht',
+'currentevents' => 'Was grad so bassiert isch',
+'disclaimers' => 'Hafdungsausschluß',
+'disclaimerpage' => 'Project:Impressum',
+'edithelp' => 'Hilf fer s Bearwaide',
+'edithelppage' => 'Help:Ännere',
+'helppage' => 'Help:Inhalt',
+'mainpage' => 'Hääptsaid',
 'mainpage-description' => 'Startseid',
-'portal'               => '{{SITENAME}}-Pordal',
-'privacy'              => 'Dadeschutz',
-'privacypage'          => 'Project:Daadeschutz',
+'portal' => '{{SITENAME}}-Pordal',
+'privacy' => 'Dadeschutz',
+'privacypage' => 'Project:Daadeschutz',
 
 'badaccess' => 'Kää ausraichende Recht',
 
-'retrievedfrom'       => 'Vun "$1"',
-'youhavenewmessages'  => 'Du hoscht $1 ($2).',
-'newmessageslink'     => 'naie Nochrichte',
+'retrievedfrom' => 'Vun "$1"',
+'youhavenewmessages' => 'Du hoscht $1 ($2).',
+'newmessageslink' => 'naie Nochrichte',
 'newmessagesdifflink' => 'letschte Ännerung',
-'editsection'         => 'bearwaide',
-'editold'             => 'bearwaide',
-'editlink'            => 'bearwaide',
-'viewsourcelink'      => 'Quell aagucke',
-'editsectionhint'     => 'Abschnitt ännere: $1',
-'toc'                 => 'Inhald',
-'showtoc'             => 'zaiche',
-'hidetoc'             => 'versteggeln',
-'site-rss-feed'       => '$1 RSS Feed',
-'site-atom-feed'      => '$1 Atom Feed',
-'page-rss-feed'       => '"$1" RSS Feed',
-'page-atom-feed'      => '"$1" Atom Feed',
-'red-link-title'      => '$1 (Said gebbt s nid)',
+'editsection' => 'bearwaide',
+'editold' => 'bearwaide',
+'editlink' => 'bearwaide',
+'viewsourcelink' => 'Quell aagucke',
+'editsectionhint' => 'Abschnitt ännere: $1',
+'toc' => 'Inhald',
+'showtoc' => 'zaiche',
+'hidetoc' => 'versteggeln',
+'site-rss-feed' => '$1 RSS Feed',
+'site-atom-feed' => '$1 Atom Feed',
+'page-rss-feed' => '"$1" RSS Feed',
+'page-atom-feed' => '"$1" Atom Feed',
+'red-link-title' => '$1 (Said gebbt s nid)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Said',
-'nstab-user'      => 'Benutzersaid',
-'nstab-media'     => 'Media',
-'nstab-special'   => 'Spezialsaid',
-'nstab-project'   => 'Pordal',
-'nstab-image'     => 'Datei',
+'nstab-main' => 'Said',
+'nstab-user' => 'Benutzersaid',
+'nstab-media' => 'Media',
+'nstab-special' => 'Spezialsaid',
+'nstab-project' => 'Pordal',
+'nstab-image' => 'Datei',
 'nstab-mediawiki' => 'Mitdeelung',
-'nstab-template'  => 'Vorlaach',
-'nstab-help'      => 'Hilfe',
-'nstab-category'  => 'Kadegorie',
+'nstab-template' => 'Vorlaach',
+'nstab-help' => 'Hilfe',
+'nstab-category' => 'Kadegorie',
 
 # General errors
-'missing-article'    => 'De Text fer „$1“ $2 isch in de Datebank nit gfunne worre.
+'missing-article' => 'De Text fer „$1“ $2 isch in de Datebank nit gfunne worre.
 
 Normalerwais hääßt des, dass die Said glescht woore isch.
 
 Wenn s des nit isch, hoscht villaicht en Fehler in de Datebank gfunne.
 Bitte meld des an e [[Special:ListUsers/sysop|Adminischtrator]], un gebb d URL dezu aa.',
 'missingarticle-rev' => '(Versionsnummer#: $1)',
-'badtitletext'       => 'De Titel vun de aageforderte Said isch nid giltich, leer, odder e nid giltiche Link vun eme annere Wiki.
+'badtitletext' => 'De Titel vun de aageforderte Said isch nid giltich, leer, odder e nid giltiche Link vun eme annere Wiki.
 S kann sai, dass es ää odder meh Zaiche drin hot, wu im Titel vun de Said nid gebraucht werre därfe.',
-'viewsource'         => 'Quelltekschd betrachde',
+'viewsource' => 'Quelltekschd betrachde',
 
 # Login and logout pages
-'yourname'                => 'Benutzername:',
-'yourpassword'            => 'Passwort:',
-'remembermypassword'      => 'Mai Passwort uff dem Computer merke (hechschtens fer $1 {{PLURAL:$1|Dach|Dach}})',
-'login'                   => 'Omelde',
+'yourname' => 'Benutzername:',
+'yourpassword' => 'Passwort:',
+'remembermypassword' => 'Mai Passwort uff dem Computer merke (hechschtens fer $1 {{PLURAL:$1|Dach|Dach}})',
+'login' => 'Omelde',
 'nav-login-createaccount' => 'Aamelde / Benutzerkonto aaleche',
-'userlogin'               => 'Omelde / Benutzerkonto anleche',
-'logout'                  => 'Abmelde',
-'userlogout'              => 'Abmelde',
-'nologinlink'             => 'E Benutzerkonto aaleche',
-'mailmypassword'          => 'Nais Passwort per E-Mail schicke',
+'userlogin' => 'Omelde / Benutzerkonto anleche',
+'logout' => 'Abmelde',
+'userlogout' => 'Abmelde',
+'nologinlink' => 'E Benutzerkonto aaleche',
+'mailmypassword' => 'Nais Passwort per E-Mail schicke',
 
 # Edit page toolbar
-'bold_sample'     => 'Fette Schrift',
-'bold_tip'        => 'Fette Schrift',
-'italic_sample'   => 'Kursive Schrift',
-'italic_tip'      => 'Kursive Schrift',
-'link_sample'     => 'Stichwort',
-'link_tip'        => 'Interner Link',
-'extlink_sample'  => 'http://www.example.com Linktext',
-'extlink_tip'     => 'Externer Link (uff http:// Acht gewwe)',
+'bold_sample' => 'Fette Schrift',
+'bold_tip' => 'Fette Schrift',
+'italic_sample' => 'Kursive Schrift',
+'italic_tip' => 'Kursive Schrift',
+'link_sample' => 'Stichwort',
+'link_tip' => 'Interner Link',
+'extlink_sample' => 'http://www.example.com Linktext',
+'extlink_tip' => 'Externer Link (uff http:// Acht gewwe)',
 'headline_sample' => 'Abschnitts-Iwwerschrift',
-'headline_tip'    => 'Iwwerschrift Ewene 2',
-'nowiki_sample'   => 'Gebb do en Text ai, wu nit formatiert wird',
-'nowiki_tip'      => 'Wiki-Formatierunge ignoriere',
-'image_tip'       => 'Bildverwais',
-'media_tip'       => 'Dateilink',
-'sig_tip'         => 'Dai Unnerschrift mit ener Zaitaagab',
-'hr_tip'          => 'Horizontale Linie (sparsam verwenne)',
+'headline_tip' => 'Iwwerschrift Ewene 2',
+'nowiki_sample' => 'Gebb do en Text ai, wu nit formatiert wird',
+'nowiki_tip' => 'Wiki-Formatierunge ignoriere',
+'image_tip' => 'Bildverwais',
+'media_tip' => 'Dateilink',
+'sig_tip' => 'Dai Unnerschrift mit ener Zaitaagab',
+'hr_tip' => 'Horizontale Linie (sparsam verwenne)',
 
 # Edit pages
-'summary'                          => 'Zammefassung:',
-'subject'                          => 'Betreff:',
-'minoredit'                        => 'Des ischt e klänni Bearwaidung',
-'watchthis'                        => 'Die Said beowachde',
-'savearticle'                      => 'Said schbeichere',
-'preview'                          => 'Vorschau',
-'showpreview'                      => 'Vorschau zaische',
-'showlivepreview'                  => 'Live-Vorschau',
-'showdiff'                         => 'Ännerunge zaische',
-'anoneditwarning'                  => "'''Warnung:''' Du bischt nit aagemeldt. Dai IP-Adress werd in de Gschicht vun dem Artikel gspaichert.",
-'summary-preview'                  => 'Zammefassung:',
-'newarticle'                       => '(Nai)',
-'newarticletext'                   => "Du bisch eme Link nogange zu re Said, wu s no gar nit gebbt.
+'summary' => 'Zammefassung:',
+'subject' => 'Betreff:',
+'minoredit' => 'Des ischt e klänni Bearwaidung',
+'watchthis' => 'Die Said beowachde',
+'savearticle' => 'Said schbeichere',
+'preview' => 'Voaschau',
+'showpreview' => 'Vorschau zaische',
+'showlivepreview' => 'Live-Vorschau',
+'showdiff' => 'Ännerunge zaische',
+'anoneditwarning' => "'''Warnung:''' Du bischt nit aagemeldt. Dai IP-Adress werd in de Gschicht vun dem Artikel gspaichert.",
+'summary-preview' => 'Zammefassung:',
+'newarticle' => '(Nai)',
+'newarticletext' => "Du bisch eme Link nogange zu re Said, wu s no gar nit gebbt.
 Zum die Said aaleche, kannscht do in dem Käschtel unne aafange mid schraiwe (guck[[{{MediaWiki:Helppage}}|Hilfe]] fer meh Informatione).
 Wenn do nid hin hoscht welle, no druck in Daim Browser uff '''Zrick'''.",
-'noarticletext'                    => 'Uff derre Said gebbt\'s noch kää Text. Du kannscht uff annere Saide [[Special:Search/{{PAGENAME}}|den Aitrach suche]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbuchaidrach suche, wu dezu ghert],
+'noarticletext' => 'Uff derre Said gebbt\'s noch kää Text. Du kannscht uff annere Saide [[Special:Search/{{PAGENAME}}|den Aitrach suche]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbuchaidrach suche, wu dezu ghert],
 orrer [{{fullurl:{{FULLPAGENAME}}|action=edit}} die Said bearwaide]</span>.',
-'previewnote'                      => "'''Denk dran, dass des numme e Vorschau isch.'''
+'previewnote' => "'''Denk dran, dass des numme e Vorschau isch.'''
 Dai Ännerunge sinn no nid gspaichert worre!",
-'editing'                          => 'Am $1 bearwaide',
-'editingsection'                   => '$1 bearwaide (Abschnitt)',
-'copyrightwarning'                 => "Bitte gebb acht, dass alle Baidräch zu {{SITENAME}} unner $2 vereffentlicht werre (guck $1 fer mehr Details).
+'editing' => 'Am $1 bearwaide',
+'editingsection' => '$1 bearwaide (Abschnitt)',
+'yourtext' => 'Doin Tegschd',
+'yourdiff' => 'Unaschied',
+'copyrightwarning' => "Bitte gebb acht, dass alle Baidräch zu {{SITENAME}} unner $2 vereffentlicht werre (guck $1 fer mehr Details).
 Wenn du nit willhsct, dass deswu du gschriwwe hoscht, gänneret un kopiert werre kann, dann duu s do nit naischraiwe.<br />
 du gebbscht do au zu, dass Du des selwerscht gschriwwe hoscht orrer vun ere effentliche, fraie Quell ('''public domain''')orrer vun ere ähnliche fraie Quell her hoscht.
 '''SCHRAIB DO NIX NAI, WAS URHEWERRECHTKLICH GSCHITZT ISCH!'''",
-'templatesused'                    => '{{PLURAL:$1|Vorlach wu uff derre Said gebraucht werd|Vorlache wu uff derre Said gebraucht werre}}:',
-'templatesusedpreview'             => '{{PLURAL:$1|Vorlach wu in derre Vorschau gebraucht werd|Vorlache wu in derre Vorschau gebraucht werre}}:',
-'template-protected'               => '(gschitzt)',
-'template-semiprotected'           => '(halb-gschitzt)',
-'hiddencategories'                 => 'Die Said ghert zu {{PLURAL:$1|1 versteckelte Kategorie|$1 versteckelte Kategorie}}:',
+'templatesused' => '{{PLURAL:$1|Vorlach wu uff derre Said gebraucht werd|Vorlache wu uff derre Said gebraucht werre}}:',
+'templatesusedpreview' => '{{PLURAL:$1|Vorlach wu in derre Vorschau gebraucht werd|Vorlache wu in derre Vorschau gebraucht werre}}:',
+'template-protected' => '(gschitzt)',
+'template-semiprotected' => '(halb-gschitzt)',
+'hiddencategories' => 'Die Said ghert zu {{PLURAL:$1|1 versteckelte Kategorie|$1 versteckelte Kategorie}}:',
 'permissionserrorstext-withaction' => 'Du därfscht nid $2, aus {{PLURAL:$1|dem Grund|denne Grind}}:',
-'moveddeleted-notice'              => 'Die Said isch glescht worre.
+'moveddeleted-notice' => 'Die Said isch glescht worre.
 De Leschaidrach fer die Said isch do unne aagewwe als Quell.',
 
 # History pages
-'viewpagelogs'           => 'D Lochbiecher fer die Said aagucke',
-'currentrev-asof'        => 'Aktuelle Version vun $1',
-'revisionasof'           => 'Version vun $1',
-'previousrevision'       => '← Ältere Versione',
-'nextrevision'           => 'Naier Version →',
-'currentrevisionlink'    => 'Aktuell Version',
-'cur'                    => 'jetzert',
-'next'                   => 'Negschte',
-'last'                   => 'vorich',
-'histlegend'             => "Du kannscht zwää Versione auswähle un verglaiche.<br />
+'viewpagelogs' => 'D Lochbiecher fer die Said aagucke',
+'currentrev-asof' => 'Aktuelle Version vun $1',
+'revisionasof' => 'Version vun $1',
+'previousrevision' => '← Ältere Versione',
+'nextrevision' => 'Naier Version →',
+'currentrevisionlink' => 'Aktuell Version',
+'cur' => 'jetzert',
+'next' => 'Negschte',
+'last' => 'vorich',
+'histlegend' => "Du kannscht zwää Versione auswähle un verglaiche.<br />
 Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 '''({{int:last}})''' = Unnerschied zu de voriche Version, '''{{int:minoreditletter}}''' = klenni Ännerung.",
 'history-fieldset-title' => 'In de Versionsgschicht suche',
-'histfirst'              => 'Ältschte',
-'histlast'               => 'Naischte',
+'histfirst' => 'Ältschte',
+'histlast' => 'Naischte',
 
 # Revision deletion
-'rev-delundel'     => 'zaich/versteckel',
+'rev-delundel' => 'zaich/versteckel',
+'revdelete-show-file-submit' => 'Ja',
+'revdelete-radio-set' => 'Ja',
+'revdelete-radio-unset' => 'Nä',
 'revdelete-submit' => 'Uff die aussgewählt {{PLURAL:$1|Version|Versione}} owende',
-'revdel-restore'   => 'Sichtbarkeit ännere',
+'revdel-restore' => 'Sichtbarkeit ännere',
 
 # Merge log
 'revertmerge' => 'Zammefiehrung rickgängich mache',
 
 # Diffs
-'history-title'           => 'Versionsgschicht vun "$1"',
-'difference'              => '(Unnerschied zwische de Versione)',
-'lineno'                  => 'Zail $1:',
+'history-title' => 'Versionsgschicht vun "$1"',
+'difference' => '(Unnerschied zwische de Versione)',
+'lineno' => 'Zail $1:',
 'compareselectedversions' => 'Die Versione mitenonner vergleiche',
-'editundo'                => 'zerick',
+'editundo' => 'zerick',
 
 # Search results
-'searchresults'             => 'Ergebnis suche',
-'searchresults-title'       => 'Ergebnis suche fer "$1"',
-'searchresulttext'          => 'Fer mehr Informatione iwwer d Such in {{SITENAME}}, guck emol uff [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle'            => 'Du hoscht no \'\'\'[[:$1]]\'\'\' gesucht ([[Special:Prefixindex/$1|alle Saide wo mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Saide wo uf "$1" verlinkt sin]])',
-'searchsubtitleinvalid'     => "Du hoscht '''$1''' gsucht",
-'notitlematches'            => 'Kää Saidetitel gfunne',
-'notextmatches'             => 'Kää Iwwerainstimmunge mit Inhalde',
-'prevn'                     => 'voriche {{PLURAL:$1|$1}}',
-'nextn'                     => 'negschte {{PLURAL:$1|$1}}',
-'viewprevnext'              => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 Word|$2 Wärder}})',
-'search-redirect'           => '(Wairerlaitung $1)',
-'search-section'            => '(Abschnitt $1)',
-'search-suggest'            => 'Hoscht gemäänt: $1',
-'search-interwiki-caption'  => 'Schweschterprojekt',
-'search-interwiki-default'  => '$1 Ergebnis:',
-'search-interwiki-more'     => '(meh)',
-'search-mwsuggest-enabled'  => 'mid Vorschläch',
+'searchresults' => 'Ergebnis suche',
+'searchresults-title' => 'Ergebnis suche fer "$1"',
+'searchresulttext' => 'Fer mehr Informatione iwwer d Such in {{SITENAME}}, guck emol uff [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Du hoscht no \'\'\'[[:$1]]\'\'\' gesucht ([[Special:Prefixindex/$1|alle Saide wo mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Saide wo uf "$1" verlinkt sin]])',
+'searchsubtitleinvalid' => "Du hoscht '''$1''' gsucht",
+'notitlematches' => 'Kää Saidetitel gfunne',
+'notextmatches' => 'Kää Iwwerainstimmunge mit Inhalde',
+'prevn' => 'voriche {{PLURAL:$1|$1}}',
+'nextn' => 'negschte {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
+'searchprofile-everything' => 'Alles',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Word|$2 Wärder}})',
+'search-redirect' => '(Wairerlaitung $1)',
+'search-section' => '(Abschnitt $1)',
+'search-suggest' => 'Hoscht gemäänt: $1',
+'search-interwiki-caption' => 'Schweschterprojekt',
+'search-interwiki-default' => '$1 Ergebnis:',
+'search-interwiki-more' => '(meh)',
+'search-mwsuggest-enabled' => 'mid Vorschläch',
 'search-mwsuggest-disabled' => 'kää Vorschläch',
-'nonefound'                 => "'''Hiiwais:''' S werre standardmäßich numme e Dail Namensraim durchsucht. Setz ''all:'' vor Dai Suchbegriff zum alle Saide (mit Dischbediersaide, Voalaache usw.) durchsuche odder direkt de Name vum Namensraum, wu durchsucht werre sell.",
-'powersearch'               => 'Erwaiterte Such',
-'powersearch-legend'        => 'Erwaiterte Such',
-'powersearch-ns'            => 'In de Namensraim suche:',
-'powersearch-redir'         => 'Wairerlaitunge aazaiche',
-'powersearch-field'         => 'Suche noch',
-'powersearch-togglenone'    => 'Kään',
+'nonefound' => "'''Hiiwais:''' S werre standardmäßich numme e Dail Namensraim durchsucht. Setz ''all:'' vor Dai Suchbegriff zum alle Saide (mit Dischbediersaide, Voalaache usw.) durchsuche odder direkt de Name vum Namensraum, wu durchsucht werre sell.",
+'powersearch' => 'Erwaiterte Such',
+'powersearch-legend' => 'Erwaiterte Such',
+'powersearch-ns' => 'In de Namensraim suche:',
+'powersearch-redir' => 'Wairerlaitunge aazaiche',
+'powersearch-field' => 'Suche noch',
+'powersearch-togglenone' => 'Kään',
 
 # Quickbar
 'qbsettings-none' => 'Kään',
 
 # Preferences page
-'preferences'   => 'Optione',
+'preferences' => 'Optione',
 'mypreferences' => 'Mai Aistellunge',
-'saveprefs'     => 'Oischdellunge schbeichere',
-'resetprefs'    => 'Oischdellunge verwerfe',
+'saveprefs' => 'Oischdellunge schbeichere',
+'resetprefs' => 'Oischdellunge verwerfe',
 'guesstimezone' => 'Aus em Browser iwwernemme',
+'gender-unknown' => 'Ghoim gkalde',
 
 # Groups
-'group'            => 'Grubb:',
-'group-bot'        => 'Bots',
-'group-sysop'      => 'Adminischdradore',
+'group' => 'Grubb:',
+'group-bot' => 'Bots',
+'group-sysop' => 'Adminischdradore',
 'group-bureaucrat' => 'Birokrade',
-'group-all'        => '(alle)',
+'group-all' => '(alle)',
 
-'group-bot-member'        => 'Bot',
-'group-sysop-member'      => 'Adminischdrador',
+'group-bot-member' => 'Bot',
+'group-sysop-member' => 'Adminischdrador',
 'group-bureaucrat-member' => 'Birokrad',
 
 'grouppage-sysop' => '{{ns:project}}:Adminischtratore',
 
 # User rights log
-'rightslog'  => 'Benutzerrecht-Logbuch',
+'rightslog' => 'Benutzerrecht-Logbuch',
 'rightsnone' => '(-)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'die Said bearwaide',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|Ännerung|Ännerunge}}',
-'recentchanges'                  => 'Was zuletschd gemacht worre isch',
-'recentchanges-legend'           => 'Optione vun de Aazaich',
+'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerunge}}',
+'recentchanges' => 'Was zuletschd gemacht worre isch',
+'recentchanges-legend' => 'Optione vun de Aazaich',
 'recentchanges-feed-description' => 'Di letschte Ännerunge vun {{SITENAME}} in des Feed aigewwe.',
-'rcnote'                         => "Aagezaicht {{PLURAL:$1|werd '''1''' Ännerung|werre die letschte '''$1''' Ännerunge}} {{PLURAL:$2|vum letschte Dach|in de letschte '''$2''' Dache}} (Stand: $4, $5)",
-'rclistfrom'                     => 'Zeich die letschte Ännerunge ab $1',
-'rcshowhideminor'                => 'Klenne Ännerunge $1',
-'rcshowhidebots'                 => 'Bots $1',
-'rcshowhideliu'                  => 'Aagemeldte Benutzer $1',
-'rcshowhideanons'                => 'Nit aagemeldte Benutzer $1',
-'rcshowhidemine'                 => 'Mai Bearwaidunge $1',
-'rclinks'                        => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
-'diff'                           => 'Unnerschied',
-'hist'                           => 'Gschicht',
-'hide'                           => 'versteggeln',
-'show'                           => 'zaiche',
-'minoreditletter'                => 'k',
-'newpageletter'                  => 'N',
-'boteditletter'                  => 'B',
-'rc-enhanced-expand'             => "Details zaische (dodezu braucht's JavaScript)",
-'rc-enhanced-hide'               => 'Details versteckeln',
+'rcnote' => "Aagezaicht {{PLURAL:$1|werd '''1''' Ännerung|werre die letschte '''$1''' Ännerunge}} {{PLURAL:$2|vum letschte Dach|in de letschte '''$2''' Dache}} (Stand: $4, $5)",
+'rclistfrom' => 'Zeich die letschte Ännerunge ab $1',
+'rcshowhideminor' => 'Klenne Ännerunge $1',
+'rcshowhidebots' => 'Bots $1',
+'rcshowhideliu' => 'Aagemeldte Benutzer $1',
+'rcshowhideanons' => 'Nit aagemeldte Benutzer $1',
+'rcshowhidemine' => 'Mai Bearwaidunge $1',
+'rclinks' => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
+'diff' => 'Unnerschied',
+'hist' => 'Gschicht',
+'hide' => 'versteggeln',
+'show' => 'zaiche',
+'minoreditletter' => 'k',
+'newpageletter' => 'N',
+'boteditletter' => 'B',
+'rc-enhanced-expand' => "Details zaische (dodezu braucht's JavaScript)",
+'rc-enhanced-hide' => 'Details versteckeln',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Was on verlinkde Saide gemacht worre isch',
-'recentchangeslinked-feed'    => 'Was on verlinkde Seide gemacht worre isch',
+'recentchangeslinked' => 'Was on verlinkde Saide gemacht worre isch',
+'recentchangeslinked-feed' => 'Was on verlinkde Seide gemacht worre isch',
 'recentchangeslinked-toolbox' => 'Was on verlinkde Seide gemacht worre isch',
-'recentchangeslinked-title'   => 'Ännerunge an Saide, wu „$1“ druf verlinkt',
+'recentchangeslinked-title' => 'Ännerunge an Saide, wu „$1“ druf verlinkt',
 'recentchangeslinked-summary' => "Des isch e Lischt vun Ännerunge, wu erscht gmacht worre sin an Saide, die wu vun ere bstimmte Said verlinkt sin (odder die wu zu ere bstimmte Kadegorie ghere).
 Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
-'recentchangeslinked-page'    => 'Saide:',
-'recentchangeslinked-to'      => 'Zaisch Ännerunge uff Saide, wu do her verlinkt sinn',
+'recentchangeslinked-page' => 'Saide:',
+'recentchangeslinked-to' => 'Zaisch Ännerunge uff Saide, wu do her verlinkt sinn',
 
 # Upload
-'upload'        => 'Hochlade',
-'uploadbtn'     => 'Datei hochlade',
+'upload' => 'Hochlade',
+'uploadbtn' => 'Datei hochlade',
 'uploadlogpage' => 'Dateie-Logbuch',
-'savefile'      => 'Datei schbeichere',
+'savefile' => 'Datei schbeichere',
 'uploadedimage' => 'hot „[[$1]]“ hochglade',
 
+# Lock manager
+'lockmanager-notlocked' => '„$1“ hod ned uffgmachd were kenne, die isch ganed gschberd gwesd.',
+'lockmanager-fail-closelock' => 'Die gbscherd Dadai „$1“ hod ned gschlosse were kenne.',
+'lockmanager-fail-deletelock' => 'Die gbscherd Dadai „$1“ hod ned gleschd were kenne.',
+'lockmanager-fail-acquirelock' => '„$1“ komma ned schberre.',
+'lockmanager-fail-openlock' => 'Die gschberd Dadai „$1“ komma ned uffmache.',
+'lockmanager-fail-releaselock' => '„$1“ konn ned fraigewe werre.',
+
 # File description page
-'file-anchor-link'          => 'Datei',
-'filehist'                  => 'Dateigschicht',
-'filehist-help'             => 'Drick uff e Zaidpunkt zum aazääche, wie s dort ausgsähne hot.',
-'filehist-current'          => 'aktuell',
-'filehist-datetime'         => 'Zaidpunkt',
-'filehist-thumb'            => 'Vorschaubild',
-'filehist-thumbtext'        => 'Vorschaubild fer Version vum $1',
-'filehist-user'             => 'Benutzer',
-'filehist-dimensions'       => 'Moß',
-'filehist-comment'          => 'Kommentar',
-'imagelinks'                => 'Dateilinks',
-'linkstoimage'              => 'Die {{PLURAL:$1|Said verwaist|$1 Saire verwaise}} uff die Datei:',
-'sharedupload'              => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
+'file-anchor-link' => 'Datei',
+'filehist' => 'Dateigschicht',
+'filehist-help' => 'Drick uff e Zaidpunkt zum aazääche, wie s dort ausgsähne hot.',
+'filehist-current' => 'aktuell',
+'filehist-datetime' => 'Zaidpunkt',
+'filehist-thumb' => 'Vorschaubild',
+'filehist-thumbtext' => 'Vorschaubild fer Version vum $1',
+'filehist-user' => 'Benutzer',
+'filehist-dimensions' => 'Moß',
+'filehist-comment' => 'Kommentar',
+'imagelinks' => 'Dateilinks',
+'linkstoimage' => 'Die {{PLURAL:$1|Said verwaist|$1 Saire verwaise}} uff die Datei:',
+'sharedupload' => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
 'uploadnewversion-linktext' => 'E naiere Version vun derre Datei hochlade',
 
 # File deletion
@@ -404,36 +420,36 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 # Statistics
 'statistics' => 'Statischtike',
 
-'brokenredirects-edit'   => 'bearwaide',
+'brokenredirects-edit' => 'bearwaide',
 'brokenredirects-delete' => 'lesche',
 
 # Miscellaneous special pages
-'nbytes'        => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'nmembers'      => '$1 {{PLURAL:$1|Mitglied|Mitglieder}}',
-'prefixindex'   => 'Alle Saide (mid Präfix)',
-'newpages'      => 'Naie Saide',
-'move'          => 'Verschiewe',
-'movethispage'  => 'Die Said verschiewe',
+'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'nmembers' => '$1 {{PLURAL:$1|Mitglied|Mitglieder}}',
+'prefixindex' => 'Alle Saide (mid Präfix)',
+'newpages' => 'Naie Saide',
+'move' => 'Verschiewe',
+'movethispage' => 'Die Said verschiewe',
 'pager-newer-n' => '{{PLURAL:$1|negschte 1|negschte $1}}',
 'pager-older-n' => '{{PLURAL:$1|vorich 1|voriche $1}}',
 
 # Book sources
-'booksources'               => 'Buchquelle',
+'booksources' => 'Buchquelle',
 'booksources-search-legend' => 'No Buchquelle suche',
-'booksources-go'            => 'Geh',
+'booksources-go' => 'Geh',
 
 # Special:Log
 'log' => 'Logbiecher',
 
 # Special:AllPages
-'allpages'       => 'Alle Saide',
+'allpages' => 'Alle Saide',
 'alphaindexline' => 'vun $1 bis $2',
-'prevpage'       => 'Voriche Said ($1)',
-'allpagesfrom'   => 'Saide aazaische wu aafange mid:',
-'allpagesto'     => 'Saide aazaische wu ufhere mid:',
-'allarticles'    => 'Alle Saide',
-'allpagesprev'   => 'Voriche',
-'allpagesnext'   => 'Negschte',
+'prevpage' => 'Voriche Said ($1)',
+'allpagesfrom' => 'Saide aazaische wu aafange mid:',
+'allpagesto' => 'Saide aazaische wu ufhere mid:',
+'allarticles' => 'Alle Saide',
+'allpagesprev' => 'Voriche',
+'allpagesnext' => 'Negschte',
 'allpagessubmit' => 'Zaische',
 
 # Special:LinkSearch
@@ -450,134 +466,135 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 'emailsend' => 'Abschigge',
 
 # Watchlist
-'watchlist'         => 'Beowachdungslischd',
-'mywatchlist'       => 'Mai Beowachdungslischd',
-'addedwatchtext'    => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
+'watchlist' => 'Beowachdungslischd',
+'mywatchlist' => 'Mai Beowachdungslischd',
+'addedwatchtext' => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
 Zukimftiche Ännerunge an derre Said un de Dischbediersaid, wu dezu ghert, werre doo aagezaicht, un d Said werd '''fett''' aagezaicht in de [[Special:RecentChanges|Letschte Ännerunge]] fer dass es ääfacher isch zum finne.",
-'removedwatchtext'  => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
-'watch'             => 'Beowachde',
-'watchthispage'     => 'Die Said beowachde',
-'unwatch'           => 'Nimmi beowachde',
+'removedwatchtext' => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
+'watch' => 'Beowachde',
+'watchthispage' => 'Die Said beowachde',
+'unwatch' => 'Nimmi beowachde',
 'watchlist-details' => 'S hot {{PLURAL:$1|$1 Said|$1 Saide}} uff Dainer Beowachdungslischt, Dischbediersaide zelle nid.',
-'wlshowlast'        => 'Die letschte $1 Stunne $2 Dache $3 zaiche',
+'wlshowlast' => 'Die letschte $1 Stunne $2 Dache $3 zaiche',
 'watchlist-options' => 'Optione vun de Beowachdungslischt',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Beowachde ...',
+'watching' => 'Beowachde ...',
 'unwatching' => 'Nimmi beowachde ...',
 
 'enotif_reset' => 'Alle Seide als bsuchd margiere',
 
 # Delete
-'deletepage'            => 'Said lesche',
-'confirm'               => 'Bestädiche',
-'delete-legend'         => 'Lesche',
-'confirmdeletetext'     => 'Du bisch debai e Said z lesche mid alle Versione.
+'deletepage' => 'Said lesche',
+'confirm' => 'Bestädiche',
+'delete-legend' => 'Lesche',
+'confirmdeletetext' => 'Du bisch debai e Said z lesche mid alle Versione.
 Bitte du bstätiche, dass Du des wllscht du, dass Du verstehsch, was des hääßt, un dass Du des machscht in Iwweraistimmung mit de [[{{MediaWiki:Policy-url}}|Richtline]].',
-'actioncomplete'        => 'Aktion fertich',
-'deletedtext'           => '"$1" isch gelescht worre.
+'actioncomplete' => 'Aktion fertich',
+'deletedtext' => '"$1" isch gelescht worre.
 Guck $2 fer e Lischt vun de letschte Leschunge.',
-'dellogpage'            => 'Leschlogbuch',
-'deletecomment'         => 'Grund:',
-'deleteotherreason'     => 'Annere/zusätzliche Grund:',
+'dellogpage' => 'Leschlogbuch',
+'deletecomment' => 'Grund:',
+'deleteotherreason' => 'Annere/zusätzliche Grund:',
 'deletereasonotherlist' => 'Annere Grund',
 
 # Rollback
 'rollbacklink' => 'Zericksetze',
 
 # Protect
-'protectlogpage'              => 'Saideschutz-Logbuch',
-'protectedarticle'            => 'hot "[[$1]]" gschitzt',
-'modifiedarticleprotection'   => 'hot de Schutzstatus vun "[[$1]]" gännert',
-'protectcomment'              => 'Grund:',
-'protectexpiry'               => 'Bis:',
-'protect_expiry_invalid'      => 'Zaidraum isch nid gildich.',
-'protect_expiry_old'          => 'Zaidraum licht in de Vergangehääd.',
-'protect-text'                => "Du kannscht de Schutzstatus vun de Said '''$1''' aagucke un ännere.",
-'protect-locked-access'       => "Dai Benutzerkonto hot ken Recht zum de Schutzstatus vun ener Said ze ännere.
+'protectlogpage' => 'Saideschutz-Logbuch',
+'protectedarticle' => 'hot "[[$1]]" gschitzt',
+'modifiedarticleprotection' => 'hot de Schutzstatus vun "[[$1]]" gännert',
+'protectcomment' => 'Grund:',
+'protectexpiry' => 'Bis:',
+'protect_expiry_invalid' => 'Zaidraum isch nid gildich.',
+'protect_expiry_old' => 'Zaidraum licht in de Vergangehääd.',
+'protect-text' => "Du kannscht de Schutzstatus vun de Said '''$1''' aagucke un ännere.",
+'protect-locked-access' => "Dai Benutzerkonto hot ken Recht zum de Schutzstatus vun ener Said ze ännere.
 Do hot s di aktuelle Aistellunge vun de Said '''$1''':",
-'protect-cascadeon'           => 'Die Said isch gschitzt, wail se {{PLURAL:$1|zu derre Said ghert|zu denne Saide ghert}}, wu e Kaskadesperrung gelt.
+'protect-cascadeon' => 'Die Said isch gschitzt, wail se {{PLURAL:$1|zu derre Said ghert|zu denne Saide ghert}}, wu e Kaskadesperrung gelt.
 Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uff d Kaskadesperrung.',
-'protect-default'             => 'Alle Benutzer erlääwe',
-'protect-fallback'            => '«$1»-Berechdichung nedich',
+'protect-default' => 'Alle Benutzer erlääwe',
+'protect-fallback' => '«$1»-Berechdichung nedich',
 'protect-level-autoconfirmed' => 'Naie un nid aagemeldte Benutzer sperre',
-'protect-level-sysop'         => 'Numme Adminischtratore',
-'protect-summary-cascade'     => 'Kaskade',
-'protect-expiring'            => 'bis $1 (UTC)',
-'protect-cascade'             => 'Kaskadesperrung – alle aigebunnene Vorlache sinn midgsperrt.',
-'protect-cantedit'            => 'Du kannscht de Schutzstatus vun derre Said nit ännere, wail Du nid d Berechdichung dezu hoscht.',
-'restriction-type'            => 'Berechdichung:',
-'restriction-level'           => 'Schutzewene:',
+'protect-level-sysop' => 'Numme Adminischtratore',
+'protect-summary-cascade' => 'Kaskade',
+'protect-expiring' => 'bis $1 (UTC)',
+'protect-cascade' => 'Kaskadesperrung – alle aigebunnene Vorlache sinn midgsperrt.',
+'protect-cantedit' => 'Du kannscht de Schutzstatus vun derre Said nit ännere, wail Du nid d Berechdichung dezu hoscht.',
+'restriction-type' => 'Berechdichung:',
+'restriction-level' => 'Schutzewene:',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Bearwaide',
 'restriction-move' => 'Verschiewe',
 
 # Undelete
-'undelete'      => 'Widderherschdelle',
-'undeletebtn'   => 'Widderherschdelle',
-'undeletelink'  => 'aagucke/wirrer herstelle',
+'undelete' => 'Widderherschdelle',
+'undeletebtn' => 'Widderherschdelle',
+'undeletelink' => 'aagucke/wirrer herstelle',
 'undeletereset' => 'Zuricksetze',
+'undelete-show-file-submit' => 'Ja',
 
 # Namespace form on various pages
-'namespace'      => 'Nomensraum',
-'invert'         => 'Auswahl umkehre',
+'namespace' => 'Nomensraum',
+'invert' => 'Auswahl umkehre',
 'blanknamespace' => '(Haaptsaid)',
 
 # Contributions
-'contributions'       => 'Was der gemacht hot',
+'contributions' => 'Was der gemacht hot',
 'contributions-title' => 'Benutzerbaidräch vun $1',
-'mycontris'           => 'Was isch gemacht hab',
-'contribsub2'         => 'Fer $1 ($2)',
-'uctop'               => '(aktuell)',
-'month'               => 'un Monet (un frieher):',
-'year'                => 'Ab em Johr (un frieher):',
+'mycontris' => 'Was isch gemacht hab',
+'contribsub2' => 'Fer $1 ($2)',
+'uctop' => '(aktuell)',
+'month' => 'un Monet (un frieher):',
+'year' => 'Ab em Johr (un frieher):',
 
-'sp-contributions-newbies'  => 'Zaich numme Baidräch vun naie Benutzerkonte',
+'sp-contributions-newbies' => 'Zaich numme Baidräch vun naie Benutzerkonte',
 'sp-contributions-blocklog' => 'Sperrlogbuch',
-'sp-contributions-talk'     => 'Dischbediere',
-'sp-contributions-search'   => 'No Baidräch suche',
+'sp-contributions-talk' => 'Dischbediere',
+'sp-contributions-search' => 'No Baidräch suche',
 'sp-contributions-username' => 'IP-Adress orrer Benutzername:',
-'sp-contributions-submit'   => 'Suche',
+'sp-contributions-submit' => 'Suche',
 
 # What links here
-'whatlinkshere'            => 'Was doher zeischt',
-'whatlinkshere-title'      => 'Saide wu uff "$1" verlinke',
-'whatlinkshere-page'       => 'Said:',
-'linkshere'                => "Die Saide verlinke zu '''[[:$1]]''':",
-'isredirect'               => 'Wairerlaitungsaid',
-'istemplate'               => 'Vorlacheaibindung',
-'isimage'                  => 'Bildlink',
-'whatlinkshere-prev'       => '{{PLURAL:$1|vorich|voriche $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|negscht|negschte $1}}',
-'whatlinkshere-links'      => '← Links',
+'whatlinkshere' => 'Was doher zeischt',
+'whatlinkshere-title' => 'Saide wu uff "$1" verlinke',
+'whatlinkshere-page' => 'Said:',
+'linkshere' => "Die Saide verlinke zu '''[[:$1]]''':",
+'isredirect' => 'Wairerlaitungsaid',
+'istemplate' => 'Vorlacheaibindung',
+'isimage' => 'Bildlink',
+'whatlinkshere-prev' => '{{PLURAL:$1|vorich|voriche $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|negscht|negschte $1}}',
+'whatlinkshere-links' => '← Links',
 'whatlinkshere-hideredirs' => '$1 Wairerlaitunge',
-'whatlinkshere-hidetrans'  => '$1 Vorlacheaibindunge',
-'whatlinkshere-hidelinks'  => '$1 Links',
-'whatlinkshere-filters'    => 'Filter',
+'whatlinkshere-hidetrans' => '$1 Vorlacheaibindunge',
+'whatlinkshere-hidelinks' => '$1 Links',
+'whatlinkshere-filters' => 'Filter',
 
 # Block/unblock
-'blockip'                  => 'Benutzer bloggiere',
-'ipbsubmit'                => 'Benutzer bloggiere',
-'ipboptions'               => '2 Stunne:2 hours,1 Dach:1 day,3 Dache:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fer immer:infinite',
-'ipusubmit'                => 'Die Adreß freigewwe',
-'ipblocklist'              => 'Gsperrte IP-Adresse un Benutzername',
-'blocklink'                => 'sperre',
-'unblocklink'              => 'Sperr uffhewwe',
-'change-blocklink'         => 'Sperr ännere',
-'contribslink'             => 'Baidräch',
-'blocklogpage'             => 'Sperrlogbuch',
-'blocklogentry'            => 'hot [[$1]] gsperrt fer e Zaidraum vun $2 $3',
-'unblocklogentry'          => 'hot d Sperr vun $1 uffghowwe',
+'blockip' => 'Benutzer bloggiere',
+'ipbsubmit' => 'Benutzer bloggiere',
+'ipboptions' => '2 Stunne:2 hours,1 Dach:1 day,3 Dache:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fer immer:infinite',
+'ipusubmit' => 'Die Adreß freigewwe',
+'ipblocklist' => 'Gsperrte IP-Adresse un Benutzername',
+'blocklink' => 'sperre',
+'unblocklink' => 'Sperr uffhewwe',
+'change-blocklink' => 'Sperr ännere',
+'contribslink' => 'Baidräch',
+'blocklogpage' => 'Sperrlogbuch',
+'blocklogentry' => 'hot [[$1]] gsperrt fer e Zaidraum vun $2 $3',
+'unblocklogentry' => 'hot d Sperr vun $1 uffghowwe',
 'block-log-flags-nocreate' => 'Aaleche vun Benutzerkonte isch gsperrt',
 
 # Developer tools
-'lockbtn'   => 'Dadebonk schberre',
+'lockbtn' => 'Dadebonk schberre',
 'unlockbtn' => 'Dadebonk freigewwe',
 
 # Move page
 'move-page-legend' => 'Said verschiewe',
-'movepagetext'     => "Mid dem Format kannscht ener Said e naie Name gewwe, debai werre alle alde Versione uff de nai Name verschowe.
+'movepagetext' => "Mid dem Format kannscht ener Said e naie Name gewwe, debai werre alle alde Versione uff de nai Name verschowe.
 Aus em Alde Name werd e Wairerlaidungssaid´zum naie Name.
 Wairerlaidungssaide, wu uff de ald Name umlaire, kannscht automatisch aktualisiere.
 Wenn De des nid willsch, no guck uff [[Special:DoubleRedirects|doppelte]] orrer [[Special:BrokenRedirects|kaputte Wairerlaidunge]].
@@ -595,25 +612,26 @@ bitte mach des numme, wenn Du die Folche vun derre Aktion kannsch abschätze.",
 * Du wählsch unne d Option, se nid z verschiewe.
 
 In denne Fäll misst mer d Dischbediersaid vun Hand kopiere.",
-'movearticle'      => 'Said verschiewe:',
-'newtitle'         => 'Zum naie Titel:',
-'move-watch'       => 'Die Said beowachde',
-'movepagebtn'      => 'Said verschiewe',
-'pagemovedsub'     => 'Verschiewung hot geklappt',
-'movepage-moved'   => '\'\'\'"$1" isch verschowe worre uff "$2"\'\'\'',
-'articleexists'    => 'E Said mid dem Name gebbt s schun, orrer de Name, wu du gewählt hoscht, isch nid gildich.
+'movearticle' => 'Said verschiewe:',
+'newtitle' => 'Zum naie Titel:',
+'move-watch' => 'Die Said beowachde',
+'movepagebtn' => 'Said verschiewe',
+'pagemovedsub' => 'Verschiewung hot geklappt',
+'movepage-moved' => '\'\'\'"$1" isch verschowe worre uff "$2"\'\'\'',
+'articleexists' => 'E Said mid dem Name gebbt s schun, orrer de Name, wu du gewählt hoscht, isch nid gildich.
 Bitte nemm e annere Name.',
-'talkexists'       => "'''Die Said selwerschd, isch verschowe worre, awwer d Dischbediersaid hot nid kenne verschowe werre, wail s schun enni gebbt mid dem Name.
+'talkexists' => "'''Die Said selwerschd, isch verschowe worre, awwer d Dischbediersaid hot nid kenne verschowe werre, wail s schun enni gebbt mid dem Name.
 Bitte duu se vun Hand zammefiehre.'''",
-'movedto'          => 'verschowe uff',
-'movetalk'         => 'Dischbediersaid, wu dezu ghert, verschiewe',
-'movelogpage'      => 'Verschiewungs-Logbuch',
-'movereason'       => 'Grund:',
-'revertmove'       => 'Zerick verschiewe',
-'delete_and_move'  => 'Lesche un Verschiewe',
+'movedto' => 'verschowe uff',
+'movetalk' => 'Dischbediersaid, wu dezu ghert, verschiewe',
+'movelogpage' => 'Verschiewungs-Logbuch',
+'movereason' => 'Grund:',
+'revertmove' => 'Zerick verschiewe',
+'delete_and_move' => 'Lesche un Verschiewe',
+'delete_and_move_confirm' => 'Ja, Said lesche',
 
 # Export
-'export'        => 'Saide exportiere',
+'export' => 'Saide exportiere',
 'export-submit' => 'Seide exbordiere',
 
 # Thumbnails
@@ -623,76 +641,76 @@ Bitte duu se vun Hand zammefiehre.'''",
 'import-interwiki-submit' => 'Impordiere',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Dai Benutzersaid',
-'tooltip-pt-mytalk'               => 'Dai Dischbedier-Said',
-'tooltip-pt-preferences'          => 'Dai Aistellunge',
-'tooltip-pt-watchlist'            => 'D Lischt vun Saide, die wu du beowachde dusch',
-'tooltip-pt-mycontris'            => 'Lischt vun Daine Baidräch',
-'tooltip-pt-login'                => 'Du kannscht Dich aamelde, awwer du muscht s nit',
-'tooltip-pt-logout'               => 'Abmelde',
-'tooltip-ca-talk'                 => 'Iwwer d Inhaltssaid dischbediere',
-'tooltip-ca-edit'                 => 'Du kannscht die Said bearwaide.
+'tooltip-pt-userpage' => 'Dai Benutzersaid',
+'tooltip-pt-mytalk' => 'Dai Dischbedier-Said',
+'tooltip-pt-preferences' => 'Dai Aistellunge',
+'tooltip-pt-watchlist' => 'D Lischt vun Saide, die wu du beowachde dusch',
+'tooltip-pt-mycontris' => 'Lischt vun Daine Baidräch',
+'tooltip-pt-login' => 'Du kannscht Dich aamelde, awwer du muscht s nit',
+'tooltip-pt-logout' => 'Abmelde',
+'tooltip-ca-talk' => 'Iwwer d Inhaltssaid dischbediere',
+'tooltip-ca-edit' => 'Du kannscht die Said bearwaide.
 Bitte brauch de Vorschau-Knopp vor em Schbaichere',
-'tooltip-ca-addsection'           => 'E naie Abschnitt aaleche',
-'tooltip-ca-viewsource'           => 'Die Said isch gschitzt.
+'tooltip-ca-addsection' => 'E naie Abschnitt aaleche',
+'tooltip-ca-viewsource' => 'Die Said isch gschitzt.
 Du kannscht awwer de Quelltext aagucke',
-'tooltip-ca-history'              => 'Ledschde Versione vun derre Said',
-'tooltip-ca-protect'              => 'Die Said schitze',
-'tooltip-ca-delete'               => 'Die Said lesche',
-'tooltip-ca-move'                 => 'Die Said verschiewe',
-'tooltip-ca-watch'                => 'Die Said zu Dainere Beowachdungslischt zufieche',
-'tooltip-ca-unwatch'              => 'Die Said aus Dainer Beowachdunschlischde rausnemme',
-'tooltip-search'                  => 'Durchsuch {{SITENAME}}',
-'tooltip-search-go'               => 'Geh zu ere Said mit genää dem Namme, wenn s se gebbt',
-'tooltip-search-fulltext'         => 'Such in de Said noch dem Text',
-'tooltip-p-logo'                  => 'Haubdsaid',
-'tooltip-n-mainpage'              => 'Uff d Hääptsaid geh',
-'tooltip-n-mainpage-description'  => 'Haubdsaid aagucke',
-'tooltip-n-portal'                => 'Iwwer s Projekt, was de duu kannscht, wo de ebbes finnscht',
-'tooltip-n-currentevents'         => 'hinnergundsinformatione finne iwwer naie Eraichnis',
-'tooltip-n-recentchanges'         => 'D Lischt vun de letschte Ännerunge in dem Wiki',
-'tooltip-n-randompage'            => 'E zufälliche Said lade',
-'tooltip-n-help'                  => 'De Ort zum rausfinne',
-'tooltip-t-whatlinkshere'         => 'Lischt vun alle Wikisaide, wo do her verlinkt sin',
-'tooltip-t-recentchangeslinked'   => 'Letschte Ännerunge in Saide, wu vun do verlinkt sin',
-'tooltip-feed-rss'                => 'RSS feed fer die Said',
-'tooltip-feed-atom'               => 'Atom feed fer die Said',
-'tooltip-t-contributions'         => 'Die letschte Baidräch vun däm Benutzer aagucke',
-'tooltip-t-emailuser'             => 'Dem Benutzer e E-Mail schicke',
-'tooltip-t-upload'                => 'Dateie nuflade',
-'tooltip-t-specialpages'          => 'Lischt vun alle Spezialsaide',
-'tooltip-t-print'                 => 'Druckversion vun derre Said',
-'tooltip-t-permalink'             => 'E dauerhafte Link zu derre Version vun de Said',
-'tooltip-ca-nstab-main'           => 'D Inhaldssaid aagucke',
-'tooltip-ca-nstab-user'           => 'D Benutzersaid aagucke',
-'tooltip-ca-nstab-special'        => 'Des isch e Spezialsaid, du kannscht d Said sälwerscht nit ännere',
-'tooltip-ca-nstab-project'        => 'D Projektsaid aagucke',
-'tooltip-ca-nstab-image'          => 'D Dateisaid aaugucke',
-'tooltip-ca-nstab-template'       => 'Vorlach aagucke',
-'tooltip-ca-nstab-category'       => 'D Kategoriesaid aagucke',
-'tooltip-minoredit'               => 'Des als klenne Ännerung markiere',
-'tooltip-save'                    => 'Dai Ännerunge spaichere',
-'tooltip-preview'                 => 'Guck Daine Ännerunge in de Vorschau aa, vor Du uff Spaichere driksch!',
-'tooltip-diff'                    => 'Guck, welle Ännerunge Du im Text gmacht hoscht',
+'tooltip-ca-history' => 'Ledschde Versione vun derre Said',
+'tooltip-ca-protect' => 'Die Said schitze',
+'tooltip-ca-delete' => 'Die Said lesche',
+'tooltip-ca-move' => 'Die Said verschiewe',
+'tooltip-ca-watch' => 'Die Said zu Dainere Beowachdungslischt zufieche',
+'tooltip-ca-unwatch' => 'Die Said aus Dainer Beowachdunschlischde rausnemme',
+'tooltip-search' => 'Durchsuch {{SITENAME}}',
+'tooltip-search-go' => 'Geh zu ere Said mit genää dem Namme, wenn s se gebbt',
+'tooltip-search-fulltext' => 'Such in de Said noch dem Text',
+'tooltip-p-logo' => 'Haubdsaid',
+'tooltip-n-mainpage' => 'Uff d Hääptsaid geh',
+'tooltip-n-mainpage-description' => 'Haubdsaid aagucke',
+'tooltip-n-portal' => 'Iwwer s Projekt, was de duu kannscht, wo de ebbes finnscht',
+'tooltip-n-currentevents' => 'hinnergundsinformatione finne iwwer naie Eraichnis',
+'tooltip-n-recentchanges' => 'D Lischt vun de letschte Ännerunge in dem Wiki',
+'tooltip-n-randompage' => 'E zufälliche Said lade',
+'tooltip-n-help' => 'De Ort zum rausfinne',
+'tooltip-t-whatlinkshere' => 'Lischt vun alle Wikisaide, wo do her verlinkt sin',
+'tooltip-t-recentchangeslinked' => 'Letschte Ännerunge in Saide, wu vun do verlinkt sin',
+'tooltip-feed-rss' => 'RSS feed fer die Said',
+'tooltip-feed-atom' => 'Atom feed fer die Said',
+'tooltip-t-contributions' => 'Die letschte Baidräch vun däm Benutzer aagucke',
+'tooltip-t-emailuser' => 'Dem Benutzer e E-Mail schicke',
+'tooltip-t-upload' => 'Dateie nuflade',
+'tooltip-t-specialpages' => 'Lischt vun alle Spezialsaide',
+'tooltip-t-print' => 'Druckversion vun derre Said',
+'tooltip-t-permalink' => 'E dauerhafte Link zu derre Version vun de Said',
+'tooltip-ca-nstab-main' => 'D Inhaldssaid aagucke',
+'tooltip-ca-nstab-user' => 'D Benutzersaid aagucke',
+'tooltip-ca-nstab-special' => 'Des isch e Spezialsaid, du kannscht d Said sälwerscht nit ännere',
+'tooltip-ca-nstab-project' => 'D Projektsaid aagucke',
+'tooltip-ca-nstab-image' => 'D Dateisaid aaugucke',
+'tooltip-ca-nstab-template' => 'Vorlach aagucke',
+'tooltip-ca-nstab-category' => 'D Kategoriesaid aagucke',
+'tooltip-minoredit' => 'Des als klenne Ännerung markiere',
+'tooltip-save' => 'Dai Ännerunge spaichere',
+'tooltip-preview' => 'Guck Daine Ännerunge in de Vorschau aa, vor Du uff Spaichere driksch!',
+'tooltip-diff' => 'Guck, welle Ännerunge Du im Text gmacht hoscht',
 'tooltip-compareselectedversions' => 'D Unnerschied zwische denne zwai ausgwehlte Versione aagucke',
-'tooltip-watch'                   => 'Die Said zu Dainer Beowachdunglischd zufieche',
-'tooltip-rollback'                => '„Zericksetze“ maxcht alle Bearwaidunge vum letschte Bearwaider rickgängich',
-'tooltip-undo'                    => '„Zerick“ macht numme die Ännerung rickgängich un zaicht d Vorschau aa.
+'tooltip-watch' => 'Die Said zu Dainer Beowachdunglischd zufieche',
+'tooltip-rollback' => '„Zericksetze“ maxcht alle Bearwaidunge vum letschte Bearwaider rickgängich',
+'tooltip-undo' => '„Zerick“ macht numme die Ännerung rickgängich un zaicht d Vorschau aa.
 Du kannscht e Grund in dr Zammfassung aagewwe',
 
 # Browsing diffs
 'previousdiff' => '← Ältere Bearwaidung',
-'nextdiff'     => 'Naiere Bearwaidung →',
+'nextdiff' => 'Naiere Bearwaidung →',
 
 # Media information
 'file-info-size' => '$1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4',
-'file-nohires'   => 'Ke hechere Ufflesung verfiechbar.',
-'svg-long-desc'  => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
+'file-nohires' => 'Ke hechere Ufflesung verfiechbar.',
+'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
 'show-big-image' => 'Gsamte Ergebnis',
 
 # Special:NewFiles
 'showhidebots' => '(Bots $1)',
-'ilsubmit'     => 'Such',
+'ilsubmit' => 'Such',
 
 # Bad image list
 'bad_image_list' => 'Format:
@@ -702,12 +720,12 @@ De erscht Link muss e Link zu ere unerwinschte Datei sai.
 Annere Links in der glaiche Zail werre als Ausnahme behannelt, d. h. Saide, wu d Datei drin vorkumme därft.',
 
 # Metadata
-'metadata'          => 'Metadata',
-'metadata-help'     => 'Die Datei hot waitere Informatione, wahrschainlich vun de Digitalkamera oder vum Scanner, mit dem wu sie gmacht worre sinn.
+'metadata' => 'Metadata',
+'metadata-help' => 'Die Datei hot waitere Informatione, wahrschainlich vun de Digitalkamera oder vum Scanner, mit dem wu sie gmacht worre sinn.
 Wenn die Datei verännert worre isch, dann kann s sai, dass die zusätzlich Information fer die verännert Datei nimmi richtich isch.',
-'metadata-expand'   => 'Erwaiterte Details aazaiche',
+'metadata-expand' => 'Erwaiterte Details aazaiche',
 'metadata-collapse' => 'Erwaiterte Details versteckeln',
-'metadata-fields'   => 'Die EXIF-Metadate werre in de Bild-Bschraiwung ach aagezeicht, wenn d Metadate-Tabelle versteckelt isch.
+'metadata-fields' => 'Die EXIF-Metadate werre in de Bild-Bschraiwung ach aagezeicht, wenn d Metadate-Tabelle versteckelt isch.
 Annere Metadate sinn standardmäßig versteckelt.
 * make
 * model
@@ -726,18 +744,18 @@ Annere Metadate sinn standardmäßig versteckelt.
 'exif-gaincontrol-0' => 'Kään',
 
 # External editor support
-'edit-externally'      => 'Die Datei bearwaide mit ener externe Aawendung',
+'edit-externally' => 'Die Datei bearwaide mit ener externe Aawendung',
 'edit-externally-help' => '(Guck uff [//www.mediawiki.org/wiki/Manual:External_editors Installationsaawisige] fer meh Informatione)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'alle',
 'namespacesall' => 'alle',
-'monthsall'     => 'alle',
+'monthsall' => 'alle',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Die wichdiche Ännerunge aagucke',
 'watchlisttools-edit' => 'D Beowachdunglischt aagucke un bearwaide',
-'watchlisttools-raw'  => 'ime große Textfeld bearwaide',
+'watchlisttools-raw' => 'ime große Textfeld bearwaide',
 
 # Special:SpecialPages
 'specialpages' => 'Spezialsaide',
@@ -745,4 +763,7 @@ Annere Metadate sinn standardmäßig versteckelt.
 # Special:Tags
 'tags-edit' => 'bearwaide',
 
+# Feedback
+'feedback-close' => 'Erledischd',
+
 );
index 3228901..0ab1cda 100644 (file)
@@ -773,7 +773,7 @@ Poniższe funkcje poczty nie działają.",
 'invalidemailaddress' => 'Adres e‐mail jest niepoprawny i nie może być zaakceptowany.
 Wpisz poprawny adres e‐mail lub wyczyść pole.',
 'cannotchangeemail' => 'Na tej wiki nie ma możliwości zmiany adresu e‐mail przypisanego do konta.',
-'emaildisabled' => 'Ta witryna nie można wysłać wiadomości e-mail.',
+'emaildisabled' => 'Ta witryna nie może wysłać wiadomości e-mail.',
 'accountcreated' => 'Konto zostało utworzone',
 'accountcreatedtext' => 'Konto dla $1 zostało utworzone.',
 'createaccount-title' => 'Utworzenie konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}',
@@ -973,7 +973,7 @@ Strony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą
 'updated' => '(Zmodyfikowano)',
 'note' => "'''Uwaga:'''",
 'previewnote' => "'''To jest tylko podgląd'''
-Zmiany nie zostały jeszcze zapisane! [[#editform|→ Kontynuuj edycję]]",
+Zmiany nie zostały jeszcze zapisane!",
 'previewconflict' => 'Podgląd odnosi się do tekstu z górnego pola edycji. Tak będzie wyglądać strona, jeśli zdecydujesz się ją zapisać.',
 'session_fail_preview' => "'''Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.
 Spróbuj jeszcze raz.
@@ -1054,6 +1054,7 @@ Zdaje się, że została skasowana.',
 'edit-no-change' => 'Twoja edycja została zignorowana, ponieważ nie zmienił{{GENDER:|eś|aś|eś(‐aś)}} niczego w tekście.',
 'edit-already-exists' => 'Nie udało się stworzyć nowej strony.
 Strona już istnieje.',
+'defaultmessagetext' => 'Domyślny tekst komunikatu',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uwaga! Ta strona zawiera zbyt wiele wywołań złożonych obliczeniowo funkcji parsera.
@@ -2158,6 +2159,11 @@ Możesz zawęzić liczbę wyników poprzez wybranie typu rejestru, nazwy użytko
 'allpages-bad-ns' => 'W {{GRAMMAR:MS.lp|{{SITENAME}}}} nie istnieje przestrzeń nazw „$1”.',
 'allpages-hide-redirects' => 'Ukryj przekierowania',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Oglądasz buforowaną wersję tej strony, której wiek to maksymalnie  $1.',
+'cachedspecial-viewing-cached-ts' => 'Oglądasz buforowaną wersję tej strony, który nie może być w pełni aktualny.',
+'cachedspecial-refresh-now' => 'Najpóźniejszy widok.',
+
 # Special:Categories
 'categories' => 'Kategorie',
 'categoriespagetext' => 'Strona przedstawia {{PLURAL:$1|kategorię zawierającą|listę kategorii zawierających}} strony lub pliki.
@@ -3995,4 +4001,15 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
 'api-error-uploaddisabled' => 'Na tej wiki przesyłanie zostało wyłączone.',
 'api-error-verification-error' => 'Plik może być uszkodzony lub nazwa pliku ma nieprawidłowe rozszerzenie.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundy|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuty|minut}}',
+'duration-hours' => '$1 {{PLURAL:$1|godzina|godziny|godzin}}',
+'duration-days' => '$1 {{PLURAL:$1|dzień|dni}}',
+'duration-weeks' => '$1 {{PLURAL:$1|tydzień|tygodnie|tygodni}}',
+'duration-years' => '$1 {{PLURAL:$1|rok|lata|lat}}',
+'duration-decades' => '$1 {{PLURAL:$1|dziesięciolecie|dekady|dekad}}',
+'duration-centuries' => '$1 {{PLURAL:$1|stulecie|stulecia|stuleci}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tysiąclecie|tysiąclecia|tysiącleci}}',
+
 );
index 6512215..0d55f08 100644 (file)
@@ -706,7 +706,7 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'updated' => '(Agiornà)',
 'note' => "'''NÒTA:'''",
 'previewnote' => "'''Che a ten-a present che costa-sì a l'é mach na preuva.'''
-Ij sò cambi a son anco' pa stàita salvà! [[#editform|→ Continua a modifiché]]",
+Ij sò cambi a son anco' pa stàit salvà!",
 'previewconflict' => "Costa preuva a-j mostra ël test dl'artìcol ambelessì dzora. Se a sërn dë salvelo, a l'é parèj che a lo s-ciairëran ëdcò tuti j'àutri Utent.",
 'session_fail_preview' => "'''Darmagi! I l'oma pa podù processé soa modìfica per via che a son përdusse për la stra ij dat ëd session.
 Për piasì che a preuva n'àutra vira. Se a dovèissa mai torna riveje sossì, che a preuva a seurte dal sistema e peuj torna a rintré.'''",
@@ -941,7 +941,7 @@ It peule pa vëddlo.',
 # Suppression log
 'suppressionlog' => 'Registr ëd le scancelassion',
 'suppressionlogtext' => "Sì-sota a-i é na lista djë scancelament e dij blocagi che a rësguardo dij contnù stërmà a j'aministrator.
-Beiché la [[Special:BlockList|lista dj'IP blocà]] për la lista dj'esclusion operassionaj e dij blocagi ativ.",
+Beiché la [[Special:BlockList|lista dij blocagi]] për la lista dj'esclusion operassionaj e dij blocagi ativ.",
 
 # History merging
 'mergehistory' => 'Buté ansema je stòrie',
@@ -2320,7 +2320,7 @@ Che a scriva codì che st'adrëssa IP o së stranòm a dev second chiel esse blo
 'badipaddress' => "L'adrëssa IP che a l'ha dane a l'é nen giusta.",
 'blockipsuccesssub' => 'Blocagi fàit',
 'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] a l'é stàit blocà.<br />
-Ch'a consulta la [[Special:BlockList|lista dj'IP blocà]] për rivëdde ij blocagi.",
+Ch'a consulta la [[Special:BlockList|lista dij blocagi]] për rivëdde ij blocagi.",
 'ipb-blockingself' => "A l'é an camin ch'as blòca chiel-midem! É-lo sigur ëd vorèj fé lòn?",
 'ipb-confirmhideuser' => "A l'é an camin ch'a blòca n'utent con «stërmé l'utent» abilità. Sòn a gaverà lë stranòm ëd l'utent da tute le liste e le vos ëd registr. É-lo sigur ëd vorèj fé lòn?",
 'ipb-edit-dropdown' => 'Modifiché le rason dël blocagi',
@@ -2372,7 +2372,7 @@ Ch'a consulta la [[Special:BlockList|lista dj'IP blocà]] për rivëdde ij bloca
 'reblock-logentry' => "a l'ha cambià j'ampostassion dël blocagi për [[$1]] con na scadensa ai $2 $3",
 'blocklogtext' => "Sossì a l'é ël registr dij blocagi e dësblocagi dj'Utent. J'adrësse che
 a son ëstàite blocà n'automàtich ambelessì a së s-ciàiro nen.
-Che a varda la [[Special:BlockList|lista dj'adrësse IP blocà]] për vëdde
+Che a varda la [[Special:BlockList|lista dij blocagi]] për vëdde
 coj che sio ij blocagi ativ al dì d'ancheuj.",
 'unblocklogentry' => "a l'ha dësblocà $1",
 'block-log-flags-anononly' => 'mach utent anònim',
@@ -2468,22 +2468,22 @@ për podèj tramudé na pàgina.",
 'movenotallowed' => "A l'ha pa ij përmess dont a fa da manca për tramudé le pàgine.",
 'movenotallowedfile' => "A l'ha pa ij përmess për tramudé j'archivi.",
 'cant-move-user-page' => "A l'ha pa ij përmess për tramudé le pàgine d'utent (gavà le sot-pàgine).",
-'cant-move-to-user-page' => "It l'has pa ij përmess për tramudé na pàgina a na pàgina utent (an gavand a na sotpàgina utent).",
+'cant-move-to-user-page' => "A l'ha pa ël përmess për tramudé na pàgina a na pàgina utent (gavà a na sot-pàgina utent).",
 'newtitle' => 'Neuv tìtol ëd',
-'move-watch' => 'Ten sot euj sta pàgina-sì',
-'movepagebtn' => 'Tramuda sta pàgina-sì',
+'move-watch' => 'Ten-e sot-euj la pàgina sorgiss e la pàgina selessionà',
+'movepagebtn' => 'Tramudé la pàgina',
 'pagemovedsub' => 'San Martin bele finì!',
-'movepage-moved' => "'''\"\$1\" a l'é stàit spostà a \"\$2\"'''",
-'movepage-moved-redirect' => "A l'é stàita creà na rediression.",
+'movepage-moved' => "'''«$1» a l'é stàit tramudà a «$2»'''",
+'movepage-moved-redirect' => "A l'é stàita creà na ridiression.",
 'movepage-moved-noredirect' => "La creassion ëd na ridiression a l'é stàita scancelà.",
 'articleexists' => "Na pàgina che as ciama parej a-i é già, ò pura ël nòm che a l'ha sërnù a va nen bin.<br />
-Che as sërna, për piasì, un nòm diferent për st'articol.",
-'cantmove-titleprotected' => "As peul pa fesse San Martin ambelelì, për via che col tìtol-lì a l'é stàit proibì e a peul pa ess-ie na pàgina ciamà parej",
+Che as sërna, për piasì, un nòm diferent për st'artìcol.",
+'cantmove-titleprotected' => "As peul pa fesse San Martin ambelelì, për via che col tìtol-lì a l'é stàit proibì e a peul pa ess-ie na pàgina ciamà parèj",
 'talkexists' => "La pàgina a l'é staita bin tramudà, ma a l'é pa podusse tramudé soa pàgina ëd discussion, përchè a-i në j'é già n'àutra ant la pàgina con ël tìtol neuv. Për piasì, che a modìfica a man ij contnù dle doe pàgine ëd discussion, an manera che as perdo nen dij pensé anteressant.",
 'movedto' => 'tramudà a',
-'movetalk' => "Podend, tramuda ëdcò la pàgina ëd discussion che a l'ha tacà.",
-'move-subpages' => 'Tramuda le sotpàgine (fin a $1)',
-'move-talk-subpages' => 'Tramuda le sotpàgine ëd na pàgina ëd discussion (fin a $1)',
+'movetalk' => "Tramudé ëdcò la pàgina ëd discussion che a l'ha tacà",
+'move-subpages' => 'Tramudé le sot-pàgine (fin a $1)',
+'move-talk-subpages' => 'Tramudé le sot-pàgine ëd la pàgina ëd discussion (fin a $1)',
 'movepage-page-exists' => 'La pàgina $1 a esist già e a peul pa esse coatà automaticament.',
 'movepage-page-moved' => "La pàgina $1 a l'é stàita tramudà a $2.",
 'movepage-page-unmoved' => 'La pàgina $1 a peul pa esse tramudà a $2.',
index bc7842b..30bff95 100644 (file)
@@ -2633,7 +2633,7 @@ $1',
 'tooltip-pt-preferences' => 'میریاں تانگاں',
 'tooltip-pt-watchlist' => 'او صفحے جنہاں وچ تبدیلیاں تسی ویکھ رہے او',
 'tooltip-pt-mycontris' => 'میرے کم',
-'tooltip-pt-login' => 'جÛ\8c ØµØ¯Ù\82Û\92 Ø§Ù\86در Ø¢Ø¤Ø\8c Ù¾Ø± Ø§Û\92 Ù\84ازÙ\85Û\8c Ù\86Û\81یں۔',
+'tooltip-pt-login' => 'اÛ\92 Ø¨Û\81تر Ø§Û\92 Ú©Û\81 Ù\84اگ Ø§Ù\86 Û\81Ù\88 Ø¬Ø§Ø¤Ø\8c Ù\84Û\8cÚ©Ù\86 Ù\81Û\8cر Ù\88Û\8c Ø§Û\92 Ù\84ازÙ\85Û\8c Ù\86ئیں۔',
 'tooltip-pt-anonlogin' => 'اے بہتر اے کہ لاگ ان ہو جاؤ، لیکن فیر وی اے لازمی نئیں۔',
 'tooltip-pt-logout' => 'باہر آؤ',
 'tooltip-ca-talk' => 'اس صفحے دے بار وچ گل بات',
@@ -3326,7 +3326,7 @@ $5
 'ascending_abbrev' => 'اے ایس سی',
 'descending_abbrev' => 'ڈی ایایس سی',
 'table_pager_next' => 'اگلا صفہ',
-'table_pager_prev' => 'پچھلا صفحہ',
+'table_pager_prev' => 'پچھلا صفہ',
 'table_pager_first' => 'پہلا صفہ',
 'table_pager_last' => 'آخری صفہ',
 'table_pager_limit' => '$1 وکھاؤ ہر صفے تے',
@@ -3390,7 +3390,7 @@ $5
 # Special:Version
 'version' => 'ورژن',
 'version-extensions' => 'انسٹالڈ کیتیاں گیاں ایکسٹنشن',
-'version-specialpages' => 'خاص صفحے',
+'version-specialpages' => 'خاص صفے',
 'version-parserhooks' => 'پارسر ہکز',
 'version-variables' => 'ویریایبلز',
 'version-antispam' => 'سپام بچاؤ',
index e103bf2..bd85da3 100644 (file)
@@ -750,7 +750,8 @@ $1',
 '''تر اوسه پورې دا نه دی خوندي شوی!'''",
 'updated' => '(تازه)',
 'note' => "'''يادونه:'''",
-'previewnote' => "'''دا يواځې مخليدنه ده، تاسې چې کوم بدلونونه ترسره کړي، لا تر اوسه پورې نه دي خوندي شوي!'''",
+'previewnote' => "'''هېر مو نه شي چې دا يواځې يوه مخليدنه ده.'''
+ستاسې لخوا ترسره شوي بدلونونه لا تر اوسه پورې نه دي خوندي شوي!!",
 'editing' => 'د $1 سمونه',
 'editingsection' => 'سمونه $1 (برخه)',
 'editingcomment' => 'د $1 سمون (نوې برخه)',
@@ -1279,7 +1280,10 @@ $1',
 'upload-http-error' => 'د HTTP يوه ستونزه رامېنځ ته شوې: $1',
 
 # File backend
+'backend-fail-delete' => 'د "$1" دوتنه ړنګه نه شوه.',
 'backend-fail-alreadyexists' => 'د $1 دوتنه له پخوا نه شته.',
+'backend-fail-read' => 'د "$1" دوتنه نه شي لوستل کېدای.',
+'backend-fail-create' => 'د "$1" دوتنه نه شي جوړېدای.',
 
 # ZipDirectoryReader
 'zip-wrong-format' => 'ځانګړې شوې دوتنه يوه ZIP دوتنه نه وه.',
@@ -1823,8 +1827,8 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'ipb-confirm' => 'د بنديز تاييد',
 'badipaddress' => 'ناسمه IP پته',
 'blockipsuccesssub' => 'بنديز په برياليتوب سره ولګېده',
-'blockipsuccesstext' => 'د [[Special:Contributions/$1|$1]] مخه نيول شوې.
-<br />د مخنيول شويو خلکو د کتنې لپاره، د [[Special:BlockList|مخنيول شويو IP لړليک]] وګورۍ.',
+'blockipsuccesstext' => 'په [[Special:Contributions/$1|$1]] بنديز لګېدلی.<br />
+د بنديزونو د څارلو لپاره [[Special:BlockList|بنديز لړليک]] وګورۍ.',
 'ipb-edit-dropdown' => 'د بنديز سببونه سمول',
 'ipb-unblock-addr' => 'له $1 بنديز ليرې کول',
 'ipb-unblock' => 'له يوه کارن-نوم يا IP پتې بنديز ليري کول',
@@ -1973,6 +1977,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 # Import log
 'importlogpage' => 'د واردولو يادښت',
 
+# JavaScriptTest
+'javascripttest' => 'د جاوا سکرېپټ آزمېښت',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'ستاسې کارن مخ',
 'tooltip-pt-mytalk' => 'ستاسې د خبرواترو مخ',
@@ -2030,6 +2037,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-diff' => 'دا هغه بدلونونه چې تاسې په متن کې ترسره کړي، ښکاره کوي. [alt-v]',
 'tooltip-compareselectedversions' => 'د همدې مخ د دوو ټاکل شويو بڼو تر مېنځ توپيرونه وګورۍ.',
 'tooltip-watch' => 'دا مخ ستاسې کتنلړ کې ورګډوي [alt-w]',
+'tooltip-upload' => 'د پورته کولو پيل',
 'tooltip-rollback' => 'په همدې مخ کې "په شابېول" د وروستني ونډوال سمون (سمونونه) په يوه کلېک په څټ ورګرځوي.',
 'tooltip-undo' => '"ناکړ" همدا سمون پر شا ګرځوي او د سمون کړکۍ د مخکتنې په بڼه پرانيزي.
 دا کړنه د لنډيز په برخه کې د سمونونو د سببونو د ورګډولو آسانتيا برابروي.',
@@ -2085,6 +2093,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'svg-long-desc' => 'SVG دوتنه، نومېنلي $1 × $2 پېکسل، د دوتنې کچه: $3',
 'show-big-image' => 'بشپړ بېلن نښې',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|چوکاټ|چوکاټونه}}',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|ځل|ځله}} وغږېده',
 'file-info-png-frames' => '$1 {{PLURAL:$1|چوکاټ|چوکاټونه}}',
 
 # Special:NewFiles
@@ -2145,6 +2154,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-model' => 'د کامرې ماډل',
 'exif-software' => 'کارېدلې ساوترۍ',
 'exif-artist' => 'ليکوال',
+'exif-copyright' => 'د رښتو خاوند',
 'exif-colorspace' => 'رنګ تشيال',
 'exif-pixelydimension' => 'د انځور سور',
 'exif-pixelxdimension' => 'د انځور جګوالی',
@@ -2174,20 +2184,27 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-objectname' => 'لنډ سرليک',
 'exif-headline' => 'سرليک',
 'exif-source' => 'سرچينه',
-'exif-contact' => 'د اړيکې مالومات',
+'exif-contact' => 'د اړيکو مالومات',
 'exif-writer' => 'ليکوال',
 'exif-languagecode' => 'ژبه',
 'exif-iimcategory' => 'وېشنيزه',
 'exif-datetimeexpires' => 'مه يې کاروۍ وروسته له',
+'exif-datetimereleased' => 'خپرېدلی په',
 'exif-identifier' => 'پېژندنه',
 'exif-lens' => 'کارېدلې لېنز',
 'exif-serialnumber' => 'د کامرې پرله پسې شمېره',
 'exif-cameraownername' => 'د کامرې خاوند',
 'exif-label' => 'نښکه',
+'exif-copyrighted' => 'د رښتو دريځ',
+'exif-copyrightowner' => 'د رښتو خاوند',
+'exif-usageterms' => 'د کارولو شرايط',
 'exif-pngfilecomment' => 'د PNG دوتنې تبصره',
 'exif-disclaimer' => 'ردادعاليک',
 'exif-giffilecomment' => 'د GIF دوتنې تبصره',
 
+'exif-copyrighted-true' => 'په رښتو سمبال',
+'exif-copyrighted-false' => 'ټولګړی شپول',
+
 'exif-unknowndate' => 'نامالومه نېټه',
 
 'exif-orientation-1' => 'نورمال',
@@ -2207,6 +2224,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-lightsource-1' => 'د ورځې رڼا',
 'exif-lightsource-4' => 'فلش',
 'exif-lightsource-9' => 'ښه هوا',
+'exif-lightsource-10' => 'ورېځ پوښلې هوا',
 'exif-lightsource-11' => 'سيوری',
 'exif-lightsource-255' => 'د رڼا بله سرچينه',
 
@@ -2403,6 +2421,9 @@ $5
 'iranian-calendar-m11' => 'سلواغه',
 'iranian-calendar-m12' => 'کب',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|خبرې اترې]])',
+
 # Special:Version
 'version' => 'بڼه',
 'version-extensions' => 'لګېدلي شاتاړي',
@@ -2517,6 +2538,7 @@ $5
 'feedback-close' => 'ترسره شو',
 
 # API errors
+'api-error-duplicate-popup-title' => 'غبرګونې {{PLURAL:$1|دوتنه|دوتنې}}.',
 'api-error-empty-file' => 'کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.',
 'api-error-file-too-large' => 'کومه دوتنه چې تاسې دلته سپارلې ډېره لويه ده.',
 'api-error-filename-tooshort' => 'د دوتنې نوم ډېر لنډ دی.',
@@ -2526,4 +2548,15 @@ $5
 'api-error-unknown-warning' => 'ناڅرګنده ګواښنه: "$1".',
 'api-error-unknownerror' => 'ناڅرګنده تېروتنه: "$1".',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|ثانيه|ثانيې}}',
+'duration-minutes' => '$1 {{PLURAL:$1|دقيقه|دقيقې}}',
+'duration-hours' => '$1 {{PLURAL:$1|ساعت|ساعتونه}}',
+'duration-days' => '$1 {{PLURAL:$1|ورځ|ورځې}}',
+'duration-weeks' => '$1 {{PLURAL:$1|اونۍ|اونۍ}}',
+'duration-years' => '$1 {{PLURAL:$1|کال|کالونه}}',
+'duration-decades' => '$1 {{PLURAL:$1|لسيزه|لسيزې}}',
+'duration-centuries' => '$1 {{PLURAL:$1|پېړۍ|پېړۍ}}',
+'duration-millennia' => '$1 {{PLURAL:$1|زرمه|زرمې}}',
+
 );
index 1830217..736118c 100644 (file)
@@ -95,7 +95,7 @@ $dateFormats = array(
        'dmy both' => 'H\hi\m\i\n \d\e j \d\e F \d\e Y',
 );
 
-$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # Bug 21168, 27633
 
 $specialPageAliases = array(
@@ -695,6 +695,9 @@ $2',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => 'Este título foi protegido contra criação por [[User:$1|$1]].
 A justificação foi "\'\'$2\'\'".',
+'filereadonlyerror' => 'Não é possível modificar o ficheiro "$1" porque o repositório de ficheiros "$2" está em modo de leitura.
+
+O administrador que efetuou o bloqueio deu a seguinte explicação: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
@@ -788,6 +791,7 @@ Não serão enviados correios de nenhuma das seguintes funcionalidades.',
 'invalidemailaddress' => 'O endereço de correio electrónico não pode ser aceite porque parece ter um formato inválido.
 Introduza um endereço formatado correctamente ou deixe o campo vazio.',
 'cannotchangeemail' => 'A conta de e-mail não pode ser alterado nesta wiki.',
+'emaildisabled' => 'Este site não consegue enviar e-mails.',
 'accountcreated' => 'Conta criada',
 'accountcreatedtext' => 'A conta de utilizador para $1 foi criada.',
 'createaccount-title' => 'Criação de conta na {{SITENAME}}',
@@ -989,7 +993,8 @@ Este ainda não foi gravado!",
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Lembre-se que esta é apenas uma antevisão do resultado.'''
-As modificações ainda não foram gravadas! [[#editform|→ Continuar a editar]]",
+As modificações ainda não foram gravadas!",
+'continue-editing' => 'Continuar a editar',
 'previewconflict' => 'Esta antevisão do resultado apresenta o texto da caixa de edição acima tal como este aparecerá se escolher gravá-lo.',
 'session_fail_preview' => "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.
 Tente novamente, por favor.
@@ -1005,6 +1010,7 @@ A edição foi rejeitada para evitar perdas no texto da página.
 Isso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
 'edit_form_incomplete' => "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
 'editing' => 'A editar $1',
+'creating' => 'A criar $1',
 'editingsection' => 'A editar $1 (secção)',
 'editingcomment' => 'A editar $1 (nova secção)',
 'editconflict' => 'Conflito de edição: $1',
@@ -1072,6 +1078,7 @@ Ela parece ter sido eliminada.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
 'edit-already-exists' => 'Não foi possível criar uma página nova.
 Ela já existia.',
+'defaultmessagetext' => 'Texto da mensagem padrão',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Aviso: Esta página contém demasiadas chamadas de funções exigentes do analisador sintáctico.
@@ -1086,6 +1093,10 @@ Estes argumentos foram omitidos.',
 'parser-template-loop-warning' => 'Ciclo de predefinições detectado: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Foi excedido o limite da profundidade de recursividade nas predefinições ($1)',
 'language-converter-depth-warning' => 'O limite de profundidade do conversor de línguas excedeu a ($1)',
+'node-count-exceeded-category' => 'Páginas em que o total de nós é excedido',
+'node-count-exceeded-warning' => 'A página excedeu o total de nós',
+'expansion-depth-exceeded-category' => 'Páginas em que a profundidade de expansão é excedida',
+'expansion-depth-exceeded-warning' => 'A página excedeu a profundidade de expansão',
 
 # "Undo" feature
 'undo-success' => 'É possível desfazer a edição.
@@ -1234,8 +1245,8 @@ Verifique os registos, por favor.',
 
 # Suppression log
 'suppressionlog' => 'Registo de supressões',
-'suppressionlogtext' => 'Abaixo está uma lista das eliminações e bloqueios envolvendo conteúdo ocultado a administradores.
-Veja a [[Special:BlockList|lista de bloqueios a IPs]] para uma lista de banimentos e bloqueios em efeito neste momento.',
+'suppressionlogtext' => 'Abaixo está uma lista das eliminações e bloqueios envolvendo conteúdo ocultado para administradores.
+Veja a [[Special:BlockList|lista de bloqueios]] para uma lista de banimentos e bloqueios em efeito neste momento.',
 
 # History merging
 'mergehistory' => 'Fundir histórico de páginas',
@@ -1846,6 +1857,28 @@ Caso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].
 'backend-fail-closetemp' => 'Não foi possível fechar o arquivo temporário.',
 'backend-fail-read' => 'Não foi possível ler o arquivo $1.',
 'backend-fail-create' => 'Não foi possível criar o arquivo $1.',
+'backend-fail-maxsize' => 'Não foi possível criar o ficheiro  $1  porque ele é maior do que  {{PLURAL:$2| um byte| $2  bytes}}.',
+'backend-fail-readonly' => 'O servidor de armazenamento "$1" está actualmente no modo "somente leitura". A razão dada foi: "$2"',
+'backend-fail-synced' => 'O ficheiro" $1 " está em um estado inconsistente dentro da base de dados',
+'backend-fail-connect' => 'Não foi possível estabelecer ligação com o servidor de armazenamento "$1".',
+'backend-fail-internal' => 'Ocorreu um erro desconhecido no servidor de armazenamento "$1".',
+'backend-fail-contenttype' => 'Não foi possível determinar o tipo de conteúdo do ficheiro para armazenar em " $1 ".',
+'backend-fail-batchsize' => 'Foi fornecido um bloco de $1 {{PLURAL:$1|operação|operações}} sobre ficheiros ao servidor backend de armazenamento; o limite é de $2 {{PLURAL:$2|operação|operações}}.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Não foi possível ligar à base de dados de registos no "backend" de armazenamento "$1".',
+'filejournal-fail-dbquery' => 'Não foi possível atualizar a base de dados de registos do "backend" de armazenamento "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Não foi possível desbloquear " $1 "; não se encontra bloqueado.',
+'lockmanager-fail-closelock' => 'Não foi possível encerrar a referência de bloqueio para "$1".',
+'lockmanager-fail-deletelock' => 'Não foi possível eliminar a referência de bloqueio para "$1".',
+'lockmanager-fail-acquirelock' => 'Não foi possível adquirir bloqueio para "$1".',
+'lockmanager-fail-openlock' => 'Não foi possível abrir ficheiro de bloqueio para "$1".',
+'lockmanager-fail-releaselock' => 'Não foi possível libertar bloqueio para "$1".',
+'lockmanager-fail-db-bucket' => 'Não foi possível contactar bases de dados de bloqueio suficientes no "bucket" $1.',
+'lockmanager-fail-db-release' => 'Não foi possível libertar bloqueios na base de dados $1.',
+'lockmanager-fail-svr-release' => 'Não foi possível libertar bloqueios no servidor $1.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Foi encontrado um erro ao abrir o ficheiro ZIP para verificação.',
@@ -1863,6 +1896,7 @@ A sua segurança não pode ser devidamente verificada.',
 'uploadstash-badtoken' => 'Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.',
 'uploadstash-errclear' => 'Não foi possível apagar os ficheiros.',
 'uploadstash-refresh' => 'Actualizar a lista de ficheiros',
+'invalid-chunk-offset' => 'Deslocamento de fragmento inválido',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Acesso negado',
@@ -1952,6 +1986,10 @@ Encontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].',
 Consulte a [$2 página de descrição do ficheiro] para mais informações, por favor.',
 'sharedupload-desc-here' => 'Este ficheiro provém de $1 e pode ser usado por outros projectos.
 A descrição na [$2 página de descrição] é mostrada abaixo.',
+'sharedupload-desc-edit' => 'Este ficheiro provém de $1 e pode ser utilizado por outros projetos.
+Talvez você pretenda editar a descrição na sua [$2 página de descrição de ficheiro] lá.',
+'sharedupload-desc-create' => 'Este ficheiro provém de $1 e pode ser utilizado por outros projetos.
+Talvez você pretenda editar a descrição na sua [$2 página de descrição de ficheiro] lá.',
 'filepage-nofile' => 'Não existe nenhum ficheiro com este nome.',
 'filepage-nofile-link' => 'Não existe nenhum ficheiro com este nome, mas pode [$1 carregá-lo].',
 'uploadnewversion-linktext' => 'Carregar uma nova versão deste ficheiro',
@@ -2084,6 +2122,8 @@ Agora redirecciona para [[$2]].',
 'wantedpages' => 'Páginas desejadas',
 'wantedpages-badtitle' => 'Título inválido no conjunto de resultados: $1',
 'wantedfiles' => 'Ficheiros desejados',
+'wantedfiletext-cat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>. Adicionalmente, páginas que incorporam ficheiros que não existem estão listadas em [[:$1]].',
+'wantedfiletext-nocat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>.',
 'wantedtemplates' => 'Predefinições desejadas',
 'mostlinked' => 'Páginas com mais afluentes',
 'mostlinkedcategories' => 'Categorias com mais membros',
@@ -2161,6 +2201,12 @@ Pode reduzir a lista escolhendo um tipo de registo, um nome de utilizador ou um
 'allpagesbadtitle' => 'O título de página fornecido era inválido ou tinha um prefixo interlínguas ou interwikis.
 Talvez contenha um ou mais caracteres que não podem ser usados nos títulos.',
 'allpages-bad-ns' => 'A {{SITENAME}} não possui o espaço nominal "$1".',
+'allpages-hide-redirects' => 'Ocultar redirecionamentos',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Você está a visualizar uma versão desta página em cache que tem uma antiguidade máxima de $1.',
+'cachedspecial-viewing-cached-ts' => 'Você está a visualizar uma versão desta página em cache que pode não refletir totalmente a situação atual.',
+'cachedspecial-refresh-now' => 'Ver mais recente.',
 
 # Special:Categories
 'categories' => 'Categorias',
@@ -2602,8 +2648,8 @@ Isto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki
 'ipb-confirm' => 'Confirmar o bloqueio',
 'badipaddress' => 'Endereço IP inválido',
 'blockipsuccesssub' => 'Bloqueio bem sucedido',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi bloqueado.<br />
-Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />
+Consulte a [[Special:BlockList|lista de bloqueios]] para rever os bloqueios.',
 'ipb-blockingself' => 'Está prestes a bloquear-se a si próprio. Tem a certeza de que pretende fazê-lo?',
 'ipb-confirmhideuser' => 'Está prestes a bloquear um utilizador com "Ocultar nome de utilizador/IP" activado. Isto irá suprimir o nome do utilizador de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?',
 'ipb-edit-dropdown' => 'Editar motivos de bloqueio',
@@ -2655,9 +2701,9 @@ O registo de bloqueios é fornecido abaixo para referência:',
 O registo de supressão é fornecido abaixo para referência:',
 'blocklogentry' => 'bloqueou "[[$1]]" $3. O bloqueio expira em $2.',
 'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] $3. O bloqueio expira em $2.',
-'blocklogtext' => 'Este é um registo de acções de bloqueio e desbloqueio.
-Endereços IP sujeitos a bloqueio automático não são listados.
-Consulte a [[Special:BlockList|lista de IPs bloqueados]] para obter a lista de bloqueios e banimentos actualmente válidos.',
+'blocklogtext' => 'Este é um registo de ações de bloqueio e desbloqueio.
+Endereços IP sujeitos a bloqueio automático não estão listados.
+Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloqueios e banimentos atualmente válidos.',
 'unblocklogentry' => 'desbloqueou $1',
 'block-log-flags-anononly' => 'apenas utilizadores anónimos',
 'block-log-flags-nocreate' => 'criação de contas impossibilitada',
@@ -2850,6 +2896,7 @@ Se deseja colaborar na localização genérica do MediaWiki, visite [//www.media
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível aceder ao XML para o ficheiro DjVU',
+'thumbnail-temp-create' => 'Não foi possível criar ficheiro temporário de miniatura',
 'thumbnail-dest-create' => 'Não é possível salvar miniatura',
 'thumbnail_invalid_params' => 'Parâmetros de miniatura inválidos',
 'thumbnail_dest_directory' => 'Não foi possível criar o directório de destino',
@@ -2921,6 +2968,7 @@ Não há um directório temporário.',
 'javascripttest-pagetext-frameworks' => 'Escolha, por favor, uma das seguintes estruturas de teste: $1',
 'javascripttest-pagetext-skins' => 'Escolher um tema para executar os testes com:',
 'javascripttest-qunit-intro' => 'Consulte a [ $1 documentação de testes] no mediawiki.org.',
+'javascripttest-qunit-heading' => 'Pacote de ferramentas de teste de JavaScript QUnit do MediaWiki',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'A sua página de utilizador',
@@ -3759,6 +3807,9 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-software' => 'Software instalado',
 'version-software-product' => 'Produto',
 'version-software-version' => 'Versão',
+'version-entrypoints' => 'URLs de ponto de entrada',
+'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Endereço de ficheiro',
@@ -3893,6 +3944,8 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'newuserlog-byemail' => 'palavra-chave enviada por correio-electrónico',
 
 # Feedback
+'feedback-bugornote' => 'Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 denuncie um defeito].
+Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página "[$3 $2]", junto com o seu nome de utilizador e o navegador que está a usar.',
 'feedback-subject' => 'Assunto:',
 'feedback-message' => 'Mensagem:',
 'feedback-cancel' => 'Cancelar',
@@ -3901,9 +3954,10 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
 'feedback-error2' => 'Erro: A edição falhou',
 'feedback-error3' => 'Erro: A API não responde',
+'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[ $2  $1 ]".',
 'feedback-close' => 'Feito',
 'feedback-bugcheck' => 'Perfeito! Verifique apenas que não é já um dos [$1 defeitos conhecidos].',
-'feedback-bugnew' => 'Eu verifiquei. Reportar um novo bug.',
+'feedback-bugnew' => 'Eu verifiquei. Denunciar um novo defeito.',
 
 # API errors
 'api-error-badaccess-groups' => 'Não tem permissão para enviar ficheiros para esta wiki.',
@@ -3943,4 +3997,15 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'api-error-uploaddisabled' => 'Esta wiki não está configurada para poder receber ficheiros.',
 'api-error-verification-error' => 'Este ficheiro pode estar corrompido, ou ter a extensão errada.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minutos}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|horas}}',
+'duration-days' => '$1 {{PLURAL:$1|dia|dias}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semana|semanas}}',
+'duration-years' => '$1 {{PLURAL:$1|ano|anos}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décadas}}',
+'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milénio|milénios}}',
+
 );
index 15447b4..d949c1d 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Alcali
+ * @author Alchimista
  * @author Bani
  * @author Brion
  * @author BrunaaAa
@@ -96,7 +97,7 @@ $dateFormats = array(
 
 );
 
-$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'Usuários_ativos' ),
@@ -329,8 +330,8 @@ $messages = array(
 'tog-previewontop' => 'Mostrar previsão antes da caixa de edição',
 'tog-previewonfirst' => 'Mostrar previsão na primeira edição',
 'tog-nocache' => 'Desativar o cache de páginas do navegador',
-'tog-enotifwatchlistpages' => 'Enviar-me um email quando uma página da minha lista de páginas vigiadas for alterada',
-'tog-enotifusertalkpages' => 'Enviar-me um email quando a minha página de discussão for editada',
+'tog-enotifwatchlistpages' => 'Receber e-mail quando uma página da minha lista de páginas vigiadas for alterada',
+'tog-enotifusertalkpages' => 'Receber e-mail quando a minha página de discussão for editada',
 'tog-enotifminoredits' => 'Enviar-me um email também quando forem edições menores',
 'tog-enotifrevealaddr' => 'Revelar o meu endereço de email nas notificações',
 'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
@@ -338,7 +339,7 @@ $messages = array(
 'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
 'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar hiperligações de acessibilidade "ir para"',
+'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
 'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário vazio',
 'tog-watchlisthideown' => 'Esconder as minhas edições da lista de páginas vigiadas',
@@ -348,7 +349,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'Ocultar edições de usuários anônimos da lista de páginas vigiadas',
 'tog-watchlisthidepatrolled' => 'Esconder edições patrulhadas na lista de páginas vigiadas',
 'tog-nolangconversion' => 'Desabilitar conversão de variantes de idioma',
-'tog-ccmeonemails' => 'Enviar para mim cópias de e-mails que eu enviar a outros usuários',
+'tog-ccmeonemails' => 'Receber cópias de e-mails que eu enviar a outros usuários',
 'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
 'tog-showhiddencats' => 'Exibir categorias ocultas',
 'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
@@ -480,7 +481,7 @@ $messages = array(
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ajuda',
 'search' => 'Pesquisar',
-'searchbutton' => 'Pesquisa',
+'searchbutton' => 'Pesquisar',
 'go' => 'Ir',
 'searcharticle' => 'Ir',
 'history' => 'Histórico da página',
@@ -546,7 +547,7 @@ $1',
 'copyrightpage' => '{{ns:project}}:Direitos_de_autor',
 'currentevents' => 'Eventos atuais',
 'currentevents-url' => 'Project:Eventos atuais',
-'disclaimers' => 'Alerta de conteúdo',
+'disclaimers' => 'Exoneração de responsabilidade',
 'disclaimerpage' => 'Project:Aviso_geral',
 'edithelp' => 'Ajuda de edição',
 'edithelppage' => 'Help:Editar',
@@ -568,7 +569,7 @@ $1',
 Veja a [[Special:Version|página sobre a versão do sistema]].',
 
 'ok' => 'OK',
-'retrievedfrom' => 'Obtida de "$1"',
+'retrievedfrom' => 'Disponível em "$1"',
 'youhavenewmessages' => 'Você tem $1 ($2).',
 'newmessageslink' => 'novas mensagens',
 'newmessagesdifflink' => 'última alteração',
@@ -579,7 +580,7 @@ Veja a [[Special:Version|página sobre a versão do sistema]].',
 'editlink' => 'editar',
 'viewsourcelink' => 'ver código-fonte',
 'editsectionhint' => 'Editar seção: $1',
-'toc' => 'Tabela de conteúdo',
+'toc' => 'Conteúdo',
 'showtoc' => 'exibir',
 'hidetoc' => 'ocultar',
 'collapsible-collapse' => 'Ocultar',
@@ -693,6 +694,9 @@ $2',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => "Este título foi protegido, para que não seja criado.
 Quem o protegeu foi [[User:$1|$1]], com a justificativa: ''$2''.",
+'filereadonlyerror' => 'Não é possível modificar o arquivo "$1" porque o repositório do arquivo "$2" está em modo somente leitura.
+
+O administrador que bloqueou ofereceu a seguinte explicação: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
@@ -715,7 +719,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'yourdomainname' => 'Seu domínio:',
 'externaldberror' => 'Ocorreu ou um erro no banco de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
 'login' => 'Autenticar-se',
-'nav-login-createaccount' => 'Criar uma conta ou entrar',
+'nav-login-createaccount' => 'Entrar / criar conta',
 'loginprompt' => 'É necessário estar com cookies ativados para poder autenticar-se no wiki {{SITENAME}}.',
 'userlogin' => 'Criar uma conta ou entrar',
 'userloginnocreate' => 'Entrar',
@@ -744,7 +748,7 @@ Por favor ative-os, depois autentique-se com o seu novo nome de usuário e a sua
 Certifique-se de que tem os cookies ativados, recarregue esta página e tente novamente.',
 'noname' => 'Você não colocou um nome de usuário válido.',
 'loginsuccesstitle' => 'Login bem sucedido',
-'loginsuccess' => "'''Agora você está autenticado ao wiki {{SITENAME}} como \"\$1\"'''.",
+'loginsuccess' => "'''Agora você está {{GENDER:autenticado|autenticada}} ao wiki {{SITENAME}} como \"\$1\"'''.",
 'nosuchuser' => 'Não existe nenhum usuário com o nome "$1".
 Os nomes de usuário são sensíveis à capitalização.
 Verifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].',
@@ -821,7 +825,7 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
 'passwordreset' => 'Redefinir senha',
 'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
 'passwordreset-legend' => 'Reiniciar a senha',
-'passwordreset-disabled' => 'Reiniciar a senha foi impossibilitado nesta wiki.',
+'passwordreset-disabled' => 'Redefinições de senha foram desabilitadas neste wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
 'passwordreset-username' => 'Nome de usuário:',
 'passwordreset-domain' => 'Domínio:',
@@ -975,7 +979,8 @@ O registro de bloqueio mais recente é fornecido abaixo, para referência:',
 'updated' => '(Atualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Lembre-se de que isto é apenas uma previsão.'''
-Suas alterações ainda não foram salvas! [[#editform|→ Continuar editando]]",
+Suas alterações ainda não foram salvas!",
+'continue-editing' => 'Continuar editando',
 'previewconflict' => 'Esta previsão reflete o texto que está na área de edição acima e como ele aparecerá se você escolher salvar.',
 'session_fail_preview' => "'''Pedimos desculpas, mas não foi possível processar a sua edição devido à perda de dados da sua sessão.
 Por favor tente novamente.
@@ -1056,6 +1061,7 @@ Ela parece ter sido eliminada.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
 'edit-already-exists' => 'Não foi possível criar uma nova página.
 Ela já existia.',
+'defaultmessagetext' => 'Texto da mensagem padrão',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Aviso: Esta página contém muitas chamadas a funções do analisador "parser".
@@ -1110,11 +1116,11 @@ Legenda: ''({{int:cur}})''' = diferença com relação a versão atual,
 
 # Revision feed
 'history-feed-title' => 'Histórico de revisão',
-'history-feed-description' => 'Histórico de revisões para esta página nesta wiki',
+'history-feed-description' => 'Histórico de revisões para esta página neste wiki',
 'history-feed-item-nocomment' => '$1 em $2',
 'history-feed-empty' => 'A página requisitada não existe.
-Poderá ter sido eliminada da wiki ou renomeada.
-Tente [[Special:Search|pesquisar na wiki]] por páginas relevantes.',
+Poderá ter sido eliminada do wiki ou renomeada.
+Tente [[Special:Search|pesquisar no wiki]] por páginas relevantes.',
 
 # Revision deletion
 'rev-deleted-comment' => '(resumo da edição suprimido)',
@@ -1257,7 +1263,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de mais de {{PLURAL:$2|um usuário|$2 usuário}} não {{PLURAL:$1|apresentada|apresentadas}})',
 
 # Search results
-'searchresults' => 'Resultados de pesquisa',
+'searchresults' => 'Resultados da pesquisa',
 'searchresults-title' => 'Resultados da pesquisa por "$1"',
 'searchresulttext' => 'Para mais informações de como pesquisar na {{SITENAME}}, consulte [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'Você pesquisou por \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|páginas iniciadas por "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|páginas que apontam para "$1"]])',
@@ -1307,7 +1313,8 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'showingresults' => "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
 'showingresultsnum' => "A seguir {{PLURAL:$3|é mostrado '''um''' resultado|são mostrados '''$3''' resultados}}, iniciando com o '''$2'''º.",
 'showingresultsheader' => "{{PLURAL:$5|Resulado '''$1''' de '''$3'''|Resultados '''$1 - $2''' de '''$3'''}} para '''$4'''",
-'nonefound' => "'''Nota''': apenas alguns espaços nominais são pesquisados por padrão. Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os conteúdos desta wiki (inclusive páginas de discussão, predefinições etc), ou mesmo, utilizando o espaço nominal desejado como prefixo.",
+'nonefound' => "'''Nota''': apenas alguns espaços nominais são pesquisados por padrão.
+Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os conteúdos deste wiki (inclusive páginas de discussão, predefinições etc), ou mesmo, utilizando o espaço nominal desejado como prefixo.",
 'search-nonefound' => 'Não houve resultados para a pesquisa.',
 'powersearch' => 'Pesquisa avançada',
 'powersearch-legend' => 'Pesquisa avançada',
@@ -1379,7 +1386,7 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
 'savedprefs' => 'As suas preferências foram salvas.',
 'timezonelegend' => 'Fuso horário:',
 'localtime' => 'Horário local:',
-'timezoneuseserverdefault' => 'Usar padrão da wiki ($1)',
+'timezoneuseserverdefault' => 'Utilizar padrão do wiki ($1)',
 'timezoneuseoffset' => 'Outro (especifique diferença horária)',
 'timezoneoffset' => 'Diferença horária¹',
 'servertime' => 'Horário do servidor:',
@@ -1394,7 +1401,7 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
 'timezoneregion-europe' => 'Europa',
 'timezoneregion-indian' => 'Oceano Índico',
 'timezoneregion-pacific' => 'Oceano Pacífico',
-'allowemail' => 'Permitir email de outros usuários',
+'allowemail' => 'Permitir que outros usuários me enviem e-mails',
 'prefs-searchoptions' => 'Opções de busca',
 'prefs-namespaces' => 'Espaços nominais',
 'defaultns' => 'Caso contrário pesquisar nestes espaços nominais:',
@@ -1415,7 +1422,7 @@ Esta ação não pode ser desfeita.',
 'yourrealname' => 'Nome verdadeiro:',
 'yourlanguage' => 'Língua:',
 'yourvariant' => 'Variante da língua de conteúdo:',
-'prefs-help-variant' => 'A sua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.',
+'prefs-help-variant' => 'A sua variante preferida ou ortografia para mostrar no conteúdo das páginas deste wiki.',
 'yournick' => 'Assinatura:',
 'prefs-help-signature' => 'Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles (<nowiki>~~~~</nowiki>) no fim dos comentários. Ao salvar, estes serão convertidos na sua assinatura mais a data e a hora da edição.',
 'badsig' => 'Assinatura inválida; verifique o código HTML utilizado.',
@@ -1466,7 +1473,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 * Uma caixa de seleção desselecionada significa que o usuário não se encontra no grupo.
 * Um * indica que não pode remover o grupo depois de o adicionar, ou vice-versa.',
 'userrights-reason' => 'Motivo:',
-'userrights-no-interwiki' => 'Você não tem permissão de alterar privilégios de usuários em outras wikis.',
+'userrights-no-interwiki' => 'Você não tem permissão para alterar privilégios de usuários em outros wikis.',
 'userrights-nodatabase' => 'O banco de dados $1 não existe ou não é um banco de dados local.',
 'userrights-nologin' => 'Você precisa [[Special:UserLogin|autenticar-se]] como um administrador para especificar os privilégios de usuário.',
 'userrights-notallowed' => 'A sua conta não tem permissão para adicionar ou remover privilégios a usuários.',
@@ -1561,7 +1568,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 # User rights log
 'rightslog' => 'Registro de privilégios de usuário',
 'rightslogtext' => 'Este é um registro de mudanças nos privilégios de usuários.',
-'rightslogentry' => 'foi alterado o grupo de acesso de $1 (de $2 para $3)',
+'rightslogentry' => 'alterou os grupos de privilégios {{GENDER:$1|do usuário|da usuária|de usuário para}} $1 (de $2 para $3)',
 'rightslogentry-autopromote' => 'foi automaticamente promovido de $2 para $3',
 'rightsnone' => '(nenhum)',
 
@@ -1591,7 +1598,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'action-block' => 'impedir que este usuário edite',
 'action-protect' => 'alterar os níveis de proteção desta página',
 'action-rollback' => 'Reverter rapidamente as edições do último usuário que editou uma página em particular',
-'action-import' => 'importar esta página a partir de outra wiki',
+'action-import' => 'importar esta página a partir de outro wiki',
 'action-importupload' => 'importar esta página através do carregamento de um arquivo',
 'action-patrol' => 'marcar as edições de outros usuários como patrulhadas',
 'action-autopatrol' => 'ter suas edições marcadas como patrulhadas',
@@ -1828,7 +1835,7 @@ Caso o problema persista, procure um [[Special:ListUsers/sysop|administrador]].'
 'backend-fail-maxsize' => 'Não foi possível criar o arquivo $1 por ele ser maior que {{PLURAL:$2|1 byte|$2 bytes}}.',
 'backend-fail-readonly' => 'O servidor de armazenamento "$1" está atualmente no modo "somente leitura". A razão dada foi: "$2"',
 'backend-fail-synced' => 'O arquivo "$1" está em um estado inconsistente dentro do sistema de armazenamento interno',
-'backend-fail-connect' => 'Não foi possível conectar com o servidor de armazenamento "$1".',
+'backend-fail-connect' => 'Não foi possível se conectar com o servidor de armazenamento "$1".',
 'backend-fail-internal' => 'Ocorreu um erro desconhecido no servidor de armazenamento "$1".',
 'backend-fail-contenttype' => 'Não foi possível determinar o tipo de conteúdo do arquivo para armazenar em "$1".',
 'backend-fail-batchsize' => 'O servidor de armazenamento retornou um conjunto de $1 {{PLURAL:$1|operação|operações}} de arquivo, enquanto seu limite é de $2 {{PLURAL:$1|operação|operações}}.',
@@ -1844,6 +1851,7 @@ Caso o problema persista, procure um [[Special:ListUsers/sysop|administrador]].'
 'lockmanager-fail-acquirelock' => 'Não foi possível obter uma referência de bloqueio para "$1".',
 'lockmanager-fail-openlock' => 'Não foi possível abrir a referência de bloqueio para "$1".',
 'lockmanager-fail-releaselock' => 'Não foi possível liberar o bloqueio para "$1".',
+'lockmanager-fail-db-bucket' => 'Não foi possível contatar suficientemente bloqueio das bases de dados no bucket $1 .',
 'lockmanager-fail-db-release' => 'Não foi possível liberar os bloqueios para "$1".',
 'lockmanager-fail-svr-release' => 'Não foi possível liberar os bloqueios do servidor "$1".',
 
@@ -1857,7 +1865,7 @@ A sua segurança não pode ser devidamente verificada.',
 
 # Special:UploadStash
 'uploadstash' => 'Arquivos escondidos',
-'uploadstash-summary' => 'Esta página dá acesso aos arquivos enviados (ou que estão no processo de envio) mas que ainda não foram publicados na wiki. Estes arquivos não são visíveis para ninguém, exceto para o usuário que os enviou.',
+'uploadstash-summary' => 'Esta página dá acesso aos arquivos enviados (ou que estão no processo de envio) mas que ainda não foram publicados no wiki. Estes arquivos não são visíveis para ninguém, exceto para o usuário que os enviou.',
 'uploadstash-clear' => 'Apagar os arquivos escondidos',
 'uploadstash-nofiles' => 'Você não tem nenhum arquivo escondido.',
 'uploadstash-badtoken' => 'Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.',
@@ -1877,8 +1885,8 @@ Consulte a documentação em [//www.mediawiki.org/wiki/Manual:Image_Authorizatio
 'img-auth-isdir' => 'Você está tentando acessar o diretório "$1".
 Somente acesso ao arquivo é permitido.',
 'img-auth-streaming' => "Realizando ''streaming'' de \"\$1\".",
-'img-auth-public' => 'A img_auth.php produz arquivos a partir de uma wiki privada.
-Esta wiki está configurada como uma wiki pública.
+'img-auth-public' => 'A img_auth.php produz arquivos a partir de um wiki privado.
+Este wiki está configurado como um wiki público.
 Para melhor segurança, o img_auth.php está desativado.',
 'img-auth-noread' => 'Usuário não tem acesso para ler "$1".',
 'img-auth-bad-query-string' => 'A URL tem um texto de consulta inválido.',
@@ -1952,6 +1960,10 @@ Uma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.',
 Por favor veja a [$2 página de descrição do arquivo] para mais informações.',
 'sharedupload-desc-here' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
 A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
+'sharedupload-desc-edit' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
+Talvez você deseje editar a descrição na sua [$2 página de descrição de arquivo] por lá.',
+'sharedupload-desc-create' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
+Talvez você deseje editar a descrição na sua [$2 página de descrição de arquivo] por lá.',
 'filepage-nofile' => 'Não existe nenhum arquivo com esse nome.',
 'filepage-nofile-link' => 'Não existe nenhum arquivo com este nome, mas você pode [$1 carregá-lo].',
 'uploadnewversion-linktext' => 'Enviar uma nova versão deste arquivo',
@@ -2002,8 +2014,8 @@ A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
 
 # Unused templates
 'unusedtemplates' => 'Predefinições não utilizadas',
-'unusedtemplatestext' => 'Esta página lista todas as páginas no espaço nominal {{ns:template}} que não estão incluídas numa outra página. Lembre-se de conferir se há outras ligações para as predefinições antes de apaga-las.',
-'unusedtemplateswlh' => 'outras ligações',
+'unusedtemplatestext' => 'Esta página lista todas as páginas no espaço nominal {{ns:template}} que não estão incluídas em uma outra página. Lembre-se de conferir se há outros links para as predefinições antes de apaga-las.',
+'unusedtemplateswlh' => 'outros links',
 
 # Random page
 'randompage' => 'Página aleatória',
@@ -2022,7 +2034,7 @@ A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
 'statistics-header-hooks' => 'Outras estatísticas',
 'statistics-articles' => 'Páginas de conteúdo',
 'statistics-pages' => 'Páginas',
-'statistics-pages-desc' => 'Todas as páginas na wiki, incluindo páginas de discussão, redirecionamentos, etc.',
+'statistics-pages-desc' => 'Todas as páginas no wiki, incluindo páginas de discussão, redirecionamentos, etc.',
 'statistics-files' => 'Arquivos carregados',
 'statistics-edits' => 'Edições de página desde que {{SITENAME}} foi instalado',
 'statistics-edits-average' => 'Média de edições por página',
@@ -2041,7 +2053,7 @@ Uma página é considerada como de desambiguação se utilizar uma predefiniçã
 
 'doubleredirects' => 'Redirecionamentos duplos',
 'doubleredirectstext' => 'Esta página lista as páginas que redirecionam para outros redirecionamentos.
-Cada linha contém ligações para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
+Cada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
 Entradas <del>riscadas</del> foram resolvidas.',
 'double-redirect-fixed-move' => '[[$1]] foi movido e agora é um redirecionamento para [[$2]]',
 'double-redirect-fixed-maintenance' => 'Corrigindo redirecionamento duplo de [[$1]] para [[$2]].',
@@ -2070,7 +2082,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'ntransclusions' => 'usada {{PLURAL:$1|numa página|em $1 páginas}}',
 'specialpage-empty' => 'Atualmente não há dados a serem exibidos nesta página.',
 'lonelypages' => 'Páginas órfãs',
-'lonelypagestext' => 'As seguintes páginas não recebem ligações nem são incluídas em outras páginas do {{SITENAME}}.',
+'lonelypagestext' => 'As seguintes páginas não recebem links nem são incluídas em outras páginas do {{SITENAME}}.',
 'uncategorizedpages' => 'Páginas não categorizadas',
 'uncategorizedcategories' => 'Categorias não categorizadas',
 'uncategorizedimages' => 'Imagens não categorizadas',
@@ -2082,6 +2094,8 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'wantedpages' => 'Páginas pedidas',
 'wantedpages-badtitle' => 'Título inválido no conjunto de resultados: $1',
 'wantedfiles' => 'Arquivos pedidos',
+'wantedfiletext-cat' => 'Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>. As páginas que incluem arquivos inexistentes são listadas em [[:$1]].',
+'wantedfiletext-nocat' => 'Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>.',
 'wantedtemplates' => 'Predefinições pedidas',
 'mostlinked' => 'Páginas com mais afluentes',
 'mostlinkedcategories' => 'Categorias com mais membros',
@@ -2090,10 +2104,11 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'mostimages' => 'Imagens com mais afluentes',
 'mostrevisions' => 'Páginas de conteúdo com mais revisões',
 'prefixindex' => 'Todas as páginas com prefixo',
+'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
 'shortpages' => 'Páginas curtas',
 'longpages' => 'Páginas longas',
 'deadendpages' => 'Páginas sem saída',
-'deadendpagestext' => 'As seguintes páginas não contêm hiperligações para outras páginas nesta wiki.',
+'deadendpagestext' => 'As seguintes páginas não contêm links para outras páginas no wiki {{SITENAME}}.',
 'protectedpages' => 'Páginas protegidas',
 'protectedpages-indef' => 'Proteções infinitas apenas',
 'protectedpages-cascade' => 'Apenas proteções progressivas',
@@ -2159,6 +2174,11 @@ Você pode diminuir a lista escolhendo um tipo de registro, um nome de usuário
 'allpages-bad-ns' => '{{SITENAME}} não possui o espaço nominal "$1".',
 'allpages-hide-redirects' => 'Ocultar redirecionamentos',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Você está visualizando uma versão de cache desta página que pode ser de $1 atrás.',
+'cachedspecial-viewing-cached-ts' => 'Você está visualizando uma versão de cache desta página que pode estar desatualizada.',
+'cachedspecial-refresh-now' => 'Ver a mais recente.',
+
 # Special:Categories
 'categories' => 'Categorias',
 'categoriespagetext' => '{{PLURAL:$1|A seguinte categoria contém|As seguintes contém}} páginas ou mídia.
@@ -2174,7 +2194,7 @@ Veja também [[Special:WantedCategories|categorias pedidas]].',
 'sp-deletedcontributions-contribs' => 'contribuições',
 
 # Special:LinkSearch
-'linksearch' => 'Pesquisa de ligações externas',
+'linksearch' => 'Pesquisa de links externos',
 'linksearch-pat' => 'Procurar padrão:',
 'linksearch-ns' => 'Espaço nominal:',
 'linksearch-ok' => 'Pesquisar',
@@ -2205,7 +2225,7 @@ Protocolos suportados: <tt>$1</tt> (não adicionado nenhum desses em sua pesquis
 
 # Special:ListGroupRights
 'listgrouprights' => 'Privilégios de grupo de usuários',
-'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos nesta wiki, com os seus privilégios de acessos associados.
+'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos neste wiki, com os seus privilégios de acessos associados.
 Pode haver [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Privilégio concedido</span>
 * <span class="listgrouprights-revoked">Privilégio revogado</span>',
@@ -2543,8 +2563,8 @@ Segue, para referência, a entrada mais recente no registro de bloqueios:',
 'whatlinkshere' => 'Páginas afluentes',
 'whatlinkshere-title' => 'Páginas que apontam para "$1"',
 'whatlinkshere-page' => 'Página:',
-'linkshere' => "As seguintes páginas possuem ligações para '''[[:$1]]''':",
-'nolinkshere' => "Não existem ligações para '''[[:$1]]'''.",
+'linkshere' => "As seguintes páginas possuem links para '''[[:$1]]''':",
+'nolinkshere' => "Não existem links para '''[[:$1]]'''.",
 'nolinkshere-ns' => "Não há links para '''[[:$1]]''' no espaço nominal selecionado.",
 'isredirect' => 'página de redirecionamento',
 'istemplate' => 'inclusão',
@@ -2554,7 +2574,7 @@ Segue, para referência, a entrada mais recente no registro de bloqueios:',
 'whatlinkshere-links' => '← links',
 'whatlinkshere-hideredirs' => '$1 redirecionamentos',
 'whatlinkshere-hidetrans' => '$1 transclusões',
-'whatlinkshere-hidelinks' => '$1 ligações',
+'whatlinkshere-hidelinks' => '$1 links',
 'whatlinkshere-hideimages' => '$1 links de imagens',
 'whatlinkshere-filters' => 'Filtros',
 
@@ -2595,8 +2615,8 @@ Isto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWik
 'ipb-confirm' => 'Confirmar bloqueio',
 'badipaddress' => 'Endereço de IP inválido',
 'blockipsuccesssub' => 'Bloqueio bem sucedido',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi bloqueado.<br />
-Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />
+Consulte a [[Special:BlockList|lista de bloqueios]].',
 'ipb-blockingself' => 'Você está prestes a bloquear-se a si próprio. Você tem a certeza de que pretende fazê-lo?',
 'ipb-confirmhideuser' => 'Você está prestes a bloquear um utilizador com "Ocultar nome de utilizador/IP" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?',
 'ipb-edit-dropdown' => 'Editar motivos de bloqueio',
@@ -2650,7 +2670,7 @@ O registro de supressão é fornecido abaixo para referência:',
 'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] $3. O bloqueio expira em $2.',
 'blocklogtext' => 'Este é um registro de ações de bloqueio e desbloqueio.
 Endereços IP sujeitos a bloqueio automático não são listados.
-Consulte a [[Special:BlockList|lista de IPs bloqueados]] para obter a lista de bloqueios e banimentos atualmente válidos.',
+Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloqueios e banimentos em efeito neste momento.',
 'unblocklogentry' => 'desbloqueou $1',
 'block-log-flags-anononly' => 'apenas usuários anônimos',
 'block-log-flags-nocreate' => 'criação de contas desabilitada',
@@ -2793,11 +2813,12 @@ Por favor, escolha outro nome.',
 
 # Export
 'export' => 'Exportação de páginas',
-'exporttext' => 'Você pode exportar o texto e o histórico de edições de uma página em particular para um arquivo XML. Poderá então importar esse conteúdo noutra wiki que utilize o software MediaWiki através da [[Special:Import|página de importações]].
+'exporttext' => 'Você pode exportar o texto e o histórico de edições, ou de uma página em particular ou de um conjunto de páginas, para um arquivo XML.
+A partir disso, será possível importar esse conteúdo em outro wiki que utilize o software MediaWiki através da [[Special:Import|página de importações]].
 
-Para exportar páginas, introduza os títulos na caixa de texto abaixo (um título por linha) e selecione se deseja todas as versões, com as linhas de histórico de edições, ou apenas a edição atual e informações apenas sobre a mais recente das edições.
+Para exportar páginas, insira os títulos na caixa de texto abaixo, um título por linha; selecione entre a edição atual acompanhada das edições anteriores e respectivo histórico de edições ou entre apenas a última edição e suas respectivas informações.
 
-Se desejar, pode utilizar uma ligação (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a [[{{MediaWiki:Mainpage}}]]).',
+Para o último caso, é possível obter o XML a partir de um link direto (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a edição mais recente da página "[[{{MediaWiki:Mainpage}}]]").',
 'exportall' => 'Exportar todas as páginas',
 'exportcuronly' => 'Incluir apenas a revisão atual, não o histórico inteiro',
 'exportnohistory' => "----
@@ -2835,6 +2856,8 @@ Acesse [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível acessar o XML do arquivo DjVU',
+'thumbnail-temp-create' => 'Não foi possível criar o arquivo temporário de miniatura',
+'thumbnail-dest-create' => 'Não foi possível salvar a miniatura no destino',
 'thumbnail_invalid_params' => 'Parâmetros de miniatura inválidos',
 'thumbnail_dest_directory' => 'Não foi possível criar o diretório de destino',
 'thumbnail_image-type' => 'Tipo de imagem não suportado',
@@ -2854,7 +2877,7 @@ Todas as ações de importação transwiki são registradas no [[Special:Log/imp
 'import-interwiki-namespace' => 'Domínio de destino:',
 'import-upload-filename' => 'Nome do arquivo:',
 'import-comment' => 'Comentário:',
-'importtext' => 'Por favor, exporte o arquivo da wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
+'importtext' => 'Por favor, exporte o arquivo do wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
 Salve o arquivo no seu computador e importe-o aqui.',
 'importstart' => 'Importando páginas...',
 'import-revision-count' => '{{PLURAL:$1|uma edição|$1 edições}}',
@@ -2878,13 +2901,16 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'xml-error-string' => '$1 na linha $2, coluna $3 (byte $4): $5',
 'import-upload' => 'Enviar dados em XML',
 'import-token-mismatch' => 'Perda dos dados da sessão. Por favor tente novamente.',
-'import-invalid-interwiki' => 'Não é possível importar da wiki especificada.',
+'import-invalid-interwiki' => 'Não é possível importar do wiki especificado.',
 'import-error-edit' => 'A página "$1" não foi importada porque você não tem permissão para editá-la.',
 'import-error-create' => 'A página "$1" não foi importada porque você não tem permissão para criá-la.',
+'import-error-interwiki' => 'A página "$1" não pôde ser importada pois seu nome está reservado para um link interwik.',
+'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
+'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
 
 # Import log
 'importlogpage' => 'Registro de importações',
-'importlogpagetext' => 'Importações administrativas de páginas com a preservação do histórico de edição de outras wikis.',
+'importlogpagetext' => 'Importações administrativas de páginas com a preservação do histórico de edição de outros wikis.',
 'import-logentry-upload' => 'importou [[$1]] através de arquivo de importação',
 'import-logentry-upload-detail' => '{{PLURAL:$1|uma edição|$1 edições}}',
 'import-logentry-interwiki' => 'transwiki $1',
@@ -2892,7 +2918,13 @@ Salve o arquivo no seu computador e importe-o aqui.',
 
 # JavaScriptTest
 'javascripttest' => 'Teste de JavaScript',
+'javascripttest-disabled' => 'Essa função não foi habilitada neste wiki.',
+'javascripttest-title' => 'Executando testes para $1',
 'javascripttest-pagetext-noframework' => 'Esta página é exclusiva para testes de JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'A estrutura de testes "$1" é desconhecida.',
+'javascripttest-pagetext-frameworks' => 'Escolha uma das seguintes estruturas de teste: $1',
+'javascripttest-pagetext-skins' => 'Escolha o tema para executar os testes:',
+'javascripttest-qunit-intro' => 'Veja a [$1 documentação de testes] no mediawiki.org.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Sua página de usuário',
@@ -2906,7 +2938,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'tooltip-pt-anonlogin' => 'Você é encorajado a autenticar-se, apesar disso não ser obrigatório.',
 'tooltip-pt-logout' => 'Sair',
 'tooltip-ca-talk' => 'Discussão sobre o conteúdo da página',
-'tooltip-ca-edit' => 'Você pode editar esta página. Por favor, utilize o botão Mostrar Previsão antes de salvar.',
+'tooltip-ca-edit' => 'Você pode editar esta página. Use o botão "Mostrar previsão" antes de salvar.',
 'tooltip-ca-addsection' => 'Iniciar uma nova seção',
 'tooltip-ca-viewsource' => 'Esta página está protegida; você pode exibir seu código, no entanto.',
 'tooltip-ca-history' => 'Edições anteriores desta página.',
@@ -2917,24 +2949,24 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'tooltip-ca-move' => 'Mover esta página',
 'tooltip-ca-watch' => 'Adicionar esta página às páginas vigiadas',
 'tooltip-ca-unwatch' => 'Remover esta página da lista de páginas vigiadas',
-'tooltip-search' => 'Pesquisar nesta wiki',
+'tooltip-search' => 'Pesquisar em {{SITENAME}}',
 'tooltip-search-go' => 'Ir a uma página com este exato nome, caso exista',
-'tooltip-search-fulltext' => 'Procurar por páginas contendo este texto',
-'tooltip-p-logo' => 'Página principal',
-'tooltip-n-mainpage' => 'Visitar a página principal',
-'tooltip-n-mainpage-description' => 'Visitar a página principal',
-'tooltip-n-portal' => 'Sobre o projeto',
-'tooltip-n-currentevents' => 'Informação temática sobre eventos atuais',
-'tooltip-n-recentchanges' => 'A lista de mudanças recentes nesta wiki.',
-'tooltip-n-randompage' => 'Abrir uma página aleatoriamente',
-'tooltip-n-help' => 'Um local reservado para auxílio.',
-'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que ligam-se a esta',
-'tooltip-t-recentchangeslinked' => 'Mudanças recentes em páginas relacionadas a esta',
+'tooltip-search-fulltext' => 'Procurar páginas que contenham este texto',
+'tooltip-p-logo' => 'Acessar a página principal',
+'tooltip-n-mainpage' => 'Acessar a página principal',
+'tooltip-n-mainpage-description' => 'Acessar a página principal',
+'tooltip-n-portal' => 'Sobre o projeto, o que se pode fazer e onde achar as coisas',
+'tooltip-n-currentevents' => 'Encontre informações sobre acontecimentos atuais',
+'tooltip-n-recentchanges' => 'A lista de mudanças recentes desta wiki.',
+'tooltip-n-randompage' => 'Acessar uma página de forma aleatória',
+'tooltip-n-help' => 'Lugar específico para obter ajuda quanto ao ambiente.',
+'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que possuem links para esta',
+'tooltip-t-recentchangeslinked' => 'Mudanças recentes nas páginas para as quais esta possui links',
 'tooltip-feed-rss' => 'Feed RSS desta página',
 'tooltip-feed-atom' => 'Feed Atom desta página',
 'tooltip-t-contributions' => 'Ver as contribuições deste usuário',
 'tooltip-t-emailuser' => 'Enviar um e-mail a este usuário',
-'tooltip-t-upload' => 'Carregar arquivos',
+'tooltip-t-upload' => 'Enviar arquivos',
 'tooltip-t-specialpages' => 'Lista de páginas especiais',
 'tooltip-t-print' => 'Versão para impressão desta página',
 'tooltip-t-permalink' => 'Link permanente para esta versão desta página',
@@ -2955,6 +2987,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'tooltip-compareselectedversions' => 'Ver as diferenças entre as duas versões selecionadas desta página.',
 'tooltip-watch' => 'Adicionar esta página à sua lista de páginas vigiadas',
 'tooltip-watchlistedit-normal-submit' => 'Remover títulos',
+'tooltip-watchlistedit-raw-submit' => 'Atualizar a lista de páginas vigiadas',
 'tooltip-recreate' => 'Recriar a página apesar de ter sido eliminada',
 'tooltip-upload' => 'Iniciar o carregamento',
 'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com um só clique, as edições do último editor desta página.',
@@ -3000,7 +3033,7 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'spamprotectionmatch' => 'O seguinte texto ativou o filtro de spam: $1',
 'spambot_username' => 'MediaWiki limpeza de spam',
 'spam_reverting' => 'Revertendo para a última versão que não contém links para $1',
-'spam_blanking' => 'Todas revisões contendo hiperligações para $1, limpando',
+'spam_blanking' => 'Todas revisões contendo links para $1, limpando',
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
@@ -3099,9 +3132,9 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
 # Bad image list
 'bad_image_list' => 'O formato é o seguinte:
 
-Só itens da lista (linhas começando com *) são considerados.
-A primeira ligação em uma linha deve ser uma ligação para um arquivo ruim.
-Qualquer ligação posterior na mesma linha são consideradas como exceções, ou seja, páginas nas quais o arquivo pode aparecer na linha.',
+Só são reconhecidos elementos na forma de lista (linhas começadas por *).
+O primeiro link em cada linha deve direcionar para o arquivo que se pretende bloquear.
+Quaisquer outros links nessa mesma linha são considerados exceções (ou seja, páginas onde o arquivo pode estar presente).',
 
 # Metadata
 'metadata' => 'Metadados',
@@ -3526,7 +3559,10 @@ Caso o arquivo tenha sido modificado a partir do seu estado original, alguns det
 # E-mail address confirmation
 'confirmemail' => 'Confirmar endereço de E-mail',
 'confirmemail_noemail' => 'Não possui um endereço de e-mail válido indicado nas suas [[Special:Preferences|preferências de usuário]].',
-'confirmemail_text' => 'Esta wiki requer que valide o seu endereço de e-mail antes de utilizar as funcionalidades que requerem um endereço de e-mail. Ative o botão abaixo para enviar uma confirmação para o seu endereço de e-mail. A mensagem incluíra um endereço que contém um código; carregue o endereço no seu navegador para confirmar que o seu endereço de e-mail encontra-se válido.',
+'confirmemail_text' => '{{SITENAME}} requer o seu endereço de e-mail esteja validado antes de utilizar as funcionalidades que requerem um endereço de e-mail.
+Ative o botão abaixo para enviar uma confirmação para o seu endereço de e-mail.
+A mensagem incluirá um link que contém um código;
+acesse o link no seu navegador para confirmar que o seu endereço de e-mail é válido.',
 'confirmemail_pending' => 'Um código de confirmação já foi enviado para você; caso tenha criado sua conta recentemente, é recomendável aguardar alguns minutos para o receber antes de tentar pedir um novo código.',
 'confirmemail_send' => 'Enviar código de confirmação',
 'confirmemail_sent' => 'E-mail de confirmação enviado.',
@@ -3701,7 +3737,7 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
 'version-hook-subscribedby' => 'Subscrito por',
 'version-version' => '(Versão $1)',
 'version-license' => 'Licença',
-'version-poweredby-credits' => "Esta é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits' => "Este é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
 'version-license-info' => 'O MediaWiki é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.
 
@@ -3711,6 +3747,7 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-software' => 'Software instalado',
 'version-software-product' => 'Produto',
 'version-software-version' => 'Versão',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Diretório do arquivo',
@@ -3815,7 +3852,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 # New logging system
 'logentry-delete-delete' => '$1 apagou a página $3',
 'logentry-delete-restore' => '$1 restaurou a página $3',
-'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|das $5 entradas}} em $3: $4',
+'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|de $5 entradas}} do registro $3: $4',
 'logentry-delete-revision' => '$1 alterou a visibilidade {{PLURAL:$5|de uma revisão|das $5 revisões}} em $3: $4',
 'logentry-delete-event-legacy' => '$1 alterou a visibilidade de uma entrada em $3',
 'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de uma revisão em $3',
@@ -3845,6 +3882,8 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'newuserlog-byemail' => 'senha enviada por correio-eletrônico',
 
 # Feedback
+'feedback-bugornote' => 'Se você está preparado para descrever detalhadamente um problema técnico, [$1 relate um bug].
+Caso contrário, você poderá usar o formulário simplificado a seguir. Seu comentário será adicionado à página "[$3 $2]", junto com o seu nome de usuário e o navegador que estiver usando neste momento.',
 'feedback-subject' => 'Assunto:',
 'feedback-message' => 'Mensagem:',
 'feedback-cancel' => 'Cancelar',
@@ -3853,10 +3892,13 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
 'feedback-error2' => 'Erro: A edição falhou',
 'feedback-error3' => 'Erro: A API não responde',
+'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[ $2  $1 ]".',
 'feedback-close' => 'Feito',
+'feedback-bugcheck' => 'Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].',
+'feedback-bugnew' => 'Eu verifiquei. Relatar um bug novo',
 
 # API errors
-'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para esta wiki.',
+'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para este wiki.',
 'api-error-badtoken' => 'Erro interno: token inválido.',
 'api-error-copyuploaddisabled' => 'O upload por URL está desativado neste servidor.',
 'api-error-duplicate' => 'Já {{PLURAL:$1|há [$2 outro arquivo]|existem [$2 outros arquivos]}} com o mesmo conteúdo',
@@ -3873,7 +3915,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'api-error-hookaborted' => 'A modificação que você tentou realizar foi abortada pelo hook de uma extensão.',
 'api-error-http' => 'Erro interno: não foi possível conectar ao servidor.',
 'api-error-illegal-filename' => 'O nome do arquivo não é permitido.',
-'api-error-internal-error' => 'Erro interno: ocorreu um erro indeterminado na wiki ao processar o arquivo que você enviou.',
+'api-error-internal-error' => 'Erro interno: ocorreu algum erro ao processar o arquivo que você enviou ao wiki.',
 'api-error-invalid-file-key' => 'Erro interno: o arquivo não foi encontrado no armazenamento temporário.',
 'api-error-missingparam' => 'Erro interno: parâmetros em falta no pedido.',
 'api-error-missingresult' => 'Erro interno: não foi possível determinar se a cópia foi feita.',
@@ -3890,7 +3932,18 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'api-error-unknown-error' => 'Erro interno: ocorreu um erro indeterminado ao tentar enviar o arquivo.',
 'api-error-unknown-warning' => 'Aviso desconhecido: $1',
 'api-error-unknownerror' => 'Erro desconhecido: "$1".',
-'api-error-uploaddisabled' => 'Esta wiki está com uploads de arquivos desativados.',
+'api-error-uploaddisabled' => 'Este wiki está com o upload de arquivos desabilitado.',
 'api-error-verification-error' => 'Este arquivo pode estar corrompido ou ter a extensão errada.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minutos}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|horas}}',
+'duration-days' => '$1 {{PLURAL:$1|dia|dias}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semana|semanas}}',
+'duration-years' => '$1 {{PLURAL:$1|ano|anos}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décadas}}',
+'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milênio|milênios}}',
+
 );
index 299eec9..7a0383c 100644 (file)
@@ -19,6 +19,7 @@
  * @author Bangin
  * @author Bennylin
  * @author Beta16
+ * @author Bilalokms
  * @author Boivie
  * @author Brest
  * @author BrokenArrow
@@ -97,6 +98,7 @@
  * @author Sborsody
  * @author Seb35
  * @author Sherbrooke
+ * @author Shirayuki
  * @author Shushruth
  * @author Siebrand
  * @author Singularity
@@ -681,6 +683,13 @@ $1 is a filename, I think.',
 'editinginterface' => "A message shown when editing pages in the namespace MediaWiki:. In the [http://translatewiki.net/wiki/Main_Page?setlang=en URL], '''change \"setlang=en\" to your own language code.'''",
 'ns-specialprotected' => 'Error message displayed when trying to edit a page in the Special namespace',
 'titleprotected' => 'Use $1 for GENDER.',
+'invalidtitle-knownnamespace' => 'Displayed when an invalid title was encountered (generally in a list), but the namespace number is known to exist.
+* $1 is the namespace number
+* $2 is the namespace name in content language or {{msg-mw|blanknamespace}} for the main namespace
+* $3 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
+'invalidtitle-unknownnamespace' => 'Displayed when an invalid title was encountered (generally in a list) and the namespace number is unknown.
+* $1 is the namespace number
+* $2 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
 
 # Login and logout pages
 'logouttext' => 'Log out message',
@@ -731,7 +740,9 @@ $1 is a filename, I think.',
 'nocookieslogin' => "This message is displayed when someone tried to login, but the browser doesn't accept cookies.",
 'nocookiesfornew' => "This message is displayed when the user tried to create a new account, but it failed the cross-site request forgery (CSRF) check. It could be blocking an attack, but most likely, the browser isn't  accepting cookies.",
 'nocookiesforlogin' => "{{optional}}
-This message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies). Defaults to nocookieslogin",
+This message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies).
+
+Defaults to '''nocookieslogin''' ({{int:nocookieslogin}})",
 'loginsuccesstitle' => 'The title of the page saying that you are logged in. The content of the page is the message "[[MediaWiki:Loginsuccess/{{SUBPAGENAME}}]]".',
 'loginsuccess' => 'The content of the page saying that you are logged in. The title of the page is "[[MediaWiki:Loginsuccesstitle/{{SUBPAGENAME}}|{{int:loginsuccesstitle}}]]". $1 is the name of the logged in user.
 
@@ -971,6 +982,7 @@ See also {{msg-mw|Noarticletext-nopermission}}.',
 'sitejspreview' => 'Text displayed on preview of .js pages in MediaWiki namespace',
 'updated' => '{{Identical|Updated}}',
 'previewnote' => 'Note displayed when clicking on Show preview',
+'continue-editing' => 'A link to the beginning of the editing textarea on the same page. Displayed after {{msg-mw|previewnote}}.',
 'editing' => "Shown as page title when editing a page. \$1 is the name of the page that is being edited. Example: \"''Editing Main Page''\".",
 'creating' => "Shown as page title when creating a page. Parameters:
 * \$1 is the name of the page that is being created. Example: \"''Creating Main Page''\".",
@@ -1018,6 +1030,23 @@ When templates are expanded, there is a size limit for the number of bytes yield
 'language-converter-depth-warning' => 'Error message shown when a page uses too deeply nested language conversion syntax
 
 * <tt>$1</tt> is the value of the depth limit',
+'node-count-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.',
+'node-count-exceeded-warning' => 'Error message shown when a page exceeded the node-count limit of the preprocessor
+
+* <tt>$1</tt> is the value of the node-count limit
+* <tt>$2</tt> is the value of the max node-count limit',
+'expansion-depth-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the [http://meta.wikimedia.org/wiki/Help:Expansion_depth expansion depth] of the preprocessor exceeds the limit.',
+'expansion-depth-exceeded-warning' => 'Error message shown when a page exceeded the [http://meta.wikimedia.org/wiki/Help:Expansion_depth expansion depth limit] of the preprocessor
+
+* <tt>$1</tt> is the value of the depth limit
+* <tt>$2</tt> is the value of the max depth limit',
+'parser-unstrip-loop-warning' => 'This error is shown when a parser extension tag such as <pre> includes a reference to itself in its own output.
+The reference must be to the exact same invocation of the tag at the same location in the source, merely writing &lt;pre>&lt;pre>&lt;/pre>&lt;/pre> will not do it.
+This is usually impossible and unlikely to happen by accident, so translation is not essential.',
+'parser-unstrip-recursion-limit' => 'This message is shown when the recursion limit for nested parser extension tags is exceeded.
+This warning may be encountered due to input text like &lt;ref>&lt;ref>&lt;ref>...&lt;/ref>&lt;/ref>&lt;/ref>.
+
+* <tt>$1</tt> is the depth limit',
 
 # "Undo" feature
 'undo-success' => 'Text on special page to confirm edit revert. You arrive on this page by clicking on the "undo" link on a revision history special page.
@@ -1905,8 +1934,8 @@ Extensions making use of it:
 'backend-fail-notexists' => 'Parameters:
 * $1 is a filename.',
 'backend-fail-hashes' => 'Definition of "[[w:en:Hash_function|hashes]]".',
-'backend-fail-notsame' => 'Parameters:
-* $1 is a filename.',
+'backend-fail-notsame' => 'Parametreler:
+* $1 bir dosya ismi.',
 'backend-fail-invalidpath' => 'Parameters:
 * $1 is a storage path.',
 'backend-fail-delete' => 'Parameters:
@@ -2001,6 +2030,7 @@ Siebrand think this has to do with allowing MediaWiki to fetch remote URLs, and
 
 If \'scheme\' is difficult to translate, then you could use \'prefix\' instead.',
 'http-bad-status' => '$1 is an HTTP error code (e.g. 404), $2 is the HTTP error message (e.g. File Not Found)',
+'http-truncated-body' => 'This is a standard HTTP error message. → Seems the connection closed prematurely. The HTTP response contained a content-length greater than the received body.',
 
 'license' => 'This appears in the upload form for the license drop-down. The header in the file description page is now at {{msg-mw|License-header}}.',
 'nolicense' => '{{Identical|None selected}}',
@@ -2371,6 +2401,11 @@ The title is {{msg-mw|nopagetitle}}.',
 'allpagesprefix' => "Used for the label of the input box of [[Special:PrefixIndex]]. On this page you can either write 'Name of namespace:string from which to begin display in alphabetical order' in the top box, or you can choose a namespace in the bottom box and put 'string from which to begin display in alphabetical order' in the top box. The result will be the same.",
 'allpages-hide-redirects' => 'Label for a checkbox. If the checkbox is checked redirects will not be shown in the list. Used in [[Special:PrefixIndex]] and [[Special:Allpages]].',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Message notifying they are watching a cached page. $1 is a duration (ie "1 hour and 30 minutes")',
+'cachedspecial-viewing-cached-ts' => 'Message notifying they are watching a cached page.',
+'cachedspecial-refresh-now' => 'Link text pointing to the most recent version of the page.',
+
 # Special:Categories
 'categories' => 'The page name of [[Special:Categories]].
 
@@ -4407,6 +4442,12 @@ This is being used in [[Special:Version]], preceeding the subversion revision nu
 'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
 'version-software-product' => 'Shown in [[Special:Version]]',
 'version-software-version' => '{{Identical|Version}}',
+'version-entrypoints' => 'Header on [[Special:Version]] above a table that lists the URLs of various entry points in this MediaWiki installation. Entry points are the "places" where the wiki\'s content and information can be accessed in various ways, for instance the standard index.php which shows normal pages, histories etc.',
+'version-entrypoints-header-entrypoint' => 'Header for the first column in the entry points table on [[Special:Version]].
+See also {{msg-mw|Version-entrypoints}}',
+'version-entrypoints-header-url' => 'Header for the second column in the entry points table on [[Special:Version]].',
+'version-entrypoints-articlepath' => 'A short description of the article path entry point. Links to the mediawiki.org documentation page for $wgArticlePath.',
+'version-entrypoints-scriptpath' => 'A short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.',
 
 # Special:FilePath
 'filepath' => 'Legend of fieldset around input box in [[Special:FilePath]].',
index 8dab70f..988a978 100644 (file)
@@ -647,6 +647,9 @@ $2",
 'customjsprotected' => "Manam saqillasunkichu kay JavaScript p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
 'ns-specialprotected' => "{{ns:special}} suti k'itipi p'anqakunaqa manam llamk'apunallachu.",
 'titleprotected' => "Kay p'anqa sutitaqa [[User:$1|$1]] sutiyuq ruraq kamariymanta hark'arqanmi, kayraykum nispa: ''$2''.",
+'filereadonlyerror' => 'Manam atinichu "$1" sutiyuq willañiqita hukchayta, "$2" sutiyuq willañiqi churamuna ñawirillanapaq kachkaptinmi.
+
+Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
@@ -729,6 +732,7 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
 'emailconfirmlink' => 'E-chaski imamaytaykita takyachiy',
 'invalidemailaddress' => "E-chaski imamaytaykiqa manam allinchu, manachá allinta qillqasqa. Ama hina kaspa, musuq allin sananchayuq imamaytaykita qillqamuy icha k'itichata ch'usaqchay.",
 'cannotchangeemail' => 'Ruraqpa rakiqunanpi e-chaski imamaytakunaqa kay wikipi manam hukchanallachu.',
+'emaildisabled' => 'Kay tiyayqa e-chaskita manam kachayta atinchu.',
 'accountcreated' => 'Rakiqunaqa kichasqañam',
 'accountcreatedtext' => '$1 sutiyuq ruraqpa rakiqunanqa kichasqañam.',
 'createaccount-title' => '{{SITENAME}}paq musuq rakiqunata kichariy',
@@ -913,7 +917,9 @@ Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
 'userinvalidcssjstitle' => "'''Paqtataq:''' Manam kanchu \"\$1\" qara. Yuyariy, kikinpa .css, .js p'anqankunaqa uchuy sanampa umalliyuqmi, ahinataq {{ns:user}}:Foo/vector.css manataq  {{ns:user}}:Foo/Vector.css nisqachu.",
 'updated' => '(Musuqchasqa)',
 'note' => "'''Musyay:'''",
-'previewnote' => "'''Yuyaykuy: Kayqa manaraq waqaychaspa qhawariymi!'''",
+'previewnote' => "'''Yuyaykuy: Kayqa qhawariyllam.'''
+Llamk'apusqaykiqa manaraqmi waqaychasqachu!",
+'continue-editing' => "Llamk'apuyta qatiykuy",
 'previewconflict' => "Rikuchkanki kay p'anqataqa, ima hinachus waqaychasqa kanqa.",
 'session_fail_preview' => "'''Achachaw! Llamk'apusqaykiqa manam waqaychasqachu, llamk'ana tiyaypa willankuna chinkaptinmi. Ama hina kaspa, musuqmanta ruraykachay. Mana atispaykiqa, [[Special:UserLogout|lluqsispa]] musuqmanta yaykuy.'''",
 'session_fail_preview_html' => "'''Achachaw! Llamk'apusqaykiqa manam waqaychasqachu, llamk'ana tiyaypa willankuna chinkaptinmi.'''
@@ -925,6 +931,7 @@ Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
 Kayqa maykunapi tukukun, mana allin wakichisqa proxy sirwiytam llamk'achiptiyki.'''",
 'edit_form_incomplete' => "'''Llamk'apuna hunt'ana p'anqamanta huk willasqakunaqa sirwiqman manam chayarqanchu; llamk'apusqaykikuna allinlla kachkaymanta iskaylla llanchispa musuqmanta ruraykachay.'''",
 'editing' => "Llamk'apuspa: $1",
+'creating' => 'Kamarispa: $1',
 'editingsection' => "Llamk'apuspa: $1 (raki)",
 'editingcomment' => "Llamk'apuspa: $1 (musuq raki)",
 'editconflict' => 'Ruray taripanakuy: $1',
@@ -985,6 +992,7 @@ Qullusqachá.",
 'edit-no-change' => "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
 'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
 Kachkañam.",
+'defaultmessagetext' => 'Ñawpaq qillqa',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq t'ikrana rurana qayayniyuqmi.
@@ -1000,6 +1008,10 @@ Chay niykunaqa manam chaninchasqachu.",
 'parser-template-loop-warning' => 'Muyurikuq pusapunam tarisqa: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Pusapunap muyurikuy saywanmi yallisqa ($1)',
 'language-converter-depth-warning' => "Rimay t'ikranap ukhu kayninpa saywanqa yallisqam ($1)",
+'node-count-exceeded-category' => "Watasqakunata nisyu yupayniyuq p'anqakuna",
+'node-count-exceeded-warning' => "P'anqaqa watasqakunata nisyu yupayniyuqmi",
+'expansion-depth-exceeded-category' => "Nisyu mast'ariy ukhu kaqniyuq p'anqakuna",
+'expansion-depth-exceeded-warning' => "P'anqaqa nisyu mast'ariy ukhu kaqniyuqmi",
 
 # "Undo" feature
 'undo-success' => 'Rurasqata kutichiyta atinkim. Manaraq kutichispaykiqa, kay qatiq wakichayta qhawariy rikunaykipaq chiqapta munasqaykichu manallachu, chaymantataq waqaychay kutichinapaq.',
@@ -1142,7 +1154,7 @@ Ama hina kaspa, hallch'akunapi qhaway.",
 
 # Suppression log
 'suppressionlog' => "Ñit'ipay hallch'asqa",
-'suppressionlogtext' => "Kay qatiq sutisuyupiqa ñaqha qullusqakunatam hark'asqakunatapas rikunki, kamachiqkunamanta pakasqa samiqniyuq. [[Special:BlockList|IP hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
+'suppressionlogtext' => "Kay qatiq sutisuyupiqa ñaqha qullusqakunatam hark'asqakunatapas rikunki, kamachiqkunamanta pakasqa samiqniyuq. [[Special:BlockList|Hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
 
 # History merging
 'mergehistory' => "P'anqa wiñay kawsaykunata huñuy",
@@ -1560,6 +1572,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'newsectionsummary' => 'Musuq raki: /* $1 */',
 'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy (JavaScript kananmi)',
 'rc-enhanced-hide' => 'Imaymanachakunata pakay',
+'rc-old-title' => 'ñawpaqta "$1" sutiwan kamarisqa',
 
 # Recent changes linked
 'recentchangeslinked' => "Hukchasqa t'inkimuq",
@@ -1710,6 +1723,7 @@ $1',
 'backend-fail-closetemp' => "Manam atinichu mit'alla willañiqita wichq'ayta.",
 'backend-fail-read' => 'Manam atinichu $1 sutiyuq willañiqita ñawiriyta.',
 'backend-fail-create' => 'Manam atinichu $1 sutiyuq willañiqita kamariyta.',
+'backend-fail-maxsize' => 'Manam atinichu $1 sutiyuq willañiqita kamariyta, {{PLURAL:$2|huk bytemanta|$2 bytemanta}} aswan hatun kaptinmi.',
 'backend-fail-readonly' => '"$1" sutiyuq willañiqi hallch\'ana sirwiqqa ñawirinallapaqmi kachkan, kayrayku: "$2"',
 'backend-fail-synced' => '"$1" sutiyuq willañiqiqa manam sinchichu kachkan ukhupi willañiqi hallch\'ana sirwiqkunapi',
 'backend-fail-connect' => 'Manam atinichu "$1" sutiyuq willañiqi hallch\'ana sirwiqwan t\'inkinakuyta.',
@@ -1717,6 +1731,10 @@ $1',
 'backend-fail-contenttype' => 'Manam atinichu "$1" nisqapi hallch\'ana willañiqip samiqninpa layanta yuqanchayta.',
 'backend-fail-batchsize' => "Willañiqi hallch'ana sirwiqmanqa $1 willañiqi {{PLURAL:$1|ruranayuq|ruranayuq}} tawqam qusqa; saywataq $2 {{PLURAL:$1|ruranam|ruranam}}.",
 
+# File journal errors
+'filejournal-fail-dbconnect' => "Manam atinichu \"\$1\" sutiyuq willañiqi hallch'ana sirwiqpaq p'unchawnintin hallch'awan t'inkiyta.",
+'filejournal-fail-dbquery' => 'Manam atinichu "$1" sutiyuq willañiqi hallch\'ana sirwiqpaq p\'unchawnintin hallch\'ata musuqchayta.',
+
 # Lock manager
 'lockmanager-notlocked' => 'Manam atinichu "$1" nisqata paskayta; manam hark\'asqachu.',
 'lockmanager-fail-closelock' => 'Manam atinichu "$1" nisqapaq hark\'ana willañiqita wichq\'ayta.',
@@ -1833,6 +1851,10 @@ Munaspaykiqa, [[Special:WhatLinksHere/$2|hunt'a sutisuyuta]] qhaway.",
 Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikunaykipaq.",
 'sharedupload-desc-here' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
 [$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchaytaqa kay qatiqpim rikunki.",
+'sharedupload-desc-edit' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
+[$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchayta llamk'apuytachá munaykiman.",
+'sharedupload-desc-create' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
+[$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchayta llamk'apuytachá munaykiman.",
 'filepage-nofile' => 'Manam kanchu kay sutiyuq willañiqi.',
 'filepage-nofile-link' => 'Manam kanchu kay sutiyuq willañiqi, ichataq [$1 churkuytam] atinki.',
 'uploadnewversion-linktext' => 'Kay willañiqi ñaqha musuqchasqata churkuy',
@@ -2039,6 +2061,12 @@ Rikuyniykitaqa k'ullkuchaytam atinki hallch'a layata, ruraqpa sutinta (uchuy ich
 'allpagesprefix' => "Rikuchiy kay k'askaqwan qallariq p'anqakunata:",
 'allpagesbadtitle' => "Qusqa p'anqap sutinqa manam allinchu icha rimaypura, interwiki ñawpa k'askaqniyuq. P'anqa sutipaq mana saqillasqa sananchayuqchá.",
 'allpages-bad-ns' => '{{SITENAME}} tiyaypiqa "$1" suti k\'iti manam kanchu.',
+'allpages-hide-redirects' => 'Pusapunakunata pakay',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Kay p'anqapaq hallch'asqa musuqchasqatam rikuchkanki, $1 pachakamam ñaqha kanman.",
+'cachedspecial-viewing-cached-ts' => "Kay p'anqapaq hallch'asqa musuqchasqatam rikuchkanki, manachá kunallan musuqchasqachu kanman.",
+'cachedspecial-refresh-now' => 'Qhipaq kaqta qhaway.',
 
 # Special:Categories
 'categories' => 'Katiguriyakuna',
@@ -2466,7 +2494,7 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 'ipb-confirm' => "Hark'ayta takyachiy",
 'badipaddress' => 'IP huchhaqa manam allinchu.',
 'blockipsuccesssub' => "Ruraqqa hark'asqañam",
-'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] huchhayuq tiyayqa hark'asqañam. <br />[[Special:BlockList|Hark'asqakunamanta p'anqata]] qhaway hark'akunata hukchanaykipaq.",
+'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] nisqaqa hark'asqam. <br />[[Special:BlockList|Hark'ay sutisuyuta]] qhaway hark'akunata hukchanaykipaq.",
 'ipb-blockingself' => "Kikiykitam hark'aykachachkanki!  Chiqapta kayta rurayta munankichu?",
 'ipb-confirmhideuser' => 'Ruraqta hark\'aykachachkanki, payman "Ruraqta pakay" nisqam.  Chaywanqa manam pipas chay ruraqpa sutinta ima sutisuyupipas hallch\'apipas rikunqachu.  Chiqapta kayta rurayta munankichu?',
 'ipb-edit-dropdown' => "Hark'aypa hamunta llamk'apuy",
@@ -2516,7 +2544,7 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 'blocklog-showsuppresslog' => "Kay ruraqqa ñawpaqta hark'asqam pakasqapas. Ñit'ipay hallch'ataqa kaypim rikunki willasunaykipaq:",
 'blocklogentry' => "hark'an [[$1]]-ta kay pachakama: $2 $3",
 'reblock-logentry' => "hukchan [[$1]]-paq hark'ana allinchanakunata kay pachakama hark'aspa: $2 $3",
-'blocklogtext' => "Kayqa ruraqta hark'asqakunap qispichisqakunappas hallch'anmi. Kikinmanta hark'asqa tiyaykunataqa manam kaypi rikunkichu. [[Special:BlockList|Hark'asqakunamanta p'anqata]] qhaway kunan hark'asqakunata rikunaykipaq.",
+'blocklogtext' => "Kayqa ruraqta hark'asqakunap qispichisqakunappas hallch'anmi. Kikinmanta hark'asqa tiyaykunataqa manam kaypi rikunkichu. [[Special:BlockList|Hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
 'unblocklogentry' => 'paskan "$1"-ta hark\'asqa kaymanta',
 'block-log-flags-anononly' => 'sutinnaqlla',
 'block-log-flags-nocreate' => 'rakiquna kichariyman ama nisqa',
@@ -2763,7 +2791,7 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript llanchiy',
-'javascripttest-disabled' => 'Kay ruranamanqa ama nisqam.',
+'javascripttest-disabled' => 'Kay ruranaqa kay wikipi manam atichisqachu.',
 'javascripttest-title' => '$1 llanchiykunam richkan',
 'javascripttest-pagetext-noframework' => "Kay p'anqaqa JavaScript llanchina purichinallapaqmi kachun.",
 'javascripttest-pagetext-unknownframework' => 'Mana riqsisqa "$1" nisqa llanchina inchu ruray',
@@ -3570,6 +3598,9 @@ MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIY
 'version-software' => "Tiyachisqa llamp'u kaq",
 'version-software-product' => 'Ruruchisqa',
 'version-software-version' => 'Musuqchasqa',
+'version-entrypoints' => "Yaykuna t'uksi URL",
+'version-entrypoints-header-entrypoint' => "Yaykuna t'uksi",
+'version-entrypoints-header-url' => 'URL tiyay',
 
 # Special:FilePath
 'filepath' => 'Willañiqi ñan',
@@ -3757,4 +3788,15 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
 'api-error-uploaddisabled' => 'Kay wikipiqa manam churkuyta atinkichu.',
 'api-error-verification-error' => "Kay willañiqiqa waqllisqachá, icha pantasqa k'askaqniyuqchá.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sikundu|sikundukuna}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minutu|minutukuna}}',
+'duration-hours' => '$1 {{PLURAL:$1|ura|urakuna}}',
+'duration-days' => "{{PLURAL:$1|p'unchaw|p'unchawkuna}}",
+'duration-weeks' => '{{PLURAL:$1|simana|simanakuna}}',
+'duration-years' => '{{PLURAL:$1|wata|watakuna}}',
+'duration-decades' => '{{PLURAL:$1|chunkawata|chunkawatakuna}}',
+'duration-centuries' => '{{PLURAL:$1|pachakwata|pachakwatakuna}}',
+'duration-millennia' => '{{PLURAL:$1|waranqawata|waranqawatakuna}}',
+
 );
index 67dc61f..aeac76c 100644 (file)
@@ -579,6 +579,9 @@ Ti duessas t'annunziar e tscherner ussa in nov pled-clav. Sche ti na levas betg
 Pled-clav temporar: $2",
 'passwordreset-emailsent' => 'In e-mail cun in nov pled-clav è vegnì tramess.',
 
+# Special:ChangeEmail
+'changeemail' => "Midar l'adressa dad e-mail",
+
 # Edit page toolbar
 'bold_sample' => 'Text grass',
 'bold_tip' => 'Text grass',
index c90ec2a..cf299df 100644 (file)
@@ -978,7 +978,8 @@ Paginile .css și .js specifice utilizatorilor au titluri care încep cu literă
 'updated' => '(Actualizat)',
 'note' => "'''Notă:'''",
 'previewnote' => "'''Țineți cont că aceasta este doar o previzualizare.'''
-Modificările dumneavoastră nu au fost încă salvate! [[#editform|→ Continuă editarea]]",
+Modificările dumneavoastră nu au fost încă salvate!",
+'continue-editing' => 'Continuare editare',
 'previewconflict' => 'Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeți să-l salvați acum.',
 'session_fail_preview' => "'''Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.
 Vă rugăm să încercați din nou.
@@ -993,7 +994,7 @@ Modificarea a fost respinsă pentru a preveni deformarea textului paginii.
 Acest fapt se poate întâmpla atunci când folosești un serviciu proxy anonim.'''",
 'edit_form_incomplete' => "'''Unele părți ale formularului de modificare nu au ajuns la server; verificați dacă modificările dumneavoastră sunt intacte și reîncercați.'''",
 'editing' => 'modificare $1',
-'creating' => 'Se creează $1',
+'creating' => 'Crearea paginii $1',
 'editingsection' => 'modificare $1 (secțiune)',
 'editingcomment' => 'Modificare $1 (secțiune nouă)',
 'editconflict' => 'Conflict de modificare: $1',
@@ -1077,6 +1078,8 @@ Acsete argumente au fost omise.',
 'parser-template-loop-warning' => 'Buclă de formate detectată: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limită de adâncime a recursiei depășită ($1)',
 'language-converter-depth-warning' => 'Limita adâncimii convertorului de limbă a fost depășită ($1)',
+'node-count-exceeded-category' => 'Pagini unde numărul de noduri este depășit',
+'node-count-exceeded-warning' => 'Pagina a depășit numărul de noduri',
 
 # "Undo" feature
 'undo-success' => 'Modificarea poate fi anulată. Verificați diferența de dedesupt și apoi salvați pentru a termina anularea modificării.',
@@ -1219,7 +1222,7 @@ Nu ai acces asupra lui.',
 # Suppression log
 'suppressionlog' => 'Înlătură jurnalul',
 'suppressionlogtext' => 'Mai jos este afișată o listă a ștergerilor și a blocărilor care implică conținutul ascuns de administratori.
-Vedeți [[Special:BlockList|adresele IP blocate]] pentru o listă a interzicerilor operaționale sau a blocărilor.',
+Vedeți [[Special:BlockList|lista blocărilor]] pentru o listă a interzicerilor operaționale sau a blocărilor.',
 
 # History merging
 'mergehistory' => 'Unește istoricul paginilor',
@@ -2158,6 +2161,11 @@ Puteți limita vizualizarea selectând tipul jurnalului, numele de utilizator sa
 'allpages-bad-ns' => '{{SITENAME}} nu are spațiul de nume „$1”.',
 'allpages-hide-redirects' => 'Ascunde redirecționările',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'În acest moment vizualizați o versiune din cache a acestei pagini, versiune care poate avea o vechime de $1.',
+'cachedspecial-viewing-cached-ts' => 'În acest moment vizualizați o versiune din cache a acestei pagini, versiune care poate fi incomplet actualizată.',
+'cachedspecial-refresh-now' => 'Ultima versiune.',
+
 # Special:Categories
 'categories' => 'Categorii',
 'categoriespagetext' => '{{PLURAL:$1|Următoarea categorie conține|Următoarele categorii conțin}} pagini sau fișiere.
@@ -2594,8 +2602,8 @@ Precizați motivul blocării; de exemplu indicați paginile vandalizate de acest
 'ipb-confirm' => 'Confirmare blocare',
 'badipaddress' => 'Adresa IP este invalidă.',
 'blockipsuccesssub' => 'Utilizatorul a fost blocat',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] a fost blocată.<br />
-Vezi [[Special:BlockList|lista de adrese IP și conturi blocate]] pentru a revizui adresele blocate.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] a fost blocat{{GENDER:$1||ă|}}.<br />
+Vedeți [[Special:BlockList|lista blocărilor]] pentru a revizui adresele blocate.',
 'ipb-blockingself' => 'Sunteți pe cale să vă autoblocați! Sunteți sigur că doriți să continuați?',
 'ipb-confirmhideuser' => 'Sunteți pe cale să blocați un utilizator cu funcția „ascunde utilizator” activată. Acest lucru va înlătura numele său de utilizator din toate listele și jurnalele. Sunteți sigur că vreți să continuați?',
 'ipb-edit-dropdown' => 'Modifică motivele blocării',
@@ -2648,7 +2656,7 @@ Jurnalul blocărilor este indicat mai jos:',
 Jurnalul suprimărilor este indicat mai jos:',
 'blocklogentry' => 'a blocat utilizatorul „[[$1]]” pe o perioadă de $2 $3',
 'reblock-logentry' => 'a fost schimbată blocarea pentru [[$1]] cu data expirării la $2 $3',
-'blocklogtext' => 'Acest jurnal cuprinde acțiunile de blocare și deblocare. Adresele IP blocate automat nu sunt afișate. Vizitați [[Special:BlockList|lista de adrese blocate]] pentru o listă explicită a adreselor blocate în acest moment.',
+'blocklogtext' => 'Acest jurnal cuprinde acțiunile de blocare și deblocare. Adresele IP blocate automat nu sunt afișate. Vizitați [[Special:BlockList|lista blocărilor]] pentru o listă explicită a adreselor blocate în acest moment.',
 'unblocklogentry' => 'a deblocat utilizatorul $1',
 'block-log-flags-anononly' => 'doar utilizatorii anonimi',
 'block-log-flags-nocreate' => 'crearea de conturi dezactivată',
@@ -3733,6 +3741,9 @@ MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GAR
 'version-software' => 'Software instalat',
 'version-software-product' => 'Produs',
 'version-software-version' => 'Versiune',
+'version-entrypoints' => 'URL-uri pentru puncte de intrare',
+'version-entrypoints-header-entrypoint' => 'Punct de intrare',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Cale fișier',
@@ -3921,4 +3932,15 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'api-error-uploaddisabled' => 'Încărcarea este dezactivată pe acest wiki.',
 'api-error-verification-error' => 'Acest fișier ar putea fi corupt sau poate avea extensia greșită.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|secundă|secunde|de secunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minute|de minute}}',
+'duration-hours' => '$1 {{PLURAL:$1|oră|ore|de ore}}',
+'duration-days' => '$1 {{PLURAL:$1|zi|zile|de zile}}',
+'duration-weeks' => '$1 {{PLURAL:$1|săptămână|săptămâni|de săptămâni}}',
+'duration-years' => '$1 {{PLURAL:$1|an|ani|de ani}}',
+'duration-decades' => '$1 {{PLURAL:$1|deceniu|decenii|de decenii}}',
+'duration-centuries' => '$1 {{PLURAL:$1|secol|secole|de secole}}',
+'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenii|de milenii}}',
+
 );
index 42fcc18..7faafe0 100644 (file)
@@ -725,7 +725,8 @@ Arrecuerdete ca jndr'à le file personalizzete .css e .js s'ause scrivere le tit
 'updated' => '(Cangiete)',
 'note' => "'''Vide Bbuene:'''",
 'previewnote' => "'''Arrecuerdete queste è sole 'n'andeprime.'''
-le cangiaminde non g'onne state angore reggistrate! [[#editform|→ Condinue cu 'u cangiamende]]",
+le cangiaminde non g'onne state angore reggistrate!",
+'continue-editing' => "Condinue 'u cangiamende",
 'previewconflict' => "Sta andeprime fece vedè 'u teste ca ste jndr'à 'u teste de l'area de sus cumme avène fore ce tu decide cu reggistre.",
 'session_fail_preview' => "'''Ne dispiace! Non ge putime processà 'u cangiamende tue purcè s'a perse 'a sessione de le date.
 Pe piacere pruève 'n'otra vote.
@@ -825,6 +826,7 @@ Ste argumende onne state luete.",
 'parser-template-loop-warning' => "Amme acchiete 'nu cicle de template: [[$1]]",
 'parser-template-recursion-depth-warning' => "Ha state supranete 'u limite di ricorsione de le template ($1)",
 'language-converter-depth-warning' => "'U convertitore de lènghe ha subranate 'u limite de profonnetà ($1)",
+'expansion-depth-exceeded-category' => "Pàggene addò 'a profonnetà de l'espanzione jè supranate",
 
 # "Undo" feature
 'undo-success' => "'U cangiamende pò essere annullate.
@@ -970,7 +972,7 @@ Pe piacere condrolle l'archivije.",
 # Suppression log
 'suppressionlog' => 'Archivie de le soppressiune',
 'suppressionlogtext' => "Sotte stè 'n'elenghe de scangellaminde e blocche sus a le condenute scunnute da l'amministrature.
-Vide l'[[Special:BlockList|elenghe de le IP bloccate]] pa liste de le operazziune corrende de espulsione e blocche.",
+Vide l'[[Special:BlockList|elenghe de le IP bloccate]] pe l'elenghe de le operazziune corrende de espulsione e blocche.",
 
 # History merging
 'mergehistory' => "Scuagghie 'a storie de le pàggene",
@@ -1585,7 +1587,9 @@ Ce 'u probbleme angore jè presende, condatte 'n'[[Special:ListUsers/sysop|ammin
 'backend-fail-closetemp' => 'Non ge pozze achiudere file temboranèe.',
 'backend-fail-read' => "Non ge pozze leggere 'u file $1.",
 'backend-fail-create' => "Non ge pozze ccrejà 'u file $1.",
+'backend-fail-readonly' => 'L\'archivije de rete "$1" jè pe stu mumende in sole letture. \'U mutive ha state: "$2"',
 'backend-fail-connect' => 'Non ge pozze connettere \'a memorie de rrete "$1".',
+'backend-fail-internal' => "'N'errore scanusciute s'à verificate jndr'à l'archivije de rrete \"\$1\".",
 
 # Lock manager
 'lockmanager-notlocked' => 'Non ge pozze sbloccà "$1"; jidde non g\'è bloccate.',
@@ -1922,6 +1926,9 @@ Pò condenè une  cchiù carattere ca non ge ponne essere ausate jndr'à le tite
 'allpages-bad-ns' => '{{SITENAME}} non ge tène \'u namaspace "$1".',
 'allpages-hide-redirects' => 'Scunne le redirezionaminde',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => "Vide l'urteme.",
+
 # Special:Categories
 'categories' => 'Le Categorije',
 'categoriespagetext' => "{{PLURAL:$1|'A seguende categorije tène|Le seguende categorije tènene}} pàggene o media.
@@ -2427,7 +2434,7 @@ L'archivije de le soppressiune 'u puè acchià aqquà sotte pe riferimende:",
 'blocklogentry' => "blocchete [[$1]] pe 'nu timbe de $2 $3",
 'reblock-logentry' => "cangiate l'imbostazione de le blocche pe [[$1]] cu 'na data de scadenze de $2 $3",
 'blocklogtext' => "Quiste è l'archivije de l'aziune de blocche e sblocche pe l'utinde.
-L'indirizze IP automaticamende bloccate non ge stonne jndr'à liste.
+L'indirizze IP automaticamende bloccate non ge stonne jndr'à l'elenghe.
 Vide 'a [[Special:BlockList|liste de le IP bloccate]] pa liste de le operaziune de ban e blocche ca stonne attive mò.",
 'unblocklogentry' => 'sblocchete $1',
 'block-log-flags-anononly' => "sulamende l'utinde anonime",
@@ -2694,7 +2701,9 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'javascripttest-disabled' => "Sta funzione non g'à state abbilitate sus a sta Uicchi.",
 'javascripttest-title' => 'Stoche a esegue $1 test',
 'javascripttest-pagetext-noframework' => 'Sta pàgene jè riservate pe le esecuziune de le test de Javascript.',
+'javascripttest-pagetext-unknownframework' => 'Ambiende de teste scanusciute "$1".',
 'javascripttest-pagetext-frameworks' => 'Pe piacere scacchie une de le seguende ambiende de test: $1',
+'javascripttest-qunit-heading' => 'Ambiende de test MediaUicchi JavaScript QUnit',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => "'A pàgene utende meje",
@@ -3718,6 +3727,9 @@ Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenz
 'version-software' => 'Softuer installete',
 'version-software-product' => 'Prodotte',
 'version-software-version' => 'Versione',
+'version-entrypoints' => 'Punde de ingresse de le URL',
+'version-entrypoints-header-entrypoint' => "Punde d'ingresse",
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => "Percorse d'u fail",
@@ -3871,13 +3883,16 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 # API errors
 'api-error-badaccess-groups' => 'Tu non ge puè carecà file sus a sta Uicchi.',
 'api-error-badtoken' => 'Errore inderne: Gettone errate.',
+'api-error-copyuploaddisabled' => "'U carecamende da URL jè disabbilitate sus a stu server.",
 'api-error-duplicate-popup-title' => 'Dupleche {{PLURAL:$1|file|file}}',
 'api-error-empty-file' => "'U file ca tu è confermate ere vacande.",
 'api-error-emptypage' => 'Quanne se ne ccreje une, le pàggene vacande non ge sò permesse.',
+'api-error-fetchfileerror' => "Errore inderne: Quacchecose ha sciute stuèrte quanne ste analizzave 'u file.",
 'api-error-file-too-large' => "'U file ca tu è confermate jè troppe granne.",
 'api-error-filename-tooshort' => "'U nome d'u file jè troppe curte.",
 'api-error-filetype-banned' => 'Stu tipe de file jè vietate.',
 'api-error-filetype-missing' => "'U file jè senze 'n'estenzione.",
+'api-error-hookaborted' => "'U cangiamende ca tu stè pruève a ffà ha state inderrotte da 'n'estenzione.",
 'api-error-http' => "Errore inderne: Non ge se riesce a collegà a 'u server",
 'api-error-illegal-filename' => "'U nome d'u file non g'è permesse.",
 'api-error-invalid-file-key' => "Errore inderne: 'U file non ge se iacchie jndr'à memorie temboranèe.",
@@ -3899,4 +3914,15 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 'api-error-uploaddisabled' => 'Le carecaminde sonde disabbilitate sus a sta Uicchi.',
 'api-error-verification-error' => "Stu file pò essere scuasciate, o ave 'n'estenzione sbagliate.",
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|seconde|seconde}}',
+'duration-minutes' => '{{PLURAL:$1|minute|minute}}',
+'duration-hours' => '{{PLURAL: $1|ore|ore}}',
+'duration-days' => '$1 {{PLURAL:$1|sciurne|sciurne}}',
+'duration-weeks' => '{{PLURAL: $1|sumàne|sumàne}}',
+'duration-years' => '{{PLURAL: $1|anne|anne}}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decade}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sechele|sechele}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennie|millennie}}',
+
 );
index 8359bb6..aeb02f2 100644 (file)
@@ -22,6 +22,7 @@
  * @author Claymore
  * @author Comp1089
  * @author DCamer
+ * @author Daniyar
  * @author Dim Grits
  * @author Don Alessandro
  * @author Eleferen
@@ -39,6 +40,7 @@
  * @author Illusion
  * @author Iniquity
  * @author Innv
+ * @author Jackie
  * @author JenVan
  * @author Jl
  * @author KPu3uC B Poccuu
  * @author Kv75
  * @author Lockal
  * @author MaxSem
+ * @author Ola
  * @author Ole Yves
  * @author Putnik
  * @author Rave
  * @author Rubin
+ * @author Sagan
  * @author Sk
  * @author TarzanASG
  * @author Temuri rajavi
@@ -777,7 +781,7 @@ $2',
 'invalidemailaddress' => 'Адрес электронной почты не может быть принят, так как он не соответствует формату.
 Пожалуйста, введите корректный адрес или оставьте поле пустым.',
 'cannotchangeemail' => 'Адреса электронной почты этой учётной записи не могут быть изменены в этой вики.',
-'emaildisabled' => 'ЭÑ\82оÑ\82 Ñ\81айÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82 Ð¾Ñ\82пÑ\80авлÑ\8fÑ\82Ñ\8c Ñ\81ообÑ\89ениÑ\8f Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82ы.',
+'emaildisabled' => 'Ð\91ұл Ñ\81айÑ\82 Ñ\8d-поÑ\88Ñ\82анÑ\8bÒ£ Ñ\85абаÑ\80ламаÑ\81Ñ\8bн Ð¶Ñ\96беÑ\80е Ð°Ð»Ð¼Ð°Ð¹Ð´ы.',
 'accountcreated' => 'Учётная запись создана',
 'accountcreatedtext' => 'Создана учётная запись участника $1.',
 'createaccount-title' => '{{SITENAME}}: создание учётной записи',
@@ -983,7 +987,8 @@ $2
 'updated' => '(Обновлена)',
 'note' => "'''Примечание:'''",
 'previewnote' => "'''Помните, что это только предварительный просмотр.'''
-Ваши изменения ещё не были записаны! [[#editform|→ продолжить редактирование]]",
+Ваши изменения ещё не были сохранены!",
+'continue-editing' => 'Продолжить редактирование',
 'previewconflict' => 'Этот предварительный просмотр отражает текст в верхнем окне редактирования так, как он будет выглядеть, если вы решите записать его.',
 'session_fail_preview' => "'''К сожалению, сервер не смог обработать вашу правку из-за потери идентификатора сессии.
 Пожалуйста, попробуйте ещё раз.
@@ -1290,7 +1295,7 @@ $1",
 'searchhelp-url' => 'Help:Содержание',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показать страницы с этим префиксом]]',
 'searchprofile-articles' => 'Основные страницы',
-'searchprofile-project' => 'СÑ\82Ñ\80аниÑ\86Ñ\8b Ñ\81пÑ\80авки Ð¸ Ð¿Ñ\80оекÑ\82ов',
+'searchprofile-project' => 'СÑ\82Ñ\80аниÑ\86Ñ\8b Ñ\81пÑ\80авки Ð¸ Ð¿Ñ\80оекÑ\82а',
 'searchprofile-images' => 'Мультимедиа',
 'searchprofile-everything' => 'Везде',
 'searchprofile-advanced' => 'Расширенный',
@@ -2168,6 +2173,11 @@ $1',
 'allpages-bad-ns' => '{{SITENAME}} не содержит пространства имён «$1».',
 'allpages-hide-redirects' => 'Скрыть перенаправления',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Вы просматриваете закэшированную версию страницы, она могла быть обновлена $1 назад.',
+'cachedspecial-viewing-cached-ts' => 'Вы просматриваете кэшированную версию этой страницы, которая может серьёзно отличаться от текущей версии.',
+'cachedspecial-refresh-now' => 'Просмотреть последнюю версию.',
+
 # Special:Categories
 'categories' => 'Категории',
 'categoriespagetext' => '{{PLURAL:$1|Следующая категория содержит|Следующие категории содержат}} страницы или медиа-файлы.
@@ -2605,8 +2615,8 @@ $1',
 'ipb-confirm' => 'Подтвердить блокировку',
 'badipaddress' => 'IP-адрес записан в неправильном формате, или участника с таким именем не существует.',
 'blockipsuccesssub' => 'Блокировка произведена',
-'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] заблокирован.<br />
-См. [[Special:BlockList|список заблокированных IP-адресов]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] {{GENDER:$1|заблокирован|заблокирована}}.<br />
+См. [[Special:BlockList|список заблокированных IP-адресов]] для просмотра блокировок.',
 'ipb-blockingself' => 'Вы пытаетесь заблокировать себя самого! Вы уверены, что вы хотите это сделать?',
 'ipb-confirmhideuser' => 'Вы намереваетесь заблокировать участника и скрыть его имя. Оно не будет отображаться в списках и журналах. Вы уверены, что хотите это сделать?',
 'ipb-edit-dropdown' => 'Править список причин',
@@ -3826,6 +3836,11 @@ MediaWiki распространяется в надежде, что она бу
 'version-software' => 'Установленное программное обеспечение',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
+'version-entrypoints' => 'Адреса точек входа',
+'version-entrypoints-header-entrypoint' => 'Точка входа',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Путь к статье]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Путь к скрипту]',
 
 # Special:FilePath
 'filepath' => 'Путь к файлу',
@@ -4014,4 +4029,15 @@ MediaWiki распространяется в надежде, что она бу
 'api-error-uploaddisabled' => 'В этой вики отключена возможность загрузки файлов.',
 'api-error-verification-error' => 'Возможно, этот файл повреждён или имеет неправильное расширение.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунда|секунды|секунд}}',
+'duration-minutes' => '$1 {{PLURAL:$1|минута|минуты|минут}}',
+'duration-hours' => '$1 {{PLURAL:$1|час|часа|часов}}',
+'duration-days' => '$1 {{PLURAL:$1|день|дня|дней}}',
+'duration-weeks' => '$1 {{PLURAL:$1|неделя|недели|недель}}',
+'duration-years' => '$1 {{PLURAL:$1|год|года|лет}}',
+'duration-decades' => '$1 {{PLURAL:$1|декада|декады|декад}}',
+'duration-centuries' => '$1 {{PLURAL:$1|век|века|веков}}',
+'duration-millennia' => '$1 {{PLURAL:$1|тысячелетие|тысячелетия|тысячелетий}}',
+
 );
index 7c2ac4c..b3f8868 100644 (file)
@@ -19,6 +19,7 @@
  * @author Mahitgar
  * @author Naveen Sankar
  * @author Omnipaedista
+ * @author Shantanoo
  * @author Shijualex
  * @author Shubha
  * @author Vibhijain
@@ -536,7 +537,7 @@ $1',
 'versionrequiredtext' => 'एतत्पृष्ठं प्रयोक्तुं मीडियाविकि इत्येतस्य $1तमा आवृत्तिः आवश्यकी। पश्यतु [[Special:Version|आवृत्ति-सूचिका]]',
 
 'ok' => 'अस्तु',
-'pagetitle' => '',
+'pagetitle' => '$1 - {{SITENAME}}',
 'retrievedfrom' => '"$1" इत्यस्माद् उद्धृतम्',
 'youhavenewmessages' => 'भवदर्थम् $1 सन्ति। ($2).',
 'newmessageslink' => 'नूतनाः सन्देशाः',
@@ -1073,7 +1074,7 @@ $2
 'notitlematches' => 'न कस्यापि पृष्ठस्य शीर्षकम् अस्य समम्।',
 'notextmatches' => 'न कस्यापि पृष्ठस्य पाठः अस्य सममस्ति',
 'prevn' => 'प्राक्तनानि {{PLURAL:$1|$1}}',
-'nextn' => 'अग्रिमाणि{{PLURAL:$1|$1}}',
+'nextn' => 'अग्रिमाणि {{PLURAL:$1|$1}}',
 'prevn-title' => 'प्राक्तन-{{PLURAL:$1|फलितम्| फलितानि}}',
 'nextn-title' => 'प्राक्तन-{{PLURAL:$1|फलितम्| फलितानि}}',
 'shown-title' => 'प्रत्येकस्मिन् पृष्ठे $1 {{PLURAL:$1|फलितम्|फलितानि}} दर्श्यताम्',
diff --git a/languages/messages/MessagesSat.php b/languages/messages/MessagesSat.php
new file mode 100644 (file)
index 0000000..01a84cd
--- /dev/null
@@ -0,0 +1,813 @@
+<?php
+/** Santali (Santali)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Albinus
+ * @author Ghonokuashabaskey
+ * @author Nipon087
+ * @author Salvator
+ * @author Samar88
+ * @author Srabony90
+ */
+
+$messages = array(
+# User preference toggles
+'tog-hideminor' => 'Nitaḱ bodolaḱre huḍiṅ kạmi danaṅme',
+'tog-showtoc' => 'Ṭibilre menaḱako ńel ( sakamkore 3 khon jạti hedlayenko)',
+'tog-watchcreations' => 'Sakamko songe  Ińaḱ ńelok tạlikare benao',
+'tog-enotifwatchlistpages' => 'E-mailạńme one tinre in̕aḱ n̕eloḱ tạlika do bodolok',
+'tog-enotifusertalkpages' => 'E-mailạn̕me one tinre in̕aḱ roṛaḱ laṛcaṛ sakam do bodoloḱa',
+'tog-enotifminoredits' => 'E-mailạn̕me arhõ one tinre in̕aḱ sakamre huḍiń kạmi hoyoḱ',
+'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
+'tog-oldsig' => 'Menaḱ signạtar',
+'tog-uselivepreview' => 'Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)',
+'tog-watchlisthideown' => 'Ńeloḱ talikare ińaḱ joṛao kamiko danaṅme',
+'tog-watchlisthideminor' => 'Ńeloḱ tạlikare ińak huḍiṅ joṛao kạmiko danaṅme',
+'tog-ccmeonemails' => 'E-mail reaḱ kopy kulạńme Eṭaḱ laṛcaṛko kulakome',
+
+'underline-always' => 'Sanam okte',
+'underline-never' => 'Tis hõ ban̕',
+
+# Dates
+'sunday' => 'Aṭhowar',
+'monday' => 'Som',
+'tuesday' => 'Mońgol',
+'wednesday' => 'Budh',
+'thursday' => 'Lukhibar',
+'friday' => 'Sokolbar',
+'saturday' => 'Sạnicar',
+'sun' => 'Aṭhwar',
+'mon' => 'Som',
+'tue' => 'Mongolbar',
+'wed' => 'Budhbar',
+'thu' => 'Lukhibar',
+'fri' => 'Sokolbar',
+'sat' => 'Sạnicar',
+'january' => 'Jạnuạri',
+'february' => 'Februạri',
+'march' => 'Marc',
+'april' => 'Epril',
+'may_long' => 'Me̠',
+'june' => 'Jun',
+'july' => 'Julại',
+'august' => 'A̠go̠sṭ',
+'september' => 'Se̠ṕṭembạ̣r',
+'october' => 'O̠ḱ́ṭo̠bo̠r',
+'november' => 'Nove̠mbo̠r',
+'december' => 'Ḍisembo̠r',
+'january-gen' => 'Jạnuạri',
+'february-gen' => 'Februạri',
+'march-gen' => 'Marc',
+'april-gen' => 'Epril',
+'may-gen' => 'Me',
+'june-gen' => 'Jun',
+'july-gen' => 'Julại',
+'august-gen' => 'Ago̠sṭ',
+'september-gen' => 'Se̠ṕṭembo̠r',
+'october-gen' => 'O̠ḱ́ṭo̠bo̠r',
+'november-gen' => 'Nove̠mbo̠r',
+'december-gen' => 'December',
+'jan' => 'Jạn',
+'feb' => 'Febr',
+'mar' => 'Ma̠r',
+'apr' => 'Epr',
+'may' => 'Me',
+'jun' => 'Ju̠n',
+'jul' => 'Ju̠l',
+'aug' => 'Ago̠',
+'sep' => 'Seṕ',
+'oct' => 'Okṭ',
+'nov' => 'No̠v',
+'dec' => 'Dis',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Bivag|Bivagko}}',
+'category_header' => 'Sakam korenaḱ rokom sokom "$1"',
+'subcategories' => 'Huḍiń rokom sokomko',
+'hidden-categories' => '{{PLURAL:$1|Dãnań renaḱ|Dãnań renaḱ 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-article-count' => '{{PLURAL:$2| Noa keṭagoriredo eken tayomtenaḱ sakam menaḱa.| Tayom {{PLURAL:$2| sakam do |$1 sakamko kana}} nia keṭagorire, sanamkote  hoyoḱkana $2 .}}',
+'listingcontinuesabbrev' => 'Calaḱa',
+'noindex-category' => 'Unuduḱ sakamkodo bạnuḱa',
+
+'about' => 'Lạgitte, Lạgti',
+'newwindow' => 'Nãwã khiṛki jhijme',
+'cancel' => 'Badme',
+'moredotdotdot' => 'Aema',
+'mypage' => 'In̕aḱ sakam',
+'mytalk' => 'Iñaḱ́ ro̠ṛ',
+'navigation' => 'Ñamme',
+
+# Cologne Blue skin
+'qbfind' => 'N̕am',
+'qbbrowse' => 'Sendra',
+'qbedit' => 'Tońge',
+'qbpageoptions' => 'Noa sakam',
+'qbmyoptions' => 'In̕anḱ sakamko',
+'qbspecialpages' => 'Asokay teaḱ sakamko',
+'faq' => 'Baḍae kupuliko',
+
+# Vector skin
+'vector-action-addsection' => 'Asol katha joṛaome',
+'vector-action-delete' => 'Giḍi',
+'vector-action-move' => 'Ocok',
+'vector-action-protect' => 'Bańcao',
+'vector-action-undelete' => 'Bań getgiḍi',
+'vector-action-unprotect' => 'Bodol rukhiyạ',
+'vector-view-create' => 'Tearme',
+'vector-view-edit' => 'So̠mpado̠n',
+'vector-view-history' => 'Jạṛ ńelme',
+'vector-view-view' => 'Paṛhaḱme',
+'vector-view-viewsource' => 'Ńamoḱaḱ ńelme',
+'actions' => 'Kạmi',
+'namespaces' => 'Ñutum jaiga',
+'variants' => 'Etaḱko',
+
+'errorpagetitle' => 'vul',
+'returnto' => "$1 te ruar-rok' me",
+'tagline' => 'Oka khoć',
+'help' => 'Go̠ṛo̠',
+'search' => 'Se̠ndra',
+'searchbutton' => 'Se̠ndra',
+'go' => 'Calaḱme',
+'searcharticle' => 'Calaḱme',
+'history' => 'Sakam reaḱ jạṛ',
+'history_short' => 'Jạṛ',
+'printableversion' => 'Chapai lekan version',
+'permalink' => 'Terejuge joṛao',
+'print' => 'Chapa',
+'view' => 'Udukme',
+'edit' => 'So̠mpado̠n',
+'create' => 'Tearme',
+'editthispage' => 'Noa sakam joṛaome',
+'create-this-page' => 'Noa sakam benao me',
+'delete' => 'muchau me',
+'deletethispage' => 'Noa sakam do get giḍikam',
+'undelete_short' => 'Bań get giḍika',
+'protect' => "banchao'",
+'protect_change' => 'Judạ',
+'protectthispage' => 'Noa sakam ban̕caome',
+'unprotect' => 'Bodol ban̕cao',
+'newpage' => 'Nãwã sakam',
+'talkpage' => 'Noa sakam galmaraome',
+'talkpagelinktext' => 'Ro̠ṛme',
+'specialpage' => 'Osokayteaḱ sakam',
+'personaltools' => 'Nijaḱ jontropạti',
+'postcomment' => 'Nãwã pahaṭa',
+'articlepage' => 'Menaḱ sakam uduḱme',
+'talk' => 'Galmarao',
+'views' => 'Ñel koyoḱ',
+'toolbox' => 'Jontopạti baḱso',
+'userpage' => 'Laṛcaṛićaḱ sakam uduḱme',
+'projectpage' => 'Porjakṭ sakam uduḱme',
+'imagepage' => 'Rẽt sakam uduḱme',
+'mediawikipage' => 'Mesag sakam uduḱme',
+'viewhelppage' => 'Goṛoaḱ sakam n̕elme',
+'viewtalkpage' => 'Galmarao ńelme',
+'otherlanguages' => 'Eṭagak pạrsi',
+'redirectedfrom' => '$1 khon ạcur heć akana',
+'redirectpagesub' => 'Bań sojhe sakam',
+'lastmodifiedat' => 'Noa sakam do sạjao hoena $1, $2 te',
+'protectedpage' => 'Rukhíạ sakamko',
+'jumpto' => 'Calaḱme :',
+'jumptonavigation' => 'Ñamme',
+'jumptosearch' => 'Sendra',
+'pool-timeout' => 'Somoy paromena cạbi lạgit́te tạṅgi hoyoḱkana',
+'pool-errorunknown' => 'Bań baḍayaḱ bhul',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutsite' => 'babo̠tre',
+'aboutpage' => 'Project: Babo̠t',
+'copyrightpage' => '{{ns:project}}: Eḱteạr',
+'currentevents' => 'Cạlit ghoṭnako',
+'currentevents-url' => 'Project: Nitaḱ evenṭ ko',
+'disclaimers' => 'Dạbi bạnuḱko',
+'disclaimerpage' => 'Project: Sadharon ḍiskleimarko(General disclaimer)',
+'edithelp' => 'Tońge goṛo',
+'edithelppage' => 'Help:So̠mpado̠n',
+'helppage' => 'Help: Bhitri renaḱ',
+'mainpage' => 'Mukhiạ Sakam',
+'mainpage-description' => 'Mukhiạ sakam',
+'policy-url' => 'Project:Ritiniti',
+'portal' => 'Khũṭ boloḱ ho̠r',
+'portal-url' => 'Project: Khũṭ bolokt họr',
+'privacy' => 'Nijaḱ eḱtear',
+'privacypage' => 'Project: Nijaḱ eḱteạr',
+
+'ok' => 'Ṭhik gea',
+'retrievedfrom' => '"$1" khon ñam ạgui',
+'youhavenewmessages' => 'Amaḱ do $1 ($2) menaḱa',
+'newmessageslink' => 'Nãwã sombat',
+'newmessagesdifflink' => 'Mucạt bodol',
+'youhavenewmessagesmulti' => 'Amaḱ nãwã mesag kodo',
+'editsection' => 'So̠mpado̠n',
+'editold' => 'So̠mpado̠n',
+'viewsourceold' => 'Ńamoḱ jayga',
+'editlink' => 'Tońge',
+'viewsourcelink' => '̕Ńel renaḱ ḍahar',
+'editsectionhint' => 'Sapṛao dhara: $1',
+'toc' => 'Menaḱaḱko',
+'showtoc' => 'Uduḱme',
+'hidetoc' => 'uku, Danaṅ',
+'collapsible-collapse' => 'Murchạo caba',
+'collapsible-expand' => 'Phaylao',
+'thisisdeleted' => 'N̕el se doho ruạṛ',
+'viewdeleted' => 'Ńelme',
+'feedlinks' => 'Jom oco',
+'site-atom-feed' => ' $1 Jom oco',
+'page-atom-feed' => '"$1" khon khudri jom',
+'red-link-title' => '$1 (niạ sakamdo bạnuḱa)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Sakam',
+'nstab-user' => 'Laṛcaṛicaḱ sakam',
+'nstab-media' => 'Midiạ sakam',
+'nstab-special' => 'Jạruṛ pata',
+'nstab-project' => 'Porject reaḱ sakam',
+'nstab-image' => 'Fail',
+'nstab-mediawiki' => 'Mesag',
+'nstab-template' => 'Sajao sakam',
+'nstab-help' => 'Goṛo sakam',
+'nstab-category' => 'Juṛu ko',
+
+# Main script and global functions
+'nosuchaction' => 'Noṅkanaḱ kạmi bạnuḱa',
+'nosuchspecialpage' => 'Noṅkanaḱ asokay sakam do banuḱa',
+
+# General errors
+'error' => 'bhul',
+'laggedslavemode' => "'''Sontoroḱme:''' sakamre do nahaḱ nãwãnaḱko paseć bạnuḱa.",
+'missing-article' => '"$1" $2 noa ńutumanaḱ sakhiyaxt sakamre olakanaḱ do bań ṅamoka.
+Noa hoy renaḱ karon do hoyoḱkana cabak tạrik pharak se noare joṛao sakam do get giḍi akana.
+Judi noa do karon bań hoylen khan, noa do am sopṭoyer re kạtictem ńam daṛeyaḱa.
+Daya katet́ noa do nonde [[Special:ListUsers/sysop|administrator]],  ṭhen lạime, URL hotete.',
+'missingarticle-rev' => '(Nãwã aro#: $1)',
+'missingarticle-diff' => 'pharak',
+'internalerror' => 'Bhitri reaḱ bhul',
+'internalerror_info' => 'Bhitri reaḱ bhul:',
+'badarticleerror' => 'Noa sakamre kạmiko do baṅ puraolena.',
+'cannotdelete' => 'Nao sakam se rẽt do baṅ get giḍilena.
+Noa do pasec eṭaḱ hoṛ hotete lahare get giḍi akana.',
+'cannotdelete-title' => 'Sakam do baṅ get giḍiḱkana',
+'badtitle' => "barich' bishó́́́́y",
+'badtitletext' => 'Amaḱ nehorakaḱ sakam ńutum do bań puraoa, bạnuka, se be sudhrạo joṛao bhitri katha se bhitri wiki ńutum.
+Noa re do mit se aema bisó menaḱa oka do ńutumre bań beoharok.',
+'viewsource' => 'Ńamoḱaḱ ńelme',
+'protectedpagetext' => 'Noa sakam do ol toṅge lạgit́te do bańcao gea.',
+'namespaceprotected' => "Amaḱ do sakamko joṛao lạgit́te ạidạri banuḱ tama '''$1''' ńutumjayga.",
+'ns-specialprotected' => 'Asokay teaḱ sakamkodo baṅ oltoṅgea.',
+
+# Virus scanner
+'virus-scanfailed' => 'Skan do baṇ hoylena',
+'virus-unknownscanner' => 'Baṅ urum anṭvayras:',
+
+# Login and logout pages
+'yourname' => 'Beoboharicaḱ ńutum',
+'yourpassword' => 'Uku namber',
+'yourpasswordagain' => 'Arhõ oku namber olme',
+'remembermypassword' => 'In̕aḱ boloḱaḱ disạyme',
+'securelogin-stick-https' => 'Bhitri bolo kate HTTPS re soṅge tãhenme',
+'login' => "bolok' duar",
+'nav-login-createaccount' => 'Boloḱ́ duạr / ekaunt tearme',
+'userlogin' => 'Bhitri bolon / ekaunṭ tear',
+'userloginnocreate' => 'Bhitri bolo',
+'logout' => 'Bahre oḍoń',
+'userlogout' => 'Bahre oḍoń',
+'notloggedin' => 'Bhitri baṅ bolokana',
+'nologin' => 'Ekaunṭ do menaḱgea?',
+'nologinlink' => 'account tear me',
+'createaccount' => 'Ṭhai benaome',
+'gotaccount' => 'Ekaunṭ menaḱgeya?',
+'gotaccountlink' => 'Bhitri bolon',
+'userlogin-resetlink' => 'Amaḱ boloḱ talam cạbi sanamem hiṛińkeda?',
+'createaccountmail' => 'E-mail hotete',
+'createaccountreason' => 'Karon',
+'badretype' => 'Am do okaṭaḱ oku nambarkom em keda ona do baṅ milạolena.',
+'userexists' => 'Laṛcaṛicaḱ ńutum em hoyena ona do beohar hoyakana.
+Dayakatet́ eṭagaḱ ńutum bachaome.',
+'loginerror' => 'Bhitri bolok do vulgea',
+'createaccounterror' => 'Ekaunṭ do baṅ benao lena:',
+'loginsuccesstitle' => 'Bhitri boloḱ do moctege puraoena',
+'loginsuccess' => "'''Am do nitoḱ bolo menama {{SITENAME}} re",
+'nouserspecified' => 'Am do pusṭaote laṛcaṛićaḱ ńutum em hoyoḱtama.',
+'login-userblocked' => 'Nui laṛcaṛic doe esetgea. bhitri boloḱ ạidạri bań emoḱ kana.',
+'wrongpassword' => 'Bań milaoaḱ oku nambar em hoyakana.
+Daya kate arhõ mitdhom kurumuṭuyme.',
+'wrongpasswordempty' => 'Em hoyen oku nambar do cetge banuḱa.
+Daya katet́ arhõ kurumuṭuyme.',
+'passwordtooshort' => 'Oku nambar do kom katet́ hoyoḱ jạruṛa 6 olko mudre',
+'password-name-match' => 'Amaḱ oku nambar do amaḱ ńutum khon eṭaḱ hoyoḱ jạruṛtama.',
+'password-login-forbidden' => 'Noa laṛcaṛicaḱ ńutum ar oku nambar do ạnlekate baṅkana.',
+'mailmypassword' => 'E-mail reaḱ nãwã uko katha',
+'passwordremindertitle' => 'Nãwã nitlạgit oku nambar {{SITENAME}} lạgit́te',
+'noemail' => 'Nonḍe do laṛcaṛlạgit́te jahan oku nambar sap doho bạnuḱa.',
+'noemailcreate' => 'Am do mitṭen jewet e-mail ṭhikạna em jaruṛ menaḱtama.',
+'passwordsent' => '"$1" ṭhikạnate resṭariyen e-mail lạgit́te mitṭen oku nambar em hoyena.
+Daya kate ńam porte arhõ bhitri boloḱme.',
+'mailerror' => 'Vul mail em:',
+'emailconfirmlink' => 'Amaḱ e-mail ṭhikana do sạriyme.',
+'cannotchangeemail' => 'Ekaunṭ e-mail ṭhikạnakodo noa wiki re baṅ bodoloḱ kana.',
+'accountcreated' => 'Ekaunṭ do teyarena',
+'accountcreatedtext' => '$1 lạgit́te ekaunṭ do benaoena.',
+'createaccount-title' => '{{SITENAME}} lạgit́te ekaunṭ benao',
+'createaccount-text' => 'Okoe co am lạgit́te mitṭen ekaunṭko amaḱ e-mail ṭhikạna lạgit {{SITENAME}} re ($4) ńutum "$2", oku nambar "$3".
+Am do mesagem baṅ daṛeyaḱa, judi noa ekaunṭ do vulge benaolen khan.',
+'login-abort-generic' => 'Amaḱ bhitri boloḱ do baṅ hoylena - batena.',
+'loginlanguagelabel' => 'katha: $1',
+
+# Change password dialog
+'resetpass' => 'Oku nambar bodol',
+'resetpass_header' => 'Ekaunṭ oku namber bodol',
+'oldpassword' => 'Mare uku nombor',
+'newpassword' => 'Nãwã oku nomber',
+'retypenew' => 'Doṛhate oku namber olme',
+'resetpass_submit' => 'Oku namber joṛao ar bhitri bolok',
+'resetpass_success' => 'Amaḱ oku namber do napayte bodolena!
+Nitoḱ do am bhitritem boloḱkana...',
+'resetpass_forbidden' => 'Oku namber do baṅ bodoloklena',
+'resetpass-no-info' => 'Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.',
+'resetpass-submit-loggedin' => 'Oku namber bodol',
+'resetpass-submit-cancel' => 'Bạgi',
+
+# Special:PasswordReset
+'passwordreset' => 'Nãwãte oku nambar emme',
+'passwordreset-legend' => 'Nãwãte oku nambar emme',
+'passwordreset-username' => 'Beoharicaḱ ńutum:',
+'passwordreset-email' => 'E-mail ṭhikạna:',
+'passwordreset-emailelement' => 'Beoharicaḱ ńutum:
+Nit lạgit oku nambar:',
+'passwordreset-emailsent' => 'Mitṭen disạ ruaṛ e-mail do kulena.',
+'passwordreset-emailsent-capture' => 'Mit́ṭen disạ ruaṛaḱ e-mail dokulena, oka do latarre ńeloḱ kana.',
+'passwordreset-emailerror-capture' => 'Mit́ṭen disạ ruạṛ e-mail do hatoena, oka do latarre ńelok kana, menkhan beoharic ṭhen do baṇ seṭerlena.',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mail ṭhikạna do bodolme',
+'changeemail-header' => 'Ekaunṭ e-mail ṭhikạna do bodolme',
+'changeemail-text' => 'Amaḱ e-mail ṭhikạna bodol lạgit́te noa forom purao me. Am do noa sariyaḱ lạgit́te amaḱ oku nambar em jạruṛtama.',
+'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-newemail' => 'Nãwã e-mail ṭhikạna:',
+'changeemail-none' => '(Okaṭaḱ hõ baṅ)',
+'changeemail-submit' => 'E-mail bodolme',
+'changeemail-cancel' => 'Badme',
+
+# Edit page toolbar
+'bold_sample' => 'Moṭa onol',
+'bold_tip' => 'Moṭa onol',
+'italic_sample' => 'Beka onol',
+'italic_tip' => 'Beka onol',
+'link_sample' => 'Joṛaotet́ reaḱ bohoḱ',
+'link_tip' => 'Bhitri reak joṛaotet́',
+'extlink_sample' => 'http://www.nạmuna.makaṛgạṭi ạmạli',
+'extlink_tip' => 'Baherenaḱ jońṛao (disạyme htt://prefix)',
+'headline_sample' => 'Bohok katha',
+'headline_tip' => 'level 2 guḍkatha',
+'nowiki_sample' => 'Begor format olko bhoraome',
+'nowiki_tip' => 'wiki formatting bạgiyaḱme',
+'image_tip' => 'Tol Fael',
+'media_tip' => 'file reaḱ jońṛao',
+'sig_tip' => 'Amaḱ suhi sãote okte',
+'hr_tip' => 'Barabạri dag',
+
+# Edit pages
+'summary' => 'Guṭ katha',
+'subject' => 'Bisoy/Bohoḱ katha:',
+'minoredit' => 'Noa do hudiń joṛao kami',
+'watchthis' => 'Noa sakam ńelme',
+'savearticle' => 'Sakam sebhme',
+'preview' => 'Ńel, Unuduḱ',
+'showpreview' => 'Unuduḱ',
+'showlivepreview' => 'Jewet uduk',
+'showdiff' => 'Bodolko ńeloḱma',
+'anoneditwarning' => "'''Sabdhan:''' amdo begor logkatem bolowakana.
+Amaḱ IP ṭhikana do noa sakam sompadon jạṛre rekorḍoḱa.",
+'anonpreviewwarning' => '"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa."',
+'newarticle' => '(Nãwa)',
+'newarticletext' => 'Am do okaṭaḱ somporko sakamem pańjayetkan ona do nito hạbic banuka.
+Sakam benao lạgitte, noa latar baksore ol ehoṕme
+Am do judim vul lekahan, amaḱ sendray jaygare "ruạṛ" baṭon linme.',
+'noarticletext' => 'Nitoḱ noa sakamre do ol bạnuḱa.
+
+You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
+or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.',
+'noarticletext-nopermission' => 'Noa sakamre do nitoḱ o̠l banuḱa.
+
+You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
+or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.',
+'previewnote' => "'''Disạyme noa do eken ńeln̕am lạgit.'''
+Amaḱ bodolaḱ kodo nit habićte bań ban̕cao akana!",
+'editing' => 'Sampadon; joṛao',
+'creating' => 'Benao',
+'editingsection' => 'Joṛao $1 (hạṭiń)',
+'editingcomment' => 'Joṛao',
+'yourtext' => 'Amaḱ ol',
+'templatesused' => 'Noa sakamre beoharen phormat se phormatko',
+'template-protected' => 'Rukhiạ',
+'template-semiprotected' => '(Kạṭic-rukhiyạ)',
+'hiddencategories' => 'Noa sakam do mitṭen hoṛkanay',
+'permissionserrorstext-withaction' => 'Amaḱ do aydạri bạnuḱtama, Noa karon pan̕jay lạgitte',
+'recreate-moveddeleted-warn' => "'''Sontorokme: am do arhõ doṛhate sakamem teyareda oka do sedayre get giḍiyen.
+Am do gunạnme cet́ noa joṛao kạmi am lạgit́te ganoḱ ase bań.
+Noa get ar tala ocok sakam nonḍe em hoyena dhok lagit́te.",
+'moveddeleted-notice' => 'Noa sakam do get giḍiyakana.
+Get ar ocoḱ giḍi sakam do latarre emakan reference lạgit em hoena.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '"Sontoroḱme" Noa format do lạṭu geya.
+Thoṛa format do noare banuḱana.',
+'post-expand-template-inclusion-category' => 'Sakamko oka borḍre noa tahẽna ona doe paromkeda',
+
+# History pages
+'viewpagelogs' => 'Noa sakam reaḱ cạbi udukme',
+'currentrev-asof' => 'Mucạt nãwã aroy',
+'revisionasof' => 'Nãwã aro sakam 1',
+'revision-info' => 'Ńel/pańja ruạṛ $1 khon $2',
+'previousrevision' => 'Pạhilaḱ paṛhao ruạṛ',
+'nextrevision' => "nãwate n'el ruar",
+'currentrevisionlink' => 'Nitoḱaḱ nãwa aroy',
+'cur' => 'Boge',
+'next' => 'Laha seć',
+'last' => 'Laha renaḱ',
+'page_first' => 'Pahilaḱ',
+'page_last' => 'Mucạt́aḱ',
+'history-fieldset-title' => 'Sendray jaṛ',
+'history-show-deleted' => 'khạli get giḍiyaḱ koge',
+'histfirst' => "adi laha-ak'",
+'histlast' => 'Nahak',
+
+# Revision feed
+'history-feed-title' => 'Jạṛ nãwã aroy',
+'history-feed-item-nocomment' => 're',
+
+# Revision deletion
+'rev-delundel' => 'ńeloḱ/danaṅ',
+'revdel-restore' => 'Judạ lekate ńel',
+'revdel-restore-deleted' => 'giḍikaḱ ńel ruạṛ',
+'revdel-restore-visible' => 'Ńeloḱ leka paṛhao ruạṛ',
+
+# Merge log
+'revertmerge' => 'bań mit́',
+
+# Diffs
+'history-title' => '"$1" noa jạṛ nãwã aroy',
+'lineno' => 'Sạr $1:',
+'compareselectedversions' => 'Noa barea nãwã bachawanaḱ talare tolonayme',
+'editundo' => 'ruạṛ',
+
+# Search results
+'searchresults' => 'Se̠ndra fo̠l',
+'searchresults-title' => '"$1"  renaḱ Sẽndra  phol',
+'prevn' => 'Laha reaḱ {{PLURAL:$1|$1}}',
+'nextn' => 'Táyom teaḱ {{PLURAL:$1|$1}}',
+'prevn-title' => 'Laha renaḱ sakam $1 {{PLURAL:$1|result|results}}',
+'nextn-title' => 'Tayom $1 {{PLURAL:$1|result|results}}',
+'shown-title' => 'Mit́ ṭen kateć sakam $1 {{PLURAL:$1|result|results}} nelmẽ',
+'viewprevnext' => 'Ńelme ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Noa wiki re do \"[[:\$1]] ńutum sakam menaḱa",
+'searchmenu-new' => 'wiki re [[:$1]]nãwã sakam tear',
+'searchprofile-articles' => 'Menaḱaḱ sakamko',
+'searchprofile-project' => 'Go̠ṛo ar Project sakam',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Sanamak koge',
+'searchprofile-advanced' => 'Sompadon',
+'searchprofile-articles-tooltip' => '$1 re ñelme',
+'searchprofile-project-tooltip' => '$1 re sẽndraeme',
+'searchprofile-images-tooltip' => 'File sendra',
+'searchprofile-everything-tooltip' => 'Sanam ko modre sẽndra ( roṛ sakam modre hõ)',
+'searchprofile-advanced-tooltip' => 'Judạ ńutum re sẽndra',
+'search-result-size' => 'bạyiṭ aema bạyiṭ',
+'search-redirect' => '($1 te sujhi doṛha )',
+'search-section' => '(Pahaṭa $1)',
+'search-suggest' => 'Am do cet́ $1 em menocoyet tãhẽkana',
+'searchrelated' => 'songenko',
+'searchall' => 'Sanam',
+'showingresultsheader' => "'''$4'''  lạgit́ {{PLURAL:$5|Pho̠l ńamoḱ́akan - '''$1''' of '''$3'''|Pho̠l ńamoḱ́akan '''$1 - $2''' of '''$3'''}}",
+'search-nonefound' => 'Kupuli leka roṛruạṛ bạnuḱa',
+
+# Preferences page
+'mypreferences' => 'Iñaḱ pạsindko',
+'youremail' => 'E-mail:',
+'yourrealname' => 'Sạ̣ri ńutum',
+'prefs-help-email' => 'E-mail ṭhikana do bạṛtitege, menkhan uku namber nãwãte benao jạruṛa, am do amaḱ uku nomborem hiṛiń keda.',
+'prefs-help-email-others' => 'Am são e-mail hotete jogajog dohoy lạgitte mitṭen joṛao se amaḱ katha roṛaḱ sakam bachao jońme.
+Amaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'noa sakam joṛao',
+
+# Recent changes
+'recentchanges' => 'Nãwã bo̠do̠lko',
+'recentchanges-legend' => 'Nahaḱ bodol teaḱko',
+'recentchanges-label-newpage' => 'Noa sompadon do nãwã mint́ṭen sakame tearkeda',
+'recentchanges-label-minor' => 'Noado hudiń mạchi sompadonkana',
+'recentchanges-label-bot' => 'Noa sompadon do bot darate purauena',
+'recentchanges-label-unpatrolled' => 'Noa sompadon do ńit́ hạbić baṅ ńel ńamakana',
+'rcnotefrom' => '$2 habić bodolak ko do latare ńeloḱkana',
+'rclistfrom' => 'Nãwã  bodolko uduḱme $1 khon ehoṕkate',
+'rcshowhideminor' => '$1 kaṭic culuń tońge',
+'rcshowhidebots' => ' boṭko $1',
+'rcshowhideliu' => 'Beoharićaḱ boloḱ $1',
+'rcshowhideanons' => '$1 Nũtum bańa bebohariḱ',
+'rcshowhidemine' => '$1 ińaḱ tońge',
+'rclinks' => '$2 din lahare $1 bodol unuduḱme <br />$3',
+'diff' => 'Judạ',
+'hist' => 'Jạr',
+'hide' => 'Danaṅ',
+'show' => 'Udugme',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Purạote uduḱ',
+'rc-enhanced-hide' => 'Purạo cuku',
+
+# Recent changes linked
+'recentchangeslinked' => 'Sãotenaḱ bodolko',
+'recentchangeslinked-toolbox' => 'Noṛjoṛ palaṭko',
+'recentchangeslinked-title' => 'Bodolaḱko do "$1" sãote joṛao geya',
+'recentchangeslinked-noresult' => 'Joṛao sakam re emoḱ oktere jahanaḱ bodolko bạnuḱa.',
+'recentchangeslinked-summary' => "Noa do ona tạlika kana oka do nebetarge bodol hoyakan oka do asokayte hatao akan sakam khon.
+
+[[Special:Watchlist|your watchlist]] renaḱ sakamko do '''bold''' .",
+'recentchangeslinked-page' => 'sakạm ńutum',
+'recentchangeslinked-to' => 'Joṛaoaḱ sakamre ńel ocoyme emaḱ sakam bạgi katet',
+
+# Upload
+'upload' => 'Fael aploḍme',
+'uploadlogpage' => 'Chạbi do uthạome',
+'filedesc' => 'Guṭ katha',
+'uploadedimage' => 'Rakaṕ hoyena',
+
+'license' => 'Laisence benao',
+'license-header' => 'Laisense benao',
+
+# File description page
+'file-anchor-link' => 'Re̕t',
+'filehist' => 'Fael renaḱ Jạṛ',
+'filehist-help' => 'date re click me/somóy re click me fail reak obostha nel lagit',
+'filehist-revert' => 'Lahaleka',
+'filehist-current' => 'Nitaḱ',
+'filehist-datetime' => '̣Tạrikh/So̠mo̠y',
+'filehist-thumb' => 'Ṭip',
+'filehist-thumbtext' => '$1 lekan thambnail varson',
+'filehist-user' => 'Laṛcaṛić',
+'filehist-dimensions' => 'Maṕ',
+'filehist-comment' => 'Roṛ',
+'imagelinks' => 'Fael bebohar',
+'linkstoimage' => 'Noa sakam do niạ rẽtre/fayel joṛao menaḱa',
+'nolinkstoimage' => 'Nonḍe do noa são joṛao sakam banuka',
+'sharedupload-desc-here' => 'Noa rẽt do nonḍe khon-  $1 ar paseć eṭaḱaḱ porjekṭko beoharakana.
+Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
+
+# Random page
+'randompage' => 'Joṛao sakam',
+
+# Statistics
+'statistics' => 'Halot',
+
+'disambiguationspage' => 'sujhi',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|baiṭ|baiṭ}}',
+'nmembers' => 'Sãoten/ Sãotenko',
+'prefixindex' => 'Sanam sakam re joṛao menaḱ',
+'usercreated' => 'Ayo baba: tạrikh okte',
+'newpages' => 'Nãwa Patako',
+'move' => 'Ocoḱme, Kulme',
+
+# Book sources
+'booksources' => 'Puthi ńamoḱ ṭhại/jayga',
+'booksources-search-legend' => 'Puthi reak ṭhai sendrayme',
+'booksources-go' => 'Calaḱme',
+
+# Special:Log
+'log' => 'Cạbiko',
+
+# Special:AllPages
+'allpages' => 'joto sakam',
+'alphaindexline' => '$1 hạbić $2',
+'allarticles' => 'Sanam sakam',
+'allpagessubmit' => 'Calaḱme',
+
+# Special:Categories
+'categories' => 'rokom sokom',
+
+# Special:LinkSearch
+'linksearch-line' => '$2 joṛao menaḱa $2re',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Laṛcaṛićaḱ tear cạbi',
+
+# Special:ListGroupRights
+'listgrouprights-members' => 'Saõtenkoaḱ tạlika',
+
+# E-mail user
+'emailuser' => 'Nui beoharić e-mail emayme',
+
+# Watchlist
+'watchlist' => "Inak' n'el ko",
+'mywatchlist' => 'Iñak jagarna tạlikạ',
+'watchlistfor2' => 'Lạgit',
+'watch' => 'Ńelme',
+'unwatch' => "bang nelok' a",
+'wlshowlast' => 'Mucạt 1 ghonta mucạt 2 maha uduḱme',
+'watchlist-options' => 'Ńelok tạlika reak sonketko',
+
+# Delete
+'actioncomplete' => 'kami Chabae-ena',
+'actionfailed' => 'Kami bang hoe-lena',
+'dellogpage' => 'Mãrao log',
+
+# Rollback
+'rollbacklink' => 'Ghurlạo ạcur',
+
+# Protect
+'protectlogpage' => 'Rukhiyạy tala cạbi',
+'protectedarticle' => 'Rukhiyạre menaḱa',
+'protectcomment' => 'karon',
+'protectexpiry' => 'Cabaḱ',
+
+# Undelete
+'undeletelink' => 'Ńel/doho ruạṛ',
+'undeleteviewlink' => 'Ńel',
+
+# Namespace form on various pages
+'namespace' => 'Ńutum reaḱ ṭhai',
+'invert' => 'Seć bachao',
+'blanknamespace' => 'Mukhiạ̣',
+
+# Contributions
+'contributions' => 'Beharićaḱ Kạmiko',
+'contributions-title' => 'Laṛcaṛicaḱ kạmiko lạgit',
+'mycontris' => 'Ińaḱ kạmiko',
+'contribsub2' => '$1 ($2) lạgitte',
+'uctop' => '(coṭ utạr)',
+'month' => 'Cando khon (ar etohopreaḱ)',
+'year' => "Nia serma reak' pahil khoch'",
+
+'sp-contributions-newbies' => 'Nãwã ekaunṭ lạgit kạmiko uduḱme',
+'sp-contributions-blocklog' => 'Tala eset',
+'sp-contributions-uploads' => 'Rakaṕme',
+'sp-contributions-logs' => 'Tala',
+'sp-contributions-talk' => 'Roṛ',
+'sp-contributions-search' => 'Kạmiko emoḱ lạgitte sendrayme',
+'sp-contributions-username' => 'IP ṭhikạna se laṛcaṛićaḱ n̕utum',
+'sp-contributions-toponly' => 'Khạli nahaḱ nãwã aroyen joṛao kamiko udukme',
+'sp-contributions-submit' => 'Sendra',
+
+# What links here
+'whatlinkshere' => 'Cet́ link ko no̠nḍe do',
+'whatlinkshere-title' => 'Noa sakam do 1 sakam tuluc joṛao menaḱa',
+'whatlinkshere-page' => 'Sakam',
+'linkshere' => 'Noa sakam do joṛao menaka:',
+'nolinkshere' => 'Sakamko joṛao bạnuḱa',
+'isredirect' => 'Bań sojhe sakam',
+'istemplate' => 'Ar mit́ teć sãote joṛao',
+'isimage' => 'Ret joṛao',
+'whatlinkshere-prev' => 'Tayom renaḱ Táoy renaḱko',
+'whatlinkshere-next' => 'Laha renaḱ Laha renaḱko',
+'whatlinkshere-links' => 'Joṛaoko',
+'whatlinkshere-hideredirs' => '$1 acurgeya',
+'whatlinkshere-hidetrans' => 'Bodolaḱ danaṅ',
+'whatlinkshere-hidelinks' => 'Joṛao danaṅ se uduḱme',
+'whatlinkshere-hideimages' => 'phoṭo em',
+'whatlinkshere-filters' => 'Sapha',
+
+# Block/unblock
+'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',
+'ipblocklist' => 'Beoharic esetgeyay',
+'blocklink' => 'Eset',
+'unblocklink' => 'bań block',
+'change-blocklink' => 'block judạ',
+'contribslink' => 'em daṛeaḱ',
+'blocklogpage' => 'Tala eset',
+'blocklogentry' => 'Eset [[$1]] sãote cabaḱ okte oka do $2 $3',
+'block-log-flags-nocreate' => 'Ekaunṭ benao do bondogeya',
+
+# Move page
+'movelogpage' => 'Tala cạbi ocoḱme',
+'revertmove' => 'ruạr agu',
+
+# Export
+'export' => 'Aguyen sakamko',
+
+# Namespace 8 related
+'allmessagesname' => 'Ńutum',
+'allmessagesdefault' => 'Bań bhul mesag ol',
+
+# Thumbnails
+'thumbnail-more' => 'Lạṭui mẽ',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Amak bebohar sakam',
+'tooltip-pt-mytalk' => 'Amaḱ katha ro̠ṛrenaḱ́ pata',
+'tooltip-pt-preferences' => 'Amaḱ Kusíyaḱ',
+'tooltip-pt-watchlist' => 'Mit́ṭen tạlika okaṭak am do nãwã aroy lạgitem ńeleḱkan',
+'tooltip-pt-mycontris' => 'Amaḱ kạmi reaḱ tạlika',
+'tooltip-pt-login' => 'Am do log in lagit́ metao am kana; menkhan noa do jarur bań kana',
+'tooltip-pt-logout' => 'Onḍńme',
+'tooltip-ca-talk' => 'Galmãrao bhitri renaḱ sakam lạgit́',
+'tooltip-ca-edit' => 'Noa sakam em edit daṛeaḱ. Daya kateć save laha re preview batton bebohar me.',
+'tooltip-ca-addsection' => 'Nãwã sekson sạrdi',
+'tooltip-ca-viewsource' => 'Noa sakam do poṭom gea
+Ona te source em ńel daṛeaḱ',
+'tooltip-ca-history' => 'Noa sakam renaḱ calao parom ńel ruạṛ',
+'tooltip-ca-protect' => 'ñia sakam bachaome',
+'tooltip-ca-delete' => 'nia sakam muchau me',
+'tooltip-ca-move' => 'Noa sakam kulme',
+'tooltip-ca-watch' => 'Noa sakam do amaḱ ńelok tạlikare joṛaome',
+'tooltip-ca-unwatch' => 'Amaḱ ńeloḱ tạlika khon noa sakam bagiyam',
+'tooltip-search' => 'Sendra {{Saiṭñitum}}',
+'tooltip-search-go' => 'Mitṭen sakamre calaḱme one okare noa ńutum menaḱa',
+'tooltip-search-fulltext' => 'Noa ol ńam lạgit sakamko ńelme',
+'tooltip-p-logo' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-mainpage' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-mainpage-description' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-portal' => 'Niạ pro̠je̠ḱ́ṭreaḱ Biso̠yko, Cet́́em ceka daṛia,Okare̠ sendra ñamoḱ́a',
+'tooltip-n-currentevents' => 'Nitaḱ events re jos hudis ńãm me',
+'tooltip-n-recentchanges' => 'Uiki nãhaḱ palaṭrenaḱ́ tạlikạ',
+'tooltip-n-randompage' => 'Ãr hõ sakam ko agui mẽ',
+'tooltip-n-help' => 'Sendra ñamreaḱ jayga',
+'tooltip-t-whatlinkshere' => 'Sanam wiki sakam renaḱ list ar link do nonde',
+'tooltip-t-recentchangeslinked' => 'Noa sakam re nitaḱ bodol akan sakam renaḱ linked',
+'tooltip-feed-atom' => 'Noa sakam lạgit́ atom jomaḱ',
+'tooltip-t-contributions' => 'Beoharićak kami reaḱ tạ̣lika',
+'tooltip-t-emailuser' => 'Nui beoharić mitṭen e-mail kulayme',
+'tooltip-t-upload' => 'Failko aploḍ̣me',
+'tooltip-t-specialpages' => 'Jạruṛ patakureaḱ tạlikạ',
+'tooltip-t-print' => 'Printoḱ lekan sakam',
+'tooltip-t-permalink' => 'Terejuge joṛaokam ñel sakam',
+'tooltip-ca-nstab-main' => 'Bahal sakam ńel me',
+'tooltip-ca-nstab-user' => 'Beoharićaḱ sakam uduḱme',
+'tooltip-ca-nstab-special' => 'Noa do nij/bises sakam kana, amem menle rehõ bam joṛao dareaḱa',
+'tooltip-ca-nstab-project' => "project page nel' me",
+'tooltip-ca-nstab-image' => 'Fael sakam ńel',
+'tooltip-ca-nstab-template' => 'Forom uduḱme',
+'tooltip-ca-nstab-category' => 'Rokom sokom sakamko udukme',
+'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-compareselectedversions' => 'Noa barea sakam talareaḱ bepaneyaḱ nãwã aróme',
+'tooltip-watch' => 'Amaḱ ńeloḱ sakamre noa do dohoyme',
+'tooltip-rollback' => '"Ghurlạ ạcur" noa sakam taṛam ruạṛ ńel sapha ona do amaḱ mũcạt́ mit́ dhom click re',
+'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-summary' => 'Khaṭote guṭ katha bhoraome',
+
+# Info page
+'pageinfo-header-watchlist' => 'Ńeloḱ tạlika',
+'pageinfo-header-views' => 'Ńelme',
+'pageinfo-subjectpage' => 'Sakam',
+'pageinfo-talkpage' => 'Galmarao sakam',
+'pageinfo-watchers' => 'Ńeńelkoaḱ nombor',
+
+# Browsing diffs
+'previousdiff' => "mareak' kamiko",
+'nextdiff' => 'Nãwã joṛao',
+
+# Media information
+'file-info-size' => '$1 x $2 pixels, file size: $3, MIME type: $4',
+'file-nohires' => 'Aema resulation nondḍe banuḱa',
+'show-big-image' => 'Purạo resulation',
+
+# Bad image list
+'bad_image_list' => 'Format do latar re leka',
+
+# Metadata
+'metadata' => 'Meṭa khobor',
+'metadata-help' => 'Noa rẹt redo bạṛti kathako menaḱa, paseć noa do ḍejiṭal kemera se skenar bebohar hoy kate ḍijiṭal benao. Judi noa ret noa reaḱ asolak khon nãwã aro lenkhan, paseć sanamaḱko thoṛa bań sodoroḱa noa retredo.',
+'metadata-fields' => 'Noa ciṭhire menaḱ photo reaḱ metadata jayga ṭalika do photo reaḱ sakamreye uduga, tinre ona metadata tibil do cabaḱa.
+Eṭagaḱ sanamko do ońkage eset tahẽna.
+Benao, Teyar
+Moḍel
+tạrik okte asolak
+hire okte
+f nombor
+isospeeddratings
+jeleń',
+
+# External editor support
+'edit-externally' => 'Noa rẽt tońge joṛao lạ̣gitte bahre reaḱ koejoń  beoharme',
+'edit-externally-help' => '(Nonḍe ńelme [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] bạṛtite baḍay lạgit)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'Sanam, sanamak, sanamko',
+'namespacesall' => 'sanam',
+'monthsall' => 'Sanamak',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Jońgṛao bodolaḱko ńel',
+'watchlisttools-edit' => 'Ńelok tạlika ńel ar joṛao',
+
+# Special:SpecialPages
+'specialpages' => 'Jạruṛ patako',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Tag]] saphay:',
+
+);
index f84871a..8800a38 100644 (file)
@@ -731,6 +731,7 @@ Siddu sî n’utenti anònimu e riteni ca li cummenti prisenti nta sta pàggina
 '''Siddu chistu è nu tintativu liggìttimu di canciamentu, arriprova. Siddu lu prubbrema pirsisti, si pò pruvari a [[Special:UserLogout|sculligàrisi]] e effittuari n'accessu novu.'''",
 'token_suffix_mismatch' => "'''Lu canciamentu nun fu sarvatu pirchì lu client ammustrau di gèstiri 'n modu sbagghiatu li caràttiri di puntiggiatura nta lu token assuciatu a iddu. P'evitari na curruzzioni pussìbbili dô testu dâ pàggina, fu rifiutatu tuttu lu canciamentu. Sta situazzioni pò virificàrisi, certi voti, quannu s'adòpiranu arcuni sirvizza di proxy anònimi via web chi prisèntanu bug.'''",
 'editing' => 'Canciu di la vuci "$1"',
+'creating' => 'Stai criannu $1',
 'editingsection' => 'Canciamentu di $1 (sezzioni)',
 'editingcomment' => 'Canciu di $1 (nova sizzioni)',
 'editconflict' => "Cunflittu d'edizzioni supra $1",
index 0cf1cb8..6399b56 100644 (file)
@@ -583,6 +583,7 @@ Prašuom pamiegintė vielēk. Jei šėtā napaded, pamieginkėt atsėjongtė ėr
 ''Kadaogi šėtom pruojekte grīnasės HTML īr ijongts, parveiza īr pasliepta kāp atsargoma prėimonė priš JavaScript atakas.''
 '''Jei tā teisiets keitėma bandīms, prašuom pamiegint viel. Jei šėtā napaded, pamieginkėt atsėjongtė ėr prėsėjongtė atgal.'''",
 'editing' => 'Taisuoms straipsnis - $1',
+'creating' => 'Dėrbama $1',
 'editingsection' => 'Taisuoms $1 (skėrsnelis)',
 'editingcomment' => 'Taisuoms $1 (naus skīrius)',
 'editconflict' => 'Ėšpreskėt kuonflėkta: $1',
index 359b1c8..cfca905 100644 (file)
@@ -594,6 +594,9 @@ $2',
 'ns-specialprotected' => 'Posebne stranice se ne mogu uređivati.',
 'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
 Kao razlog je naveden "\'\'$2\'\'".',
+'filereadonlyerror' => 'Ne mogu da izmenim datoteku „$1“ jer je riznica „$2“ u režimu za čitanje.
+
+Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.',
 
 # Virus scanner
 'virus-badscanner' => "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
@@ -688,6 +691,7 @@ Nijedan e-mail neće biti poslan za bilo koju uslugu od slijedećih.',
 'invalidemailaddress' => 'Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.
 Molimo vas da unesete ispravnu adresu ili ostavite prazno polje.',
 'cannotchangeemail' => 'Na ovom wikiju ne možete promeniti e-mail adresu računa.',
+'emaildisabled' => 'Ova web-stranica ne može da šalje e-poruke.',
 'accountcreated' => 'Korisnički račun je napravljen',
 'accountcreatedtext' => 'Korisnički račun za $1 je napravljen.',
 'createaccount-title' => 'Pravljenje korisničkog računa za {{SITENAME}}',
@@ -893,8 +897,9 @@ Posljednje stavke evidencije blokiranja možete pogledati ispod:',
 Ne zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Osvježeno)',
 'note' => "'''Napomena:'''",
-'previewnote' => "'''Upamtite da je ovo samo pretpregled.'''
-Vaše izmjene još uvijek nisu snimljene!",
+'previewnote' => "'''Ne zaboravite da je ovo samo pregled'''
+Izmjene stranice nisu još sačuvane!",
+'continue-editing' => 'Nastavak uređivanja',
 'previewconflict' => 'Ovaj pretpregled reflektuje tekst u gornjem polju
 kako će izgledati ako pritisnete "Snimi stranicu".',
 'session_fail_preview' => "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
@@ -908,6 +913,7 @@ Izmjena je odbačena da bi se spriječilo uništavanje teksta stranice.
 To se događa ponekad kad korisite problematični anonimni proxy koji je baziran na web-u.",
 'edit_form_incomplete' => "'''Neki dijelovi uređivačkog obrasca nisu došli do servera; dvaput provjerite da su vaše izmjene nepromjenjene i pokušajte ponovno.'''",
 'editing' => 'Uređujete $1',
+'creating' => 'Stvaranje $1',
 'editingsection' => 'Uređujete $1 (sekciju)',
 'editingcomment' => 'Uređujete $1 (nova sekcija)',
 'editconflict' => 'Sukobljenje izmjene: $1',
@@ -973,6 +979,7 @@ Izgleda da je obrisana.',
 'edit-no-change' => 'Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.',
 'edit-already-exists' => 'Stranica nije mogla biti kreirana.
 Izgleda da već postoji.',
+'defaultmessagetext' => 'Uobičajeni tekst poruke',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.
@@ -1133,7 +1140,8 @@ Molimo provjerite zapise.',
 
 # Suppression log
 'suppressionlog' => 'Registri sakrivanja',
-'suppressionlogtext' => 'Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. Vidi [[Special:IPBlockList|spisak IP blokiranja]] za pregled trenutno važećih blokada.',
+'suppressionlogtext' => 'Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. 
+Vidi [[Special:BlockList|spisak blokiranja]] za pregled trenutno važećih blokada.',
 
 # History merging
 'mergehistory' => 'Spoji historije stranice',
@@ -1559,6 +1567,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'newsectionsummary' => '/* $1 */ nova sekcija',
 'rc-enhanced-expand' => 'Pokaži detalje (neophodan JavaScript)',
 'rc-enhanced-hide' => 'Sakrij detalje',
+'rc-old-title' => 'prvobitno kreirano kao "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Srodne izmjene',
@@ -1727,6 +1736,7 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'backend-fail-closetemp' => 'Ne mogu da zatvorim privremenu datoteku.',
 'backend-fail-read' => 'Ne mogu da pročitam datoteku $1.',
 'backend-fail-create' => 'Ne mogu da napravim datoteku $1.',
+'backend-fail-maxsize' => 'Ne mogu da napravim datoteku $1 jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.',
 'backend-fail-readonly' => 'Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: „$2“',
 'backend-fail-synced' => 'Datoteka „$1“ je nedosledna između unutrašnjih skladišnih osnova',
 'backend-fail-connect' => 'Ne mogu da se povežem sa skladišnom osnovom „$1“.',
@@ -1853,6 +1863,10 @@ Slijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vo
 Molimo pogledajte [$2 stranicu opisa datoteke] za ostale informacije.',
 'sharedupload-desc-here' => 'Ova datoteka je sa $1 i može se koristiti i na drugim projektima.
 Opis sa njene [$2 stranice opisa datoteke] je prikazan ispod.',
+'sharedupload-desc-edit' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
+'sharedupload-desc-create' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'filepage-nofile' => 'Ne postoji datoteka s ovim nazivom.',
 'filepage-nofile-link' => 'Ne postoji datoteka s ovim imenom, ali je možete [$1 postaviti].',
 'uploadnewversion-linktext' => 'Postavite novu verziju ove datoteke/fajla',
@@ -2066,6 +2080,7 @@ Možete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena
 'allpagesbadtitle' => 'Dati naziv stranice je nepravilan ili ima međujezički ili interwiki prefiks.
 Možda sadrži jedan ili više znakova koji se ne mogu koristiti u naslovima.',
 'allpages-bad-ns' => '{{SITENAME}} nema imenski prostor "$1".',
+'allpages-hide-redirects' => 'Sakrij preusmerenja',
 
 # Special:Categories
 'categories' => 'Kategorije',
@@ -2566,8 +2581,8 @@ Evidencija sakrivanja je prikazana ispod kao referenca:',
 'blocklogentry' => 'blokiran [[$1]] s rokom: $2 $3',
 'reblock-logentry' => 'promjena postavki blokiranja za [[$1]] sa vremenom isteka u $2 $3',
 'blocklogtext' => 'Ovo je historija akcija blokiranja i deblokiranja korisnika.
-Automatsko blokirane IP adrese nisu uspisane ovde.
-Pogledajte [[Special:BlockList|blokirane IP adrese]] za spisak trenutnih zabrana i blokiranja.',
+Automatski blokirane IP adrese nisu navedene ovdje.
+Pogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.',
 'unblocklogentry' => 'deblokiran $1',
 'block-log-flags-anononly' => 'samo anonimni korisnici',
 'block-log-flags-nocreate' => 'pravljenje računa onemogućeno',
@@ -2831,7 +2846,7 @@ Molimo pokušajte ponovno.',
 
 # JavaScriptTest
 'javascripttest' => 'Javaskript test',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena.',
+'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
 'javascripttest-title' => 'Izvršavanje testova za $1',
 'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
 'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
@@ -3638,6 +3653,7 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-software' => 'Instalirani softver',
 'version-software-product' => 'Proizvod',
 'version-software-version' => 'Verzija',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Putanja datoteke',
@@ -3826,4 +3842,15 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-uploaddisabled' => 'Postavljanje je onemogućeno na ovoj wiki.',
 'api-error-verification-error' => 'Ova datoteka je možda oštećenja ili ima pogrešan nastavak.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuta}}',
+'duration-hours' => '$1 {{PLURAL:$1|sat|sati}}',
+'duration-days' => '$1 {{PLURAL:$1|dan|dana}}',
+'duration-weeks' => '$1 {{PLURAL:$1|sedmica|sedmica}}',
+'duration-years' => '$1 {{PLURAL:$1|godina|godina}}',
+'duration-decades' => '$1 {{PLURAL:$1|decenija|decenija}}',
+'duration-centuries' => '$1 {{PLURAL:$1|vijek|vijekova}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenijum|milenijuma}}',
+
 );
index 068065f..87a157c 100644 (file)
@@ -442,8 +442,8 @@ $1",
 'mainpage' => 'මුල් පිටුව',
 'mainpage-description' => 'මුල් පිටුව',
 'policy-url' => 'Project:ප්‍රතිපත්තිය',
-'portal' => 'පà·\8aâ\80\8dරජà·\8f à¶¯à·\8aà·\80à·\8fරය',
-'portal-url' => 'Project:පà·\8aâ\80\8dරජà·\8f à¶¯à·\8aà·\80à·\8fරය',
+'portal' => 'පà·\8aâ\80\8dරජà·\8f à¶´à·\92à·\80à·\92à·\83à·\94ම',
+'portal-url' => 'Project:පà·\8aâ\80\8dරජà·\8f à¶´à·\92à·\80à·\92à·\83à·\94ම',
 'privacy' => 'පුද්ගලිකත්ව ප්‍රතිපත්තිය',
 'privacypage' => 'Project:පුද්ගලිකත්ව ප්‍රතිපත්තිය',
 
@@ -578,7 +578,7 @@ URL  සඳහන් කරමින්, මෙම කරුණ [[Special:ListUs
 'editinginterface' => "'''අවවාදයයි:''' මෘදුකාංගයට අතුරුමුව පෙළ සැපයීමට භාවිතා වන පිටුවක් ඔබ විසින් සංස්කරණය කරනු ලබයි.
 මෙම පිටුවට සිදු කරන වෙනස්වීම් විසින් අනෙකුත් පරිශීලකයන්ගේ පරිශීලක අතුරුමුවෙහි පෙනුමට බලපෑම් එල්ල කෙරෙනු ඇත.
 පරිවර්තන සඳහා, මීඩියාවිකි ප්‍රාදේශීයකරන ව්‍යාපෘතිය, [//translatewiki.net/wiki/Main_Page?setlang=si translatewiki.net], භාවිතා කිරීම සලකා බැලීමට කාරුණික වන්න.",
-'sqlhidden' => '(එස්කිවුඑල් විපරම සඟවා ඇත)',
+'sqlhidden' => '(SQL query සඟවා ඇත)',
 'cascadeprotected' => '"තීරු දර්ශන" විකල්පය සක්‍රීයනය කොට එමගින් ආරක්‍ෂණය කල පහත දැක්වෙන {{PLURAL:$1|පිටුව|පිටු}} අඩංගු කර ඇති බැවින්, මෙම පිටුව සංස්කරණය කිරීමෙන් වලකා ඇත:
 $2',
 'namespaceprotected' => "'''$1''' නාමඅවකාශයෙහි පිටු සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
@@ -600,7 +600,7 @@ $2',
 ඔබගේ බ්‍රවුසරයෙහි පූර්වාපේක්‍ෂී සංචිතය (කෑෂය) පිරිසිදුකරන තෙක්, සමහරක් පිටු විසින් ඔබ තවදුරටත් පිවිසී ඇති බවක් දිගටම පෙන්නුම් කිරීමට ඉඩ ඇත.",
 'welcomecreation' => '== ආයුබෝවන්, $1! ==
 
-à¶\94බâ\80\8dà¶\9cà·\9a à¶\9cà·\92ණà·\94ම à¶­à·\90නà·\93 à¶\87ත.
+à¶\94බâ\80\8dà¶\9cà·\9a à¶\9cà·\92ණà·\94ම à¶­à¶±à¶± à¶½à¶¯à·\93.
 ඔබ‍ගේ [[Special:Preferences|{{SITENAME}} අභිරුචි ]] වෙනස් කිරීම අමතක නොකරන්න.',
 'yourname' => 'පරිශීලක නාමය:',
 'yourpassword' => 'මුරපදය:',
@@ -876,8 +876,8 @@ $2
 රීති ප්‍රකාරව .css හා .js පිටු විසින් ඉංග්‍රීසි කුඩා-අකුරු ශීර්ෂ භාවිතා කෙරෙන බව සිහි තබා ගන්න, නිදසුන. {{ns:user}}:Foo/vector.css මිස {{ns:user}}:Foo/Vector.css නොවන බව.",
 'updated' => '(යාවත්කාලීන)',
 'note' => "'''සටහන:'''",
-'previewnote' => "'''මà·\99ය පà·\99රදà·\83à·\94නà¶\9aà·\8a à¶´à¶¸à¶«à·\92.'''
-à¶\94බà¶\9cà·\9a à·\80à·\99නà·\83à·\8aà¶\9aà·\92රà·\93මà·\8a තà·\80මතà·\8a à·\83à·\94රà\9aà·\8aà·\82à·\92ත කොට නොමැත!",
+'previewnote' => "'''මà·\99ය පà·\99රදà·\83à·\94නà¶\9aà·\8a à¶´à¶¸à¶«à\9aà·\8a à¶¶à·\80 à·\83à·\92à·\84à·\92තබà·\8fà¶\9cනà·\8aන.'''
+à¶\94බà¶\9cà·\9a à·\80à·\99නà·\83à·\8aà¶\9aà·\92රà·\93මà·\8a තà·\80මතà·\8a à·\83à·\94රà·\90à¶\9aà·\93මට à¶½à¶\9aà·\8a කොට නොමැත!",
 'previewconflict' => 'ඔබ විසින් සුරැකීම තෝරාගත්තොත්,  ඉහළ පෙළ සංස්කරණ සරියෙහි,  පෙළ දර්ශනය විය හැකි අයුර මෙම පෙර-දසුනෙන් ආවර්ජනය වේ.',
 'session_fail_preview' => "'''කණගාටුයි! සැසි දත්ත හානියක් හේතුවෙන් අප විසින් ඔබගේ  සංස්කරණය ක්‍රියායයනය කිරීමට නොහැකි වී ඇත.
 කරුණාකර නැවත උත්සාහ කරන්න.
@@ -892,6 +892,7 @@ $2
 සංස්කරණය නිෂ්ප්‍රභා කරන ලද්දේ පිටු පෙළ දූෂණය වීම වැලැක්වීමටය.
 දෝෂ-සපිරි වෙබ්-පාදක නිර්නාමික නියුතු සේවාවක් ඔබ විසින් භාවිත කිරීම නිසා මෙය සමහරවිට සිදුවිය හැක.'''",
 'editing' => '$1 සංස්කරණය කරමින් පවතියි',
+'creating' => '$1 තනමින්',
 'editingsection' => '$1 (ඡේදය) සංස්කරණය කරමින් පවතියි',
 'editingcomment' => '$1 සංස්කරණය කරමින් පවතියි (නව ඡේදයක්)',
 'editconflict' => 'සංස්කරණ ගැටුම: $1',
@@ -959,7 +960,7 @@ $2
 එය දැනටමත් පවතියි.',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'අවවාදයයි: මෙම පිටුවෙහි අධිවැය ව්‍යාකරණ විග්‍රහ ශ්‍රිත කැඳවුම් පමණට වඩා ඇත.
+'expensive-parserfunction-warning' => 'අවවාදයයි: මෙම පිටුවෙහි අධිවැය ව්‍යාකරණ විග්‍රහ ශ්‍රිත කැඳවුම් (expensive parser function calls) පමණට වඩා ඇත.
 
 එහි තිබිය යුතු වූයේ  {{PLURAL:$2|එක් කැඳවුමකට |කැඳවුම් $2 ට }} අඩුවෙන් වුවද, මෙහි දැනට  {{PLURAL:$1|එක් කැඳවුමක්|කැඳවුම්  $1 ක්}} අඩංගුව ඇත.',
 'expensive-parserfunction-category' => 'අධිවැය ව්‍යාකරණ විග්‍රහ ශ්‍රිත කැඳවුම් පමණට වඩා ඇති පිටු',
@@ -1101,7 +1102,7 @@ $1",
 'revdelete-modify-no-access' => '$1 දින, $2 වේලාවෙහි, අයිතමය වෙනස්කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: මෙම අයිතමය "පරිසීමිත" ලෙසින් සලකුණු කර ඇත.
 ඔබට ඒ සඳහා ප්‍රවේශයන් නොමැත.',
 'revdelete-modify-missing' => 'අනන්‍යාංක $1 දරණ අයිතමය වෙනස් කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: එය දත්ත ගබඩාවෙන් අස්ථානගතවී ඇත!',
-'revdelete-no-change' => "'''à¶\85à·\80à·\80à·\8fදයයà·\92:''' $1 à¶¯à·\92න, $2 à·\80à·\9aලà·\8fà·\80à·\99à·\84à·\92, à¶\85යà·\92තමය à¶¯à·\90නටමතà·\8a à¶¯à·\98à·\81à·\8aâ\80\8dයතà·\8f à¶´à¶»à·\92à·\83à·\8aථà·\92තà·\93නà·\8a à¶\89ලà·\8aලà·\8f à·\83à·\92ට ඇත.",
+'revdelete-no-change' => "'''à¶\85à·\80à·\80à·\8fදයයà·\92:''' $1 à¶¯à·\92න, $2 à·\80à·\9aලà·\8fà·\80à·\99à·\84à·\92, à¶\85යà·\92තමය à¶¯à·\90නටමතà·\8a à¶¯à·\98à·\81à·\8aâ\80\8dයතà·\8f à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶\89ලà·\8aලà·\8f ඇත.",
 'revdelete-concurrent-change' => '$1 දින, $2 වේලාවෙහි, අයිතමය වෙනස් කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: එය වෙනස්කිරීමට ඔබ උත්සාහ ගන්නා අතරතුරදී තවත් අයෙකු විසින් එහි ස්තිතිය වෙනස් කර ඇති බවක් පෙනෙන්නට ඇත.
 කරුණාකර ලඝු-සටහන් පරික්ෂාකර බලන්න.',
 'revdelete-only-restricted' => '$2 දිනැති අයිතමය සැඟවීමේ දෝෂය , $1:අනෙකුත් සැඟවීම් විකල්පයන් අතුරින් එකක් තෝරාගන්නේ නැතිව, පරිපාලකයන්ගේ දර්ශනයෙන් අයිතමයන් සැඟවීම  ඔබහට සිදුකල නොහැක.',
@@ -1135,7 +1136,7 @@ $1",
 'mergehistory-empty' => 'සංශෝධනයන් කිසිවක් ඒකාබද්ධ කල නොහැක.',
 'mergehistory-success' => ' [[:$1]] හි  {{PLURAL:$3|සංශෝධනයක්|සංශෝධන  $3 ක්}}සාර්ථක ලෙස   [[:$2]] හා සමග ඒකාබද්ධ කරන ලදි.',
 'mergehistory-fail' => 'ඉතිහාස ඒකාබද්ධය සිදු කල නොහැක, පිටු හා වේලා පරාමිතීන් නැවත පිරික්සා බලන්න.',
-'mergehistory-no-source' => 'මූල පිටුව $1 කොපවතී.',
+'mergehistory-no-source' => 'මූලාශ පිටුව $1 නොපවතී.',
 'mergehistory-no-destination' => 'අන්ත පිටුව $1 නොපවතී.',
 'mergehistory-invalid-source' => 'මූල පිටුව නීතික ශීර්ෂයක් සහිත විය යුතුය.',
 'mergehistory-invalid-destination' => 'අන්ත  පිටුව නීතික ශීර්ෂයක් සහිත විය යුතුය.',
@@ -1287,10 +1288,10 @@ $1",
 'timezoneuseserverdefault' => 'විකියෙහි සාමාන්‍ය විදිහ භාවිත කරන්න ($1)',
 'timezoneuseoffset' => 'වෙනත් (හිලව්ව නියමාකාරයෙන් දක්වන්න)',
 'timezoneoffset' => 'Offset¹:',
-'servertime' => 'සර්වරයේ වේලාව:',
+'servertime' => "ස'වරයේ වේලාව:",
 'guesstimezone' => 'බ්‍රවුසරයෙන් පුරවන්න',
 'timezoneregion-africa' => 'අප්‍රිකාව',
-'timezoneregion-america' => 'à¶\87මරිකාව',
+'timezoneregion-america' => 'à¶\85මà·\99රිකාව',
 'timezoneregion-antarctica' => 'ඇන්ටාටිකාව',
 'timezoneregion-arctic' => 'අත්ලාන්තික්',
 'timezoneregion-asia' => 'ආසියාව',
@@ -1345,18 +1346,18 @@ HTML ටැගයන් පිරික්සන්න.',
 'prefs-dateformat' => 'දින ආකෘතිය',
 'prefs-timeoffset' => 'වේලා හිලව්ව',
 'prefs-advancedediting' => 'වැඩිදුර තෝරාගැනීම් සැකසුම්',
-'prefs-advancedrc' => 'පà·\8aâ\80\8dරà¶\9cත à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
-'prefs-advancedrendering' => 'පà·\8aâ\80\8dරà¶\9cත à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
+'prefs-advancedrc' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶­à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
+'prefs-advancedrendering' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶­à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
 'prefs-advancedsearchoptions' => 'ප්‍රගත විකල්පයන්',
-'prefs-advancedwatchlist' => 'පà·\8aâ\80\8dරà¶\9cත à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
-'prefs-displayrc' => 'දරà·\8aà·\81න à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
+'prefs-advancedwatchlist' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶­à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
+'prefs-displayrc' => 'දරà·\8aà·\81න à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶­à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
 'prefs-displaysearchoptions' => 'විකල්ප පෙන්වන්න',
 'prefs-displaywatchlist' => 'විකල්ප පෙන්වන්න',
 'prefs-diffs' => 'වෙනස',
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => 'විද්‍යුත්-තැපැල් ලිපිනය අනීතික බවක් පෙනෙයි.',
-'email-address-validity-invalid' => 'නà·\93තà·\92à¶\9a à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a-තà·\90පà·\90ල් ලිපිනයක් ඇතුලත් කරන්න',
+'email-address-validity-invalid' => 'à·\80ලà¶\82à¶\9cà·\94 à·\80à·\92දà·\8aâ\80\8dයà·\94ත් ලිපිනයක් ඇතුලත් කරන්න',
 
 # User rights
 'userrights' => 'පරිශීලක හිමිකම් කළමනාකරණය',
@@ -1700,7 +1701,7 @@ $1',
 'upload-file-error' => 'අභ්‍යන්තර දෝෂය',
 'upload-file-error-text' => 'සේවාදායකයෙහි තාවකාලික ගොනුවක් තැනීමට උත්සාහ දැරීමෙහිදී අභ්‍යන්තර දෝෂයක් හට ගැනිණි.
 කරුණාකර [[Special:ListUsers/sysop|පරිපාලකවරයෙක්]] වෙත යොමුවන්න.',
-'upload-misc-error' => 'à\85ඥà·\8fත උඩුගත කිරීම් දෝෂය',
+'upload-misc-error' => 'à·\84ඳà·\94නà·\8f à¶±à·\9cà¶\9cතà·\8a උඩුගත කිරීම් දෝෂය',
 'upload-misc-error-text' => 'උඩුගත කිරීමේදී හඳුනාගත නොහැකි දෝෂයක් සිදුවිය.
 URLහි නීතික බව හා ප්‍රවේශ්‍ය බව තහවුරුකරගෙන නැවත උත්සාහ කරන්න.
 ගැටළුව තවදුරටත් පවතී නම්, [[Special:ListUsers/sysop|පරිපාලකවරයෙකු]] අමතන්න.',
@@ -2004,7 +2005,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 'usercreated' => '$1 දින $2 වේලාවේදී {{GENDER:$3|තනන ලදි}}',
 'newpages' => 'අළුත් පිටු',
 'newpages-username' => 'පරිශීලක-නාමය:',
-'ancientpages' => 'පà·\94රà·\8fණතම පිටු',
+'ancientpages' => 'පà·\90රණà·\92ම පිටු',
 'move' => 'ගෙනයන්න',
 'movethispage' => 'මෙම පිටුව ගෙන යන්න',
 'unusedimagestext' => 'පහත ගොනු පවතින නමුත් ඒවා කිසිදු පිටුවකට කාවද්දා නොමැත.
@@ -2565,7 +2566,7 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 'block-log-flags-angry-autoblock' => 'ආවර්ධිත ස්වයංක්‍රීය වාරණය සක්‍රීය කරන ලදි',
 'block-log-flags-hiddenname' => 'පරිශීලක-නාමය  සඟවා ඇත',
 'range_block_disabled' => 'පරාස වාරණයන් සිදුකිරීමට පරිපාලක වරුන්ට ඇති හැකියාව අක්‍රීය කරන ලදි.',
-'ipb_expiry_invalid' => 'à¶\89à¶\9aà·\94තà·\8aà·\80à·\93මà·\9a à¶\9aà·\8fලය à¶\85නà·\93තà·\92à¶\9aය.',
+'ipb_expiry_invalid' => 'à¶\9aලà·\8aà¶\89à¶\9aà·\94තà·\8aà·\80à·\93මà·\9a à·\80à·\9aලà·\8fà·\80 à·\80ලà¶\82à¶\9cà·\94 à¶±à·\90ත.',
 'ipb_expiry_temp' => 'සැඟවුනු පරිශීලක-නාම වාරණයන් ස්ථීර ඒවා විය යුතුය.',
 'ipb_hide_invalid' => 'මෙම ගිණුම යටපත්කිරීම කල නොහැකියි; පමණට වඩා සංස්කරණ සිදු කර ඇතිවා විය හැක.',
 'ipb_already_blocked' => '"$1" දැනටමත් වාරණයට ලක් කර ඇත',
@@ -2688,20 +2689,20 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 අන්ත පිටුව "[[:$1]]" දැනටමත් පවතියි.
 එය මකාදමා ගෙනයාම සඳහා පෙත එළි කිරීමට ඔබ හට ඇවැසිද?',
 'delete_and_move_confirm' => 'ඔව්, පිටුව මකා දමන්න',
-'delete_and_move_reason' => '"[[$1]]" ගෙනයෑම සඳහා ඉඩ ලබාගැනීම සඳහා මකාදමන ලදී',
+'delete_and_move_reason' => '"[[$1]]" ගෙනයෑම ඉඩ ලබාගැනීම සඳහා මකාදමන ලදී',
 'selfmove' => 'මූල හා අන්ත ශීර්ෂ දෙකම එකමය;
 පිටුවක් එය වෙතම ගෙන යා නොහැක.',
 'immobile-source-namespace' => '"$1" නාමඅවකාශයෙහි පිටු ගෙනයාම සිදුකල නොහැක',
 'immobile-target-namespace' => '"$1" නාමඅවකාශය වෙත පිටු ගෙනයාම සිදුකල නොහැක',
-'immobile-target-namespace-iw' => 'à¶\85නà·\8aතරà·\8aà·\80à·\92à¶\9aà·\93 à·\83බà·\90ඳà·\92ය, à¶´à·\92ටà·\94 à¶\9cà·\99නයà·\91ම à·\83ඳà·\84à·\8f à¶±à·\93තà·\92à¶\9a à¶\91ලà·\8aලයක් නොවේ.',
+'immobile-target-namespace-iw' => 'à¶\85නà·\8aතරà·\8aà·\80à·\92à¶\9aà·\93 à·\83බà·\90ඳà·\92ය, à¶´à·\92ටà·\94 à¶\9cà·\99නයà·\91ම à·\83ඳà·\84à·\8f à·\80ලà¶\82à¶\9cà·\94 à¶\89ලà¶\9aà·\8aà¶\9aයක් නොවේ.',
 'immobile-source-page' => 'මෙම පිටුව ගෙනයාහැක්කක් නොවේ.',
 'immobile-target-page' => 'එම අන්ත ශීර්ෂයට ගෙන යෑම කල නොහැක.',
 'imagenocrossnamespace' => 'ගොනුවක්, ගොනුවක්-නොවන නාමඅවකාශයකට ගෙනයෑම කල නොහැක',
 'nonfile-cannot-move-to-file' => 'ගොනුවක්-නොවන්න ගොනු නාමඅවකාශයට ගෙනයෑම කල නොහැක',
-'imagetypemismatch' => 'නව ගොනු ප්‍රසර්ජනය එහි වර්ගය හා නොගැලපේ',
-'imageinvalidfilename' => 'ඉලක්කගත ගොනු නාමය අනීතිකයි',
-'fix-double-redirects' => 'මà·\94ලà·\8a à·\81à·\93රà·\8aà·\82යට à¶\91ලà·\8aලà·\80න à¶\9aà·\92à·\83à·\92යමà·\8a à¶ºà·\85à·\92-යà·\9cමà·\94à·\80à·\93මà·\8a à¶\8bඩà·\94à¶\9cත කරන්න',
-'move-leave-redirect' => 'යà·\85à·\92-යà·\9cමà·\94à·\80à¶\9aà·\8a à·\84à·\90ර à¶¯à¶¸න්න',
+'imagetypemismatch' => 'නව ගොනු ප්‍රසර්ජනය(extension) එහි වර්ගය හා නොගැලපේ',
+'imageinvalidfilename' => 'ඉලක්ක ගොනු නාමය වලංගුනැත',
+'fix-double-redirects' => 'මà·\94ලà·\8a à¶¸à·\8fතà·\98à¶\9aà·\8fà·\80ට à¶\91ලà·\8aලà·\80න à¶ºà·\85à·\92-යà·\9cමà·\94 à¶\85පà·\8aඩà·\9aටà·\8a කරන්න',
+'move-leave-redirect' => 'යà·\85à·\92-යà·\9cමà·\94à·\80à¶\9aà·\8a à·\83à¶\9aà·\83à·\8f à¶\9cà·\99නයන්න',
 'protectedpagemovewarning' => "'''අවවාදයයි:''' පරිපාලක වරප්‍රසාද සතු පරිශීලකයන්ට පමණක් ගෙන යෑ හැකි පරිදී මෙම පිටුව අවුරා ඇත.
 ආසන්නතම ලඝු සටහන යොමුවන් සඳහා පහතින් සපයනු ලැබේ:",
 'semiprotectedpagemovewarning' => "'''සටහන:''' ලේඛනගත පරිශීලකයන්ට පමණක් ගෙන යෑ හැකි පරිදි මෙම පිටුව අවුරා ඇත.
@@ -2983,8 +2984,8 @@ $1',
 'filedelete-archive-read-only' => 'වෙබ්සේවාදායකය විසින්  "$1"සංරක්ෂික විරෙක්ටරියට ලිවීම සිදුකල නොහැක.',
 
 # Browsing diffs
-'previousdiff' => 'â\86\90 à¶´à·\90රà·\90ණà·\92 à·\83à¶\82à·\83à·\8aà¶\9aරණය',
-'nextdiff' => 'නවීන සංස්කරණය →',
+'previousdiff' => 'â\86\90 à¶´à·\90රණà·\92 à·\83à¶\82à·\83à·\8aà¶\9aරණ',
+'nextdiff' => 'නව සංස්කරණ →',
 
 # Media information
 'mediawarning' => "'''අවවාදයයි''': අනිෂ්ට කේතයන් මෙම ගොනුවෙහි අඩංගු විය හැක.
@@ -3220,7 +3221,7 @@ Others will be hidden by default.
 'exif-countrycreated' => 'රූපය ගන්නා ලද රට',
 'exif-countrycodecreated' => 'රූපය ගන්නා ලද රටෙහි කේතය',
 'exif-provinceorstatecreated' => 'රූපය ගන්නා ලද පළාත හෝ ප්‍රාන්තය',
-'exif-citycreated' => 'රà·\96පය à¶\9cනà·\8aනà·\8f à¶½à¶¯ à¶±à¶\9cරය',
+'exif-citycreated' => 'රà·\96පය à¶\9cනà·\8aනà·\8f à¶½à¶¯ à¶´à·\94රà·\80රය',
 'exif-sublocationcreated' => 'රූපය ගන්නා ලද නගර උප-ස්ථානය',
 'exif-worldregiondest' => 'ලෝක ප්‍රදේශය දක්වා ඇත',
 'exif-countrydest' => 'පෙන්වනලද රට',
@@ -3230,7 +3231,7 @@ Others will be hidden by default.
 'exif-sublocationdest' => 'පුරවරයේ උප-ස්ථානය දක්වා ඇත',
 'exif-objectname' => 'කෙටි මාතෘකාව',
 'exif-specialinstructions' => 'විශේෂ උපදෙස්',
-'exif-headline' => 'à·\81ිරස්තලය',
+'exif-headline' => 'à·\83ිරස්තලය',
 'exif-credit' => 'විශ්වාසය/ප්‍රතිපාදකයා',
 'exif-source' => ' මූලාශ්‍රය',
 'exif-editstatus' => 'රූපයේ සංස්කරණ තත්ත්වය',
@@ -3276,7 +3277,7 @@ Others will be hidden by default.
 'exif-event' => 'විස්තර දක්වන ලද සිද්ධිය',
 'exif-organisationinimage' => 'විස්තර දක්වන ලද සංවිධානය',
 'exif-personinimage' => 'පුද්ගලික වචනයෙන් විස්තර කරන ලද',
-'exif-originalimageheight' => 'à¶\9aà·\90පà·\94මට පෙර රූපයෙහි උස',
+'exif-originalimageheight' => 'à¶\9aපà·\8aපà·\8fදà·\94à·\80ට පෙර රූපයෙහි උස',
 
 # EXIF attributes
 'exif-compression-1' => 'අසංක්ෂිප්ත',
@@ -3290,7 +3291,7 @@ Others will be hidden by default.
 'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
 
-'exif-unknowndate' => 'à¶\85ඥà·\8fත දිනයකි',
+'exif-unknowndate' => 'නà·\9cදනà·\8aනà·\8f දිනයකි',
 
 'exif-orientation-1' => 'සාමාන්‍ය',
 'exif-orientation-2' => 'තිරස වටා පෙරලා',
@@ -3394,8 +3395,8 @@ Others will be hidden by default.
 'exif-exposuremode-1' => 'හස්තීය නිරාවරණය',
 'exif-exposuremode-2' => 'ස්වයං සමුච්චය',
 
-'exif-whitebalance-0' => 'à·\83à·\8aà·\80යà¶\82à¶\9aà·\8aâ\80\8dරà·\93ය à·\81à·\8aà·\80à·\9aත තුලනය',
-'exif-whitebalance-1' => 'à·\84à·\83à·\8aතà·\93ය  à·\81à·\8aà·\80à·\9aත à¶­à·\94ලනය',
+'exif-whitebalance-0' => 'à·\83à·\94දà·\94 à¶´à·\8fට à·\83à·\8aà·\80යà¶\82à¶\9aà·\8aâ\80\8dරà·\93යà·\80 තුලනය',
+'exif-whitebalance-1' => 'à\94බà·\80à·\92à·\83à·\92නà·\8a à·\83à·\94දà·\94 à¶´à·\8fට  à¶­à·\94ලනයà¶\9aà·\92රà·\93ම',
 
 'exif-scenecapturetype-0' => 'සම්මත',
 'exif-scenecapturetype-1' => 'භූතල තලීය',
@@ -3479,7 +3480,7 @@ Others will be hidden by default.
 'exif-dc-source' => 'මූලාශ්‍ර මාධ්‍ය',
 'exif-dc-type' => 'මාධ්‍ය වර්ගය',
 
-'exif-rating-rejected' => 'ප්‍රතික්ෂිප්ත',
+'exif-rating-rejected' => 'ප්‍රතික්‍ෂේපිත',
 
 'exif-isospeedratings-overflow' => '65535 ට වඩා විශාලතර',
 
@@ -3650,7 +3651,7 @@ This confirmation code will expire at $4.',
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => '{{PLURAL:$1|තත්පරයකට|තත්පර $1 කට}} වඩා නැවුම් වෙනස්වීම්, ලැයිස්තුවෙහි පෙන්නුම් නොවීමට ඉඩ ඇත.',
-'lag-warn-high' => 'දත්ත-ගබඩා සේවාදායකයෙහි අධික විලම්බය නිසා, වෙනස්වීමට පසු ගතවූයේ  {{PLURAL:$1|එක් තත්පරයක්|තත්පර $1 ක්}} පමණක් නම්, ලැයිස්තුවෙහි අන්තර්ගතවී නොතිබිය හැක.',
+'lag-warn-high' => "දත්තසංචිත ස'වරයේ අධි විලම්බය නිසා, වෙනස්වීමට පසු ගතවූයේ  {{PLURAL:$1|එක් තත්පරයක්|තත්පර $1 ක්}} පමණක් නම්, ලැයිස්තුවෙහි අන්තර්ගතවී නොතිබිය හැක.",
 
 # Watchlist editor
 'watchlistedit-numitems' => 'සාකච්ඡා පිටු ගණනය නොකල විට, ඔබගේ මුර-ලැයිස්තුවෙහි  {{PLURAL:$1|ශීර්ෂ එකක්|ශීර්ෂ $1 ක්}} අඩංගු වේ.',
@@ -3761,7 +3762,7 @@ This confirmation code will expire at $4.',
 'version-hook-name' => 'හසුරු නම',
 'version-hook-subscribedby' => 'දායකවී ඇත්තේ',
 'version-version' => '(අනුවාදය $1)',
-'version-license' => 'බලපතà·\8aâ\80\8dරය',
+'version-license' => 'à·\80රපත',
 'version-poweredby-credits' => "මෙම විකිය '''[//www.mediawiki.org/ MediaWiki]''' මගින් බලගන්වා ඇත, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'අනෙකුත්',
 'version-license-info' => 'MediaWiki යනු නිදහස් මෘදුකාංගයකි; නිදහස් මෘදුකාංග පදනමේ (Free Software Foundation) හි GNU General Public License නම් බලපත්‍රයේ වගන්තිවලට අනුව ඔබට එය නැවත බෙදාහැරීම සහ/හෝ සංස්කරණය කළ හැක; ඒ, එම බලපත්‍රයේ 2වන හෝ (ඔබට කැමති නම්) ඉන්පසු එන සංස්කරණයකට අනුවය.
@@ -3799,7 +3800,7 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 * <span class="mw-specialpagecached">කෑෂිත වි‍ශේෂ පිටු (යල් පැන ගිය විය හැක).</span>',
 'specialpages-group-maintenance' => 'නඩත්තු වාර්තා',
 'specialpages-group-other' => 'අනෙකුත් විශේෂ පිටු',
-'specialpages-group-login' => 'පà·\8aâ\80\8dරà·\80à·\92à·\82à·\8aට à·\80න්න / ගිණුමක් තනන්න',
+'specialpages-group-login' => 'පà·\92à·\80à·\92à·\83à·\99න්න / ගිණුමක් තනන්න',
 'specialpages-group-changes' => 'මෑත වෙනස්වීම් හා ලඝු-සටහන්',
 'specialpages-group-media' => 'මාධ්‍ය වාර්තා හා උඩුගත කිරීම්',
 'specialpages-group-users' => 'පරිශීලකයන් හා හිමිකම්',
@@ -3808,11 +3809,11 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'specialpages-group-pagetools' => 'පිටු මෙවලම්',
 'specialpages-group-wiki' => 'විකි දත්ත හා මෙවලම්',
 'specialpages-group-redirects' => 'විශේෂ පිටු යළි-යොමුකිරීම',
-'specialpages-group-spam' => 'à\85යà·\8fචà·\92ත-තà·\90පà·\91ල මෙවලම්',
+'specialpages-group-spam' => 'à·\83à·\8aපà·\91මà·\8a මෙවලම්',
 
 # Special:BlankPage
 'blankpage' => 'හිස් පිටුව',
-'intentionallyblankpage' => 'මà·\99ම à¶´à·\92ටà·\94à·\80 à\85භà·\92පà·\8aâ\80\8dරà·\9aතà·\80 à·\84à·\92à·\83à·\8aà·\80 à¶­à¶¶à¶± à¶½à¶¯à·\92',
+'intentionallyblankpage' => 'මà·\99ම à¶´à·\92ටà·\94à·\80 à·\83à·\92තà·\8fමතà·\8fම à·\84à·\92à·\83à·\8aà·\80 à¶­à¶¶à·\8f à¶\87ත.',
 
 # External image whitelist
 'external_image_whitelist' => '#මෙම පේළිය මෙම අයුරින්ම තිබීමට ඉඩ හරින්න <pre>
@@ -3942,13 +3943,13 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'api-error-ok-but-empty' => 'අභ්‍යන්තර දෝෂය: සර්වරයෙන් ප්‍රතිචාරයක් නොමැත.',
 'api-error-overwrite' => 'දැනටමත් තිබෙන ගොනුවක් යටපත් කෙරුමට ඉඩදෙනු නොලැබේ.',
 'api-error-stashfailed' => 'අභ්‍යන්තර දෝෂය: තාවකාලික ගොනුව සුරක්ෂිත කිරීමට සර්වරයට නොහැකි වුනි.',
-'api-error-timeout' => 'බලාපොරොත්තු වූ කාලය තුල සර්වරය ප්‍රතිචාර නොදක්වන ලදී.',
+'api-error-timeout' => 'බලාපොරොත්තු වූ කාලය තුල ස"වරය ප්‍රතිචාර නොදක්වන ලදී.',
 'api-error-unclassified' => 'හඳුනා නොගත් දෝෂයක් ඇතිවිය.',
 'api-error-unknown-code' => 'නොදත් දෝෂය: "$1"',
 'api-error-unknown-error' => 'අභ්‍යන්තර දෝෂය: ඔබ මෙම ගොනුව උඩුගත කිරීමට තැත් කිරීමේදී කුමක්දෝ වැරදුණා.',
 'api-error-unknown-warning' => 'නොදත් අවවාදය: $1',
 'api-error-unknownerror' => 'හඳුනාගත නොහැකි දෝෂය: "$1".',
 'api-error-uploaddisabled' => 'මෙම විකියෙහි උඩුගතකිරීම අක්‍රිය කොට ඇත.',
-'api-error-verification-error' => 'මà·\99ම à¶\9cà·\9cනà·\94à·\80 à·\83මà·\84රà·\80à·\92ට à¶¯à·\96à·\82à·\92ත à·\80à·\93 à¶\87ත, à·\84à·\9d à¶\91යට à·\80à·\90රදà·\92 à·\80à·\92à·\83à·\8aතà·\92රà·\8aණයà¶\9aà·\8a à¶\87ත.',
+'api-error-verification-error' => 'මà·\99ම à¶\9cà·\9cනà·\94à·\80 à¶´à·\85à·\94දà·\94à·\80à·\93 à·\84à·\9d à¶\91යට à·\80à·\90රදà·\92 à·\80à·\92à·\83à·\8aතà·\92රà·\8aණයà¶\9aà·\8a (extension) à¶\87තà·\94à·\80à·\8f à·\80à·\92යà·\84à·\90à¶\9a.',
 
 );
index 8de0e3a..6d331d8 100644 (file)
@@ -6,15 +6,6 @@
  *
  * @ingroup Language
  * @file
- *
- * @author Hydra
  */
 
 $fallback = 'en';
-
-$messages = array(
-# Vector skin
-'vector-view-create' => 'Start',
-'vector-view-edit'   => 'Change',
-
-);
index cc9c740..ff58c7e 100644 (file)
@@ -409,7 +409,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'pokrač.',
 'index-category' => 'Indexované stránky',
 'noindex-category' => 'neindexované stránky',
-'broken-file-category' => 'Stránky s poškodenými odkazmi súbor',
+'broken-file-category' => 'Stránky s odkazom na neexistujúci súbor',
 
 'about' => 'Projekt',
 'article' => 'Stránka s obsahom',
@@ -665,9 +665,9 @@ $2',
 'ns-specialprotected' => 'Stránky v mennom pristore {{ns:special}} nie je možné upravovať.',
 'titleprotected' => "Používateľ [[User:$1|$1]] zabránil vytváraniu stránky s týmto názvom.
 Udaný dôvod: ''$2''.",
-'filereadonlyerror' => "Nebolo možné modifikovať súbor „$1“, protože úložisko „$2“ je momentálne v režime len na čítanie.
+'filereadonlyerror' => 'Nebolo možné modifikovať súbor „$1“, pretože úložisko „$2“ je momentálne v režime len na čítanie.
 
-Udaný dôvod: „''$3''“.",
+Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
 
 # Virus scanner
 'virus-badscanner' => "Chybná konfigurácia: neznámy antivírus: ''$1''",
@@ -758,6 +758,7 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
 'emailconfirmlink' => 'Potvrďte vašu e-mailovú adresu',
 'invalidemailaddress' => 'Emailovú adresu nemožno akceptovať, pretože sa zdá, že má neplatný formát. Zadajte adresu v správnom tvare alebo nechajte príslušné políčko prázdne.',
 'cannotchangeemail' => 'Na tejto wiki nie je možné meniť e-mailové adresy používateľského konta.',
+'emaildisabled' => 'Táto lokalita nedokáže posielať emaily.',
 'accountcreated' => 'Účet vytvorený',
 'accountcreatedtext' => 'Používateľský účet $1 bol vytvorený.',
 'createaccount-title' => 'Vytvorenie účtu na {{GRAMMAR:lokál|{{SITENAME}}}}',
@@ -962,7 +963,8 @@ Dolu je pre informáciu posledná položka zo záznamu blokovaní:',
 'updated' => '(Aktualizovaný)',
 'note' => "'''Poznámka: '''",
 'previewnote' => "'''Nezabudnite, toto je iba náhľad stránky, ktorú upravujete.
-Zmeny ešte nie sú uložené!''' [[#editform|→ Pokračujte v úpravách]]",
+Zmeny ešte nie sú uložené!'''",
+'continue-editing' => 'Pokračovať v úpravách',
 'previewconflict' => 'Tento náhľad upravenej stránky zobrazuje text z horného poľa s textom tak, ako sa zobrazí potom, keď ju uložíte.',
 'session_fail_preview' => "'''Prepáčte, nemohli sme spracovať váš príspevok kvôli strate údajov relácie.
 Skúste to prosím ešte raz.
@@ -975,6 +977,7 @@ Ak to nebude fungovať, skúste sa [[Special:UserLogout|odhlásiť]] a znovu pri
 'token_suffix_mismatch' => "'''Vaša úprava bola zamietnutá, pretože váš klient pokazil znaky s diakritikou v editačnom symbole (token). Úprava bola zamietnutá, aby sa zabránilo poškodeniu textu stránky. Toto sa občas stáva, keď používate chybnú anonymnú proxy službu cez webové rozhranie.'''",
 'edit_form_incomplete' => "'''Niektoré časti editačného formulára nedosiahli server. Prosím, znova skontrolujte, že vaše úpravy sú nepoškodené a skúste to znova.'''",
 'editing' => 'Úprava stránky $1',
+'creating' => 'Vytvára sa $1',
 'editingsection' => 'Úprava stránky $1 (sekcia)',
 'editingcomment' => 'Úprava stránky $1 (nová sekcia)',
 'editconflict' => 'Konflikt pri úprave: $1',
@@ -1040,6 +1043,7 @@ Zdá sa, že bola zmazaná.',
 'edit-no-change' => 'Vaša úprava bola ignorovaná, pretože ste v texte nič nezmenili.',
 'edit-already-exists' => 'Nebolo možné vytvoriť novú stránku.
 Už existuje.',
+'defaultmessagetext' => 'Predvolený text správy',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozornenie: Táto stránka obsahuje príliš mnoho volaní funkcií syntaktického analyzátora, ktoré nadmerne zaťažujú server.
@@ -1055,6 +1059,10 @@ Tieto argumenty boli vynechané.',
 'parser-template-loop-warning' => 'Zistená slučka v šablónach: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Bol prekročený limit rekurzie šablón ($1)',
 'language-converter-depth-warning' => 'Bolo prekročené obmedzenie hĺbky ($1) jazykového konvertora',
+'node-count-exceeded-category' => 'Stránky s priveľkým počtom uzlov',
+'node-count-exceeded-warning' => 'Stránka prekročila povolený počet uzlov',
+'expansion-depth-exceeded-category' => 'Stránky s priveľkou hĺbkou expanzie',
+'expansion-depth-exceeded-warning' => 'Stránka prekročila povolenú hĺbku expanzie',
 
 # "Undo" feature
 'undo-success' => 'Úpravu je možné vrátiť. Prosím skontrolujte tento rozdiel, čím overíte, že táto úprava je tá, ktorú chcete, a následne uložte zmeny, čím ukončíte vrátenie.',
@@ -1918,6 +1926,10 @@ Môžete si pozrieť [[Special:WhatLinksHere/$2|úplný zoznam]].',
 'sharedupload' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch.',
 'sharedupload-desc-there' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch. Ďalšie informácie nájdete na [$2 popisnej stránke súboru].',
 'sharedupload-desc-here' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch. Nižšie sú zobrazené informácie z [$2 popisnej stránky súboru].',
+'sharedupload-desc-edit' => 'Tento súbor je z $1 a môžu ho používať iné projekty.
+Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
+'sharedupload-desc-create' => 'Tento súbor je z $1 a môžu ho používať iné projekty.
+Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'filepage-nofile' => 'Neexistuje žiadny súbor s takýmto názvom.',
 'filepage-nofile-link' => 'Súbor s takýmto názvom neexistuje, ale môžete ho [$1 nahrať].',
 'uploadnewversion-linktext' => 'Nahrať novú verziu tohto súboru',
@@ -2128,6 +2140,12 @@ Môžete zúžiť rozsah, ak zvolíte typ záznamu, používateľské meno alebo
 'allpagesprefix' => 'Zobraziť stránky s predponou:',
 'allpagesbadtitle' => 'Zadaný názov stránky je neplatný alebo mal medzijazykový alebo interwiki prefix. Môže obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v názve stránky.',
 'allpages-bad-ns' => '{{SITENAME}} nemá menný priestor „$1“.',
+'allpages-hide-redirects' => 'Skryť presmerovania',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Prezeráte si kópiu stránky z vyrovnávacej pamäte, môže byť stará až $1.',
+'cachedspecial-viewing-cached-ts' => 'Prezeráte si kópiu stránky z vyrovnávacej pamäte, nemusí byť úplne aktuálna.',
+'cachedspecial-refresh-now' => 'Zobraziť aktuálnu.',
 
 # Special:Categories
 'categories' => 'Kategórie',
@@ -3724,6 +3742,9 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'version-software' => 'Nainštalovaný softvér',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Verzia',
+'version-entrypoints' => 'URL vstupných bodov',
+'version-entrypoints-header-entrypoint' => 'Vstupný bod',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Cesta k súboru',
@@ -3912,4 +3933,15 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 'api-error-uploaddisabled' => 'Nahrávanie je na tejto wiki zakázané.',
 'api-error-verification-error' => 'Tento súbor môže byť poškodený, alebo má zlú príponu.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundy|sekúnd}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minúta|minúty|minút}}',
+'duration-hours' => '$1 {{PLURAL:$1|hodina|hodiny|hodín}}',
+'duration-days' => '$1 {{PLURAL:$1|deň|dni|dní}}',
+'duration-weeks' => '$1 {{PLURAL:$1|týždeň|týždne|týždňov}}',
+'duration-years' => '$1 {{PLURAL:$1|rok|roky|rokov}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekáda|dekády|dekád}}',
+'duration-centuries' => '$1 {{PLURAL:$1|storočie|storočia|storočí}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tisícročie|tisícročia|tisícročí}}',
+
 );
index 84f96d0..6ff8615 100644 (file)
@@ -222,8 +222,8 @@ $messages = array(
 'tog-watchlisthideown' => 'Na spisku nadzorov skrij moja urejanja',
 'tog-watchlisthidebots' => 'Na spisku nadzorov skrij urejanja botov',
 'tog-watchlisthideminor' => 'Skrij manjša urejanja na spisku nadzorov',
-'tog-watchlisthideliu' => 'Skrij urejanja prijavljenih uporabnikov v spisku nadzorov',
-'tog-watchlisthideanons' => 'Skrij urejanja anonimnih uporabnikov v spisku nadzorov',
+'tog-watchlisthideliu' => 'Skrij urejanja prijavljenih uporabnikov na spisku nadzorov',
+'tog-watchlisthideanons' => 'Skrij urejanja anonimnih uporabnikov na spisku nadzorov',
 'tog-watchlisthidepatrolled' => 'Skrij pregledana urejanja s spiska nadzorov',
 'tog-ccmeonemails' => 'Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom',
 'tog-diffonly' => 'Ne prikaži vsebine strani pod primerjavo',
@@ -574,6 +574,8 @@ Podani razlog je bil »''$2''«.",
 'filereadonlyerror' => 'Ne morem spremeniti datoteke »$1«, ker je skladišče datotek »$2« v načinu, ki dovoljuje samo branje.
 
 Administrator, ki ga je zaklenil, je podal naslednje pojasnilo: »$3«.',
+'invalidtitle-knownnamespace' => 'Neveljaven naslov z imenskim prostorom »$2« in besedilom »$3«',
+'invalidtitle-unknownnamespace' => 'Neveljaven naslov z neznano številko imenskega prostora $1 in besedilom »$2«',
 
 # Virus scanner
 'virus-badscanner' => "Slaba konfiguracija: neznani virus skener: ''$1''",
@@ -608,7 +610,7 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'createaccount' => 'Ustvari račun',
 'gotaccount' => 'Račun že imate? $1.',
 'gotaccountlink' => 'Prijavite se',
-'userlogin-resetlink' => 'Ste pozabili svoje podatke za prijavo?',
+'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
 'createaccountmail' => 'Po e-pošti',
 'createaccountreason' => 'Razlog:',
 'badretype' => 'Gesli, ki ste ju vnesli, se ne ujemata.',
@@ -756,7 +758,7 @@ Začasno geslo: $2',
 'changeemail-oldemail' => 'Trenutni e-poštni naslov:',
 'changeemail-newemail' => 'Novi e-poštni naslov:',
 'changeemail-none' => '(noben)',
-'changeemail-submit' => 'Spremeni e-pošto',
+'changeemail-submit' => 'Spremeni e-naslov',
 'changeemail-cancel' => 'Prekliči',
 
 # Edit page toolbar
@@ -873,8 +875,9 @@ Najnovejši vnos v dnevniku blokad je prikazan spodaj:',
 Vedite, da .css in .js strani po meri uporabljajo naslov z malo začetnico, npr. {{ns:user}}:Blabla/vector.css namesto {{ns:user}}:Blabla/Vector.css.",
 'updated' => '(Posodobljeno)',
 'note' => "'''Opomba:'''",
-'previewnote' => "'''Pomnite, da je to le predogled strani.'''
-Vaših sprememb še nismo shranili! [[#editform|→ Nadaljujte z urejanjem]]",
+'previewnote' => "'''Pomnite, da stran le predogledujete.'''
+Vaših sprememb še nismo shranili!",
+'continue-editing' => 'Nadaljujte z urejanjem',
 'previewconflict' => 'V prikazanem predogledu je v zgornjem predelu urejanja navedeno besedilo, kakor se bo prikazalo, če ga boste shranili.',
 'session_fail_preview' => "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.'''
 Prosimo, poskusite znova.
@@ -969,6 +972,10 @@ Naslednji argumenti so bili izpuščeni.",
 'parser-template-loop-warning' => 'V predlogi je bila odkrita zanka: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Prekoračena globina rekurzije predlog ($1)',
 'language-converter-depth-warning' => 'Prekoračena globina pretvorbe jezikov ($1)',
+'node-count-exceeded-category' => 'Strani s prekoračenim številom vozlišč',
+'node-count-exceeded-warning' => 'Stran je prekoračila število vozlišč',
+'expansion-depth-exceeded-category' => 'Strani s prekoračeno globino razširitve',
+'expansion-depth-exceeded-warning' => 'Stran je prekoračila globino razširitve',
 
 # "Undo" feature
 'undo-success' => 'Urejanje ste razveljavili. Prosim, potrdite in nato shranite spodnje spremembe.',
@@ -1113,7 +1120,7 @@ Prosimo, preverite dnevnik.',
 # Suppression log
 'suppressionlog' => 'Dnevnik vračanj',
 'suppressionlogtext' => 'Spodaj je seznam izbrisov in blokiranj, ki vključuje vsebino skrito pred administratorji.
-Oglejte si [[Special:BlockList|seznam blokiranih IP-jev]] za seznam trenutno aktivnih prepovedi in blokiranj.',
+Oglejte si [[Special:BlockList|seznam blokad]] za seznam trenutno aktivnih prepovedi in blokiranj.',
 
 # History merging
 'mergehistory' => 'Združi zgodovine strani',
@@ -1255,7 +1262,7 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
 'prefs-watchlist-token' => 'Ključ spiska nadzorov:',
 'prefs-misc' => 'Druge nastavitve',
 'prefs-resetpass' => 'Spremeni geslo',
-'prefs-changeemail' => 'Spremeni e-pošto',
+'prefs-changeemail' => 'Spremeni e-poštni naslov',
 'prefs-setemail' => 'Nastavi e-poštni naslov',
 'prefs-email' => 'Možnosti e-pošte',
 'prefs-rendering' => 'Videz',
@@ -1270,10 +1277,10 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
 'resultsperpage' => 'Prikazanih zadetkov na stran:',
 'stub-threshold' => 'Prag označevanja <a href="#" class="stub">škrbin</a> (v bajtih):',
 'stub-threshold-disabled' => 'Onemogočeno',
-'recentchangesdays' => 'Število dni prikazanih v zadnjih spremembah:',
+'recentchangesdays' => 'Število dni, prikazanih v zadnjih spremembah:',
 'recentchangesdays-max' => 'Največ $1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
 'recentchangescount' => 'Privzeto število prikazanih urejanj:',
-'prefs-help-recentchangescount' => 'To vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.',
+'prefs-help-recentchangescount' => 'Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.',
 'prefs-help-watchlist-token' => 'Izpolnjevanje tega polja s skrivnim ključem bo ustvarilo vir RSS za vaš spisek nadzorov.
 Kdorkoli pozna ta ključ bo lahko bral vaš spisek nadzorov, zato izbrite varen in čim daljši ključ.
 Tukaj je naključno ustvarjena vrednost, ki jo lahko uporabite: $1',
@@ -1332,14 +1339,15 @@ Podatek bo javno prikazan.',
 'email' => 'E-pošta',
 'prefs-help-realname' => 'Pravo ime je neobvezno.
 Če se ga odločite navesti, bo uporabljeno za priznavanje vašega dela.',
-'prefs-help-email' => 'E-poštni naslov ni obvezen, vendar vam omogoča, da vam v primeru pozabljenega gesla pošljemo novo.',
-'prefs-help-email-others' => 'Poleg tega vpisan e-poštni naslov omogoča drugim, da vam lahko pošiljajo elektronsko pošto brez razkritja vaše istovetnosti.',
+'prefs-help-email' => 'E-poštni naslov ni obvezen, vendar omogoča, da vam v primeru pozabljenega gesla pošljemo novo.',
+'prefs-help-email-others' => 'Omogočite lahko tudi možnost, da vam lahko ostali uporabniki pošiljajo e-pošto prek vaše uporabniške ali pogovorne strani.
+Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo razkrili.',
 'prefs-help-email-required' => 'E-poštni naslov je obvezen.',
 'prefs-info' => 'Osnovni podatki',
 'prefs-i18n' => 'Internacionalizacija',
 'prefs-signature' => 'Podpis',
 'prefs-dateformat' => 'Zapis datuma',
-'prefs-timeoffset' => 'Čas za izravnavo',
+'prefs-timeoffset' => 'Časovni odmik',
 'prefs-advancedediting' => 'Napredne možnosti',
 'prefs-advancedrc' => 'Napredne možnosti',
 'prefs-advancedrendering' => 'Napredne možnosti',
@@ -1514,7 +1522,7 @@ Podatek bo javno prikazan.',
 'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
 'recentchanges-label-minor' => 'Manjše urejanje',
 'recentchanges-label-bot' => 'To urejanje je bilo izvedeno z botom',
-'recentchanges-label-unpatrolled' => 'To urejanje še ni bilo pregledano',
+'recentchanges-label-unpatrolled' => 'Urejanje še ni bilo pregledano',
 'rcnote' => "Prikazujem {{PLURAL:$1|zadnjo spremembo|zadnji '''$1''' spremembi|zadnje '''$1''' spremembe|zadnjih '''$1''' sprememb|zadnjih '''$1''' sprememb}} v {{PLURAL:$2|zadnjem|zadnjih|zadnjih|zadnjih|zadnjih}} '''$2''' {{PLURAL:$2|dnevu|dneh|dneh|dneh|dneh}}, od $5, $4.",
 'rcnotefrom' => "Navedene so spremembe od '''$2''' dalje (prikazujem jih do '''$1''').",
 'rclistfrom' => 'Prikaži spremembe od $1 naprej',
@@ -1528,7 +1536,7 @@ Podatek bo javno prikazan.',
 'diff' => 'prim',
 'hist' => 'zgod',
 'hide' => 'skrij',
-'show' => 'prikaži',
+'show' => 'Prikaži',
 'minoreditletter' => 'm',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
@@ -1566,11 +1574,11 @@ Strani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
 
 Dnevnik brisanja in prestavitev za to stran sta navedena tukaj:",
 'uploadtext' => "Spodnji obrazec lahko uporabite za nalaganje datotek.
-Za ogled ali iskanje že naloženih pojdite na [[Special:FileList|seznam naloženih datotek]], ponovne naložitve so zapisane tudi v [[Special:Log/upload|dnevniku nalaganja]], izbrisi pa v [[Special:Log/delete|dnevniku brisanja]].
+Za ogled ali iskanje že naloženih pojdite na [[Special:FileList|seznam naloženih datotek]]; ponovna nalaganja so zabeležena tudi v [[Special:Log/upload|dnevniku nalaganja]], izbrisi pa v [[Special:Log/delete|dnevniku brisanja]].
 
-Datoteko lahko na želeno stran vključite z naslednjo skladnjo
+Datoteko lahko na želeno stran vključite na naslednje načine:
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></tt>''' (polna velikost)
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></tt>''' (slika pomanjšana na velikost 200px, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></tt>''' (slika pomanjšana na 200 slikovnih pik širine, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)
 * '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></tt>''' (neposredna povezava z datoteko)",
 'upload-permitted' => 'Dovoljene vrste datotek: $1.',
 'upload-preferred' => 'Priporočene vrste datotek: $1.',
@@ -1792,6 +1800,7 @@ Za optimalno varnost je img_auth.php onemogočen.',
 'http-curl-error' => 'Napaka pri doseganju URL: $1',
 'http-host-unreachable' => 'Ni mogoče doseči URL.',
 'http-bad-status' => 'Med zahtevo HTTP je prišlo do težave: $1 $2',
+'http-truncated-body' => 'Prejeli smo samo del telesa zahteve.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Ni možno doseči URL',
@@ -1849,10 +1858,10 @@ Na voljo je tudi [[Special:WhatLinksHere/$2|celotni seznam]].',
 'morelinkstoimage' => 'Preglejte [[Special:WhatLinksHere/$1|več povezav]] na to datoteko.',
 'linkstoimage-redirect' => '$1 (preusmeritev datoteke) $2',
 'duplicatesoffile' => '{{PLURAL:$1|Sledeča datoteka je dvojnik|Sledeči datoteki sta dvojnika|Sledeče $1 datoteke so dvojniki|Sledečih $1 datotek so dvojniki}} te datoteke ([[Special:FileDuplicateSearch/$2|več podrobnosti]]):',
-'sharedupload' => 'Datoteka je del $1 in se lahko uporabi v drugih projektih.',
-'sharedupload-desc-there' => 'Ta datoteka je iz $1 in se lahko uporablja v drugih projektih.
+'sharedupload' => 'Datoteka je del projekta $1 in se lahko uporabi v drugih projektih.',
+'sharedupload-desc-there' => 'Datoteka je iz projekta $1 in se lahko uporablja v drugih projektih.
 Prosimo, oglejte si [$2 opisno stran datoteke] za dodatne informacije.',
-'sharedupload-desc-here' => 'Ta datoteka je iz $1 in se lahko uporablja v drugih projektih.
+'sharedupload-desc-here' => 'Datoteka je iz projekta $1 in se lahko uporablja v drugih projektih.
 Povzetek na njeni [$2 opisni strani datoteke] je prikazan spodaj.',
 'sharedupload-desc-edit' => 'Datoteka je z $1 in jo morda uporabljajo drugi projekti.
 Morda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datoteke].',
@@ -2073,6 +2082,11 @@ Morda vsebuje enega ali več znakov, ki niso dovoljeni v naslovih.',
 'allpages-bad-ns' => '{{SITENAME}} nima imenskega prostora »$1«.',
 'allpages-hide-redirects' => 'Skrij preusmeritve',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Ogledujete si predpomnjeno različico strani, ki je lahko stara $1.',
+'cachedspecial-viewing-cached-ts' => 'Ogledujete si predpomnjeno različico strani, ki morda ni popolnoma posodobljena.',
+'cachedspecial-refresh-now' => 'Ogled najnovejše.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Naslednja $1 kategorija vsebuje|Naslednji $1 kategoriji vsebujeta|Naslednje $1 kategorije vsebujejo|Naslednjih $1 kategorij vsebuje}} strani ali datoteke.
@@ -2190,7 +2204,7 @@ Morebitne spremembe te strani in pripadajoče pogovorne strani bodo navedene tuk
 'unwatchthispage' => 'Prenehaj opazovati stran',
 'notanarticle' => 'Ni članek',
 'notvisiblerev' => 'Redakcija je bila izbrisana',
-'watchnochange' => 'V prikazanem časovnem obdobju se ni spremenila nobena med nadzorovanimi stranmi.',
+'watchnochange' => 'V prikazanem časovnem obdobju ni nihče spremenil nadzorovanih strani.',
 'watchlist-details' => 'Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).',
 'wlheader-enotif' => '* Obveščanje po elektronski pošti je omogočeno.',
 'wlheader-showupdated' => "* Od vašega zadnjega ogleda spremenjene strani so prikazanje '''krepko'''.",
@@ -2518,7 +2532,7 @@ Vnesite tudi razlog (''na primer'' seznam strani, ki jih je uporabnik po nepotre
 'badipaddress' => 'Neveljaven IP-naslov ali uporabniško ime.',
 'blockipsuccesssub' => 'Blokiranje je uspelo',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran(-a)}}.<br />
-Oglejte si [[Special:BlockList|seznam blokiranih IP-naslovov]] za pregled blokad.',
+Oglejte si [[Special:BlockList|seznam blokad]] za pregled blokad.',
 'ipb-blockingself' => 'Nameravate se blokirati! Ste prepričani, da želite to storiti?',
 'ipb-confirmhideuser' => 'Nameravate blokirati uporabnika z omogočeno možnostjo »skrij uporabnika«. To bo skrilo uporabnikovo ime na vseh seznamih in dnevniških vnosih. Ste prepričani, da želite to storiti?',
 'ipb-edit-dropdown' => 'Uredi razloge blokade',
@@ -2571,7 +2585,7 @@ Dnevnik blokiranja je na voljo spodaj:',
 Dnevnik skrivanja je na voljo spodaj:',
 'blocklogentry' => '[[$1]] blokiran s časom poteka blokade $2 $3',
 'reblock-logentry' => 'spremenil nastavitve blokade za [[$1]] z iztekom dne $2 ob $3',
-'blocklogtext' => 'Prikazan je dnevnik blokiranja in deblokiranja uporabnikov. Samodejno blokirani IP-naslovi niso navedeni. Trenutno veljavna blokiranja so navedena na [[Special:BlockList|seznamu blokiranih IP-naslovov]].',
+'blocklogtext' => 'Prikazan je dnevnik blokiranja in deblokiranja uporabnikov. Samodejno blokirani IP-naslovi niso navedeni. Trenutno veljavna blokiranja so navedena na [[Special:BlockList|seznamu blokad]].',
 'unblocklogentry' => 'je deblokiral(-a) »$1«',
 'block-log-flags-anononly' => 'samo za brezimne uporabnike',
 'block-log-flags-nocreate' => 'ustvarjanje uporabniških računov onemogočeno',
@@ -2866,8 +2880,8 @@ Prosimo, poskusite znova.',
 'tooltip-ca-delete' => 'Brišite stran',
 'tooltip-ca-undelete' => 'Obnovite pred izbrisom napravljena urejanja strani.',
 'tooltip-ca-move' => 'Preimenujte stran',
-'tooltip-ca-watch' => 'Dodajte stran na seznam nadzorov',
-'tooltip-ca-unwatch' => 'Odstranite stran s seznama nadzorov',
+'tooltip-ca-watch' => 'Dodajte stran na spisek nadzorov',
+'tooltip-ca-unwatch' => 'Odstranite stran s spiska nadzorov',
 'tooltip-search' => 'Preiščite wiki',
 'tooltip-search-go' => 'Pojdi na strani z natanko takim imenom, če obstaja',
 'tooltip-search-fulltext' => 'Najde vneseno besedilo po straneh',
@@ -3647,6 +3661,11 @@ Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo
 'version-software' => 'Nameščena programska oprema',
 'version-software-product' => 'Izdelek',
 'version-software-version' => 'Različica',
+'version-entrypoints' => 'URL-ji vstopnih točk',
+'version-entrypoints-header-entrypoint' => 'Vstopna točka',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Pot članka]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Pot skripta]',
 
 # Special:FilePath
 'filepath' => 'Pot do datoteke',
@@ -3838,4 +3857,15 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'api-error-uploaddisabled' => 'Nalaganje je onemogočeno na tem wikiju.',
 'api-error-verification-error' => 'Ta datoteka je morda poškodovana ali ima napačno končnico.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuti|minute|minut}}',
+'duration-hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
+'duration-days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
+'duration-weeks' => '$1 {{PLURAL:$1|teden|tedna|tedni|tednov}}',
+'duration-years' => '$1 {{PLURAL:$1|leto|leti|leta|let}}',
+'duration-decades' => '$1 {{PLURAL:$1|desetletje|desetletji|desetletja|desetletij}}',
+'duration-centuries' => '$1 {{PLURAL:$1|stoletje|stoletji|stoletja|stoletij}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tisočletje|tisočletji|tisočletja|tisočletij}}',
+
 );
index 849c2cc..9cc4c69 100644 (file)
@@ -595,7 +595,8 @@ Mamnuucida ugu danbeyso in oo soo galo hoostaan ee ku qorantahay',
 '''wali lama keydin!'''",
 'updated' => '(waa la opdate gareeyay)',
 'note' => "'''fiiro gaar ah:'''",
-'previewnote' => "'''Waxa aad aragtid waa horfiirin; wixii aad bedeshay lama keydinin!'''",
+'previewnote' => "'''Ogaaw kan waa horfiirin oo kaliya.'''
+Bedelyadaada wali lama keydin!",
 'session_fail_preview' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.
 Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudagal.'''",
 'session_fail_preview_html' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.'''
@@ -604,6 +605,7 @@ Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudag
 
 '''Hadii wax ka bedlkaan uu yahay mid xaq ah, fadlan markale isku day. Hadii aysan weli shaqaynin, is kuday inaad  ka baxdo ee markale soo gudagal.'''",
 'editing' => 'Waxaa badaloosaa $1',
+'creating' => 'Sameynaa $1',
 'editingsection' => 'Waxaa wax ka badaloosaa $1 (qeyb yar)',
 'editingcomment' => 'Waxaa wax ka badaloosaa $1 (qeyb yar)',
 'editconflict' => 'Isku dhac badalaadka: $1',
@@ -637,6 +639,9 @@ Tirtiraha iyo wareejinta gudagalaha boggaan waxaad ka arki kartaa hoostaan.',
 Tusmooyinka qaar lagumo dari doono.",
 'post-expand-template-inclusion-category' => "Boggaga ku xad gudbay weyninka tusmo'da",
 
+# "Undo" feature
+'undo-summary' => 'Noqay bedelaadka $1 ee sameeyay  [[Special:Contributions/$2|$2]] ([[User talk:$2|hadal]])',
+
 # Account creation failure
 'cantcreateaccounttitle' => "Ma' sameynkaro gudagal (akoon)",
 'cantcreateaccount-text' => "Akoon'ka sameeyaha leh ciwaankaan  IP:ka ('''$1''') waxaa mamnuucay [[User:$3|$3]].
@@ -645,6 +650,7 @@ Sababta uu qoray $3 waa ''$2''",
 
 # History pages
 'viewpagelogs' => 'Fiiri guadagalayaasha boggaan',
+'nohistory' => 'Boggaan malahan taariikhda bedelaadka',
 'currentrev' => 'Bedelkii ugu danbeeyay',
 'currentrev-asof' => 'Kala duwanaanshihii ugu danbeeyay oo dhacay $1',
 'revisionasof' => 'Bedelaadkkii ahaa $1',
index e1adc27..5008bb0 100644 (file)
@@ -871,7 +871,7 @@ Më poshtë mund t'i referoheni shënimit të regjistruar për bllokimin e fundi
 'updated' => '(E ndryshuar)',
 'note' => "'''Shënim:'''",
 'previewnote' => "'''Vini re! Kjo faqe është vetëm për shqyrtim.'''
-Ndryshimet tuaja nuk janë ruajtur ende! [[#editform|→ Vazhdo redaktimin]]",
+Ndryshimet tuaja nuk janë ruajtur ende!",
 'previewconflict' => 'Kjo parapamje reflekton tekstin sipër kutisë së redaktimit siç do të duket kur të kryeni ndryshimin.',
 'session_fail_preview' => "'''Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të perpunohej për shkak të humbjes së të dhënave të seancës.'''
 Ju lutemi, provojeni përsëri.
index 4306ab7..747d2b7 100644 (file)
@@ -999,7 +999,7 @@ $2
 'minoredit' => 'мања измена',
 'watchthis' => 'надгледај ову страницу',
 'savearticle' => 'Сачувај страницу',
-'preview' => 'Преглед',
+'preview' => 'Претпреглед',
 'showpreview' => 'Прикажи претпреглед',
 'showlivepreview' => 'Тренутни преглед',
 'showdiff' => 'Прикажи измене',
@@ -1095,7 +1095,8 @@ $2
 'updated' => '(Ажурирано)',
 'note' => "'''Напомена:'''",
 'previewnote' => "'''Имајте у виду да је ово само преглед.'''
-Ваше измене још нису сачуване! [[#editform|→ Настави с уређивањем]]",
+Ваше измене још нису сачуване!",
+'continue-editing' => 'Настави уређивање',
 'previewconflict' => 'Овај преглед осликава како ће текст у текстуалном оквиру изгледати.',
 'session_fail_preview' => "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''
 Покушајте поново.
@@ -1339,7 +1340,7 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Историја сакривања',
-'suppressionlogtext' => 'Ð\98Ñ\81под Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸ Ñ\81пиÑ\81ак Ð±Ñ\80иÑ\81аÑ\9aа Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа ÐºÐ¾Ñ\98и Ñ\83кÑ\99Ñ\83Ñ\87Ñ\83Ñ\98е Ñ\81адÑ\80жаÑ\98 Ñ\81акÑ\80ивен Ð¾Ð´ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а. Ð\9fогледаÑ\98Ñ\82е [[Special:BlockList|Ñ\81пиÑ\81ак Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\85 IP Ð°Ð´Ñ\80еÑ\81а]] Ð·Ð° Ð¿Ñ\80еглед Ð²Ð°Ð¶ÐµÑ\9bиÑ\85 Ð·Ð°Ð±Ñ\80ана Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа.',
+'suppressionlogtext' => 'Ð\98Ñ\81под Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸ Ñ\81пиÑ\81ак Ð±Ñ\80иÑ\81аÑ\9aа Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа ÐºÐ¾Ñ\98и Ñ\83кÑ\99Ñ\83Ñ\87Ñ\83Ñ\98е Ñ\81адÑ\80жаÑ\98 Ñ\81акÑ\80ивен Ð¾Ð´ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а. Ð¢ÐµÐºÑ\83Ñ\9bе Ð·Ð°Ð±Ñ\80ане Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ð°Ñ\9bи [[Special:BlockList|овде]].',
 
 # History merging
 'mergehistory' => 'Споји историје страница',
@@ -2311,6 +2312,11 @@ $1',
 'allpages-bad-ns' => '{{SITENAME}} нема именски простор „$1“.',
 'allpages-hide-redirects' => 'Сакриј преусмерења',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Гледате кеширану верзију ове странице, која може бити стара и до $1.',
+'cachedspecial-viewing-cached-ts' => 'Гледате кеширану верзију ове странице, која може да се разликује од тренутне.',
+'cachedspecial-refresh-now' => 'Погледај најновију.',
+
 # Special:Categories
 'categories' => 'Категоријe',
 'categoriespagetext' => '{{PLURAL:$1|Следећа категорија садржи|Следеће категорије садрже}} странице или датотеке.
@@ -2509,7 +2515,7 @@ $UNWATCHURL
 Погледајте ''$2'' за више детаља.",
 'dellogpage' => 'Дневник брисања',
 'dellogpagetext' => 'Испод је списак последњих брисања.',
-'deletionlog' => 'иÑ\81Ñ\82оÑ\80иÑ\98а брисања',
+'deletionlog' => 'Ð\94невник брисања',
 'reverted' => 'Враћено на ранију измену',
 'deletecomment' => 'Разлог:',
 'deleteotherreason' => 'Други/додатни разлог:',
@@ -2760,7 +2766,7 @@ $1',
 'badipaddress' => 'Неисправна IP адреса',
 'blockipsuccesssub' => 'Блокирање је успело',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.<br />
\9fогледаÑ\98Ñ\82е [[Special:BlockList|Ñ\81пиÑ\81ак Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\85 Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а]] Ð·Ð° Ð¿Ñ\80еглед Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа.',
\91локиÑ\80аÑ\9aа Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ð¾Ð³Ð»ÐµÐ´Ð°Ñ\82е [[Special:BlockList|овде]].',
 'ipb-blockingself' => 'Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?',
 'ipb-confirmhideuser' => 'Управо ћете блокирати корисника с укљученом могућношћу „сакриј корисника“. Овим ће корисничко име бити сакривено у свим списковима и извештајима. Желите ли то да урадите?',
 'ipb-edit-dropdown' => 'Уреди разлоге блокирања',
@@ -2815,7 +2821,7 @@ $1',
 'reblock-logentry' => '{{GENDER:|је променио|је променила|је променио}} подешавања за блокирање {{GENDER:$1|корисника|кориснице|корисника}} [[$1]] с роком истека од $2 ($3)',
 'blocklogtext' => 'Ово је дневник блокирања и деблокирања корисника.
 Аутоматски блокиране ИП адресе нису наведене.
\9fогледаÑ\98Ñ\82е [[Special:BlockList|Ñ\81пиÑ\81ак Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\85 Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а]].',
¢ÐµÐºÑ\83Ñ\9bе Ð·Ð°Ð±Ñ\80ане Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ð°Ñ\9bи [[Special:BlockList|овде]].',
 'unblocklogentry' => '{{GENDER:|је деблокирао|је деблокирала|је деблокирао}} „$1“',
 'block-log-flags-anononly' => 'само анонимни корисници',
 'block-log-flags-nocreate' => 'онемогућено отварање налога',
@@ -3154,7 +3160,7 @@ $1',
 'tooltip-watchlistedit-raw-submit' => 'Ажурирај списак',
 'tooltip-recreate' => 'Поново направите страницу иако је обрисана',
 'tooltip-upload' => 'Започните отпремање',
-'tooltip-rollback' => 'â\80\9eÐ\92Ñ\80аÑ\82иâ\80\9c Ð¿Ð¾Ð½Ð¸Ñ\88Ñ\82ава Ð¿Ð¾Ñ\81ледÑ\9aÑ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81 Ñ\98едним ÐºÐ»Ð¸ÐºÐ¾Ð¼',
+'tooltip-rollback' => '„Врати“ поништава последњу измену ове странице једним кликом',
 'tooltip-undo' => 'Враћа ову измену и отвара образац за уређивање.',
 'tooltip-preferences-save' => 'Сачувај поставке',
 'tooltip-summary' => 'Унесите кратак опис',
@@ -3912,7 +3918,7 @@ $5
 
 # Delete conflict
 'deletedwhileediting' => "'''Упозорење''': ова страница је обрисана након што сте почели с уређивањем!",
-'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|је обрисао}} ову страницу након што сте почели да је уређујете, са следећим разлогом:
+'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете, са следећим разлогом:
 : ''$2''
 Потврдите да стварно желите да направите страницу.",
 'confirmrecreate-noreason' => 'Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.',
@@ -4107,6 +4113,9 @@ $5
 'version-software' => 'Инсталирани софтвер',
 'version-software-product' => 'Производ',
 'version-software-version' => 'Верзија',
+'version-entrypoints' => 'Адресе улазне тачке',
+'version-entrypoints-header-entrypoint' => 'Улазна тачка',
+'version-entrypoints-header-url' => 'Адреса',
 
 # Special:FilePath
 'filepath' => 'Путања датотеке',
@@ -4295,4 +4304,15 @@ $5
 'api-error-uploaddisabled' => 'Отпремање је онемогућено на овом викију.',
 'api-error-verification-error' => 'Датотека је оштећена или има неисправан наставак.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунд|секунде|секунди}}',
+'duration-minutes' => '$1 {{PLURAL:$1|минут|минута|минута}}',
+'duration-hours' => '$1 {{PLURAL:$1|сат|сата|сати}}',
+'duration-days' => '$1 {{PLURAL:$1|дан|дана|дана}}',
+'duration-weeks' => '$1 {{PLURAL:$1|недеља|недеље|недеља}}',
+'duration-years' => '$1 {{PLURAL:$1|година|године|година}}',
+'duration-decades' => '$1 {{PLURAL:$1|деценија|деценије|деценија}}',
+'duration-centuries' => '$1 {{PLURAL:$1|век|века|векова}}',
+'duration-millennia' => '$1 {{PLURAL:$1|миленијум|миленијума|миленијума}}',
+
 );
index 5444e2b..42f3ac5 100644 (file)
@@ -1000,7 +1000,7 @@ Prilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:F
 'updated' => '(Ažurirano)',
 'note' => "'''Napomena:'''",
 'previewnote' => "'''Imajte u vidu da je ovo samo pregled.'''
-Vaše izmene još nisu sačuvane! [[#editform|→ Nastavi s uređivanjem]]",
+Vaše izmene još nisu sačuvane!",
 'previewconflict' => 'Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.',
 'session_fail_preview' => "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''
 Pokušajte ponovo.
@@ -2414,7 +2414,7 @@ Potvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{Med
 Pogledajte ''$2'' za više detalja.",
 'dellogpage' => 'Dnevnik brisanja',
 'dellogpagetext' => 'Ispod je spisak poslednjih brisanja.',
-'deletionlog' => 'istorija brisanja',
+'deletionlog' => 'Dnevnik brisanja',
 'reverted' => 'Vraćeno na raniju izmenu',
 'deletecomment' => 'Razlog:',
 'deleteotherreason' => 'Drugi/dodatni razlog:',
index 515b1b6..ea688e3 100644 (file)
@@ -74,8 +74,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Antaal fon do beooboachtjende Benutsere anwiese',
 'tog-oldsig' => 'Foarbekiek fon ju aktuälle Signatuur:',
 'tog-fancysig' => 'Unnerskrift as Wikitext behonnelje (sunner automatiske Ferlinkenge)',
-'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
-[//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
+'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide. [//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
 'tog-externaldiff' => 'Extern Diff-Program as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
  [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatione hiertou.])',
 'tog-showjumplinks' => '"Wikselje tou"-Links muugelk moakje',
index 8835b74..b33a220 100644 (file)
@@ -44,6 +44,7 @@
  * @author StefanB
  * @author Steinninn
  * @author Str4nd
+ * @author Thurs
  * @author Tobulos1
  * @author VickyC
  * @author Where next Columbus
@@ -358,7 +359,7 @@ $messages = array(
 'tog-watchlisthidepatrolled' => 'Göm patrullerade redigeringar från bevakningslistan',
 'tog-nolangconversion' => 'Konvertera inte mellan språkvarianter',
 'tog-ccmeonemails' => 'Skicka kopior till mig av e-post jag skickar till andra användare',
-'tog-diffonly' => 'Visa inte sidinnehåll under differenser',
+'tog-diffonly' => 'Visa inte sidinnehåll under diffar',
 'tog-showhiddencats' => 'Visa dolda kategorier',
 'tog-noconvertlink' => 'Stäng av konvertering av sidtitlar',
 'tog-norollbackdiff' => 'Visa inte diff efter tillbakarullning',
@@ -676,8 +677,8 @@ Den kanske redan har raderats av någon annan.',
 'badtitle' => 'Felaktig titel',
 'badtitletext' => 'Den begärda sidtiteln är antingen ogiltig eller tom, eller så är titeln felaktigt länkad från en annan wiki.
 Den kan innehålla ett eller flera tecken som inte får användas i sidtitlar.',
-'perfcached' => 'Följande data är cachad och är möjligtvis inte helt uppdaterad. Maximalt {{PLURAL:$1|ett|$1}} restultat finns {{PLURAL:$1|tillgängligt|tillgängliga}} i cachen.',
-'perfcachedts' => 'Sidan är hämtad ur ett cacheminne och uppdaterades senast $1. Maximalt {{PLURAL:$4|ett|$4}} restultat finns {{PLURAL:$4|tillgängligt|tillgängliga}} i cachen.',
+'perfcached' => 'Följande data är cachad och är möjligtvis inte helt uppdaterad. Maximalt {{PLURAL:$1|ett|$1}} resultat finns {{PLURAL:$1|tillgängligt|tillgängliga}} i cachen.',
+'perfcachedts' => 'Sidan är hämtad ur ett cacheminne och uppdaterades senast $1. Maximalt {{PLURAL:$4|ett|$4}} resultat finns {{PLURAL:$4|tillgängligt|tillgängliga}} i cachen.',
 'querypage-no-updates' => 'Uppdatering av den här sidan är inte aktiverad. Datan kommer i nuläget inte att uppdateras.',
 'wrong_wfQuery_params' => 'Felaktiga parametrar för wfQuery()<br /> Funktion: $1<br /> Förfrågan: $2',
 'viewsource' => 'Visa wikitext',
@@ -983,7 +984,8 @@ Den har inte sparats än!'''",
 'updated' => '(Uppdaterad)',
 'note' => "'''Obs!'''",
 'previewnote' => "'''Kom ihåg att detta bara är en förhandsvisning.'''
-Dina ändringar har ännu inte sparats! [[#editform|→ Fortsätt redigera]]",
+Dina ändringar har ännu inte sparats!",
+'continue-editing' => 'Fortsätt redigera',
 'previewconflict' => 'Den här förhandsvisningen är resultatet av den
 redigerbara texten ovanför,
 så som det kommer att se ut om du väljer att spara.',
@@ -1080,6 +1082,10 @@ Dessa parametrar har uteslutits.',
 'parser-template-loop-warning' => 'Mall-loop upptäckt: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Gräns för mallrekursionsdjup överskriden ($1)',
 'language-converter-depth-warning' => 'Gräns för språkkonverteringsdjup överskriden ($1)',
+'node-count-exceeded-category' => 'Sidor där antal nodar har överskrids',
+'node-count-exceeded-warning' => 'Sidan har överskridit antalet nodar',
+'expansion-depth-exceeded-category' => 'Sidor där expansionsdjupet överskrids',
+'expansion-depth-exceeded-warning' => 'Sidan överskrider expansionsdjupet',
 
 # "Undo" feature
 'undo-success' => 'Redigeringen kan göras ogjord.
@@ -1226,7 +1232,7 @@ Vänligen kontrollera loggarna.',
 # Suppression log
 'suppressionlog' => 'Undanhållandelogg',
 'suppressionlogtext' => 'Nedan visas en lista över raderingar och blockeringar som berör innehåll dolt för administratörer.
-Se [[Special:BlockList|IP-blockeringslistan]] för listan över gällande blockeringar.',
+Se [[Special:BlockList|blockeringslistan]] för listan över gällande blockeringar.',
 
 # History merging
 'mergehistory' => 'Sammanfoga sidhistoriker',
@@ -2169,6 +2175,11 @@ Du kan avgränsa sökningen och få färre träffar genom att ange typ av logg,
 'allpages-bad-ns' => 'Namnrymden "$1" finns inte på {{SITENAME}}.',
 'allpages-hide-redirects' => 'Göm omdirigeringar',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du visar en cachad version av denna sida, som kan vara upp till $1 gammal.',
+'cachedspecial-viewing-cached-ts' => 'Du visar en cachad version av denna sida, som kanske inte är helt aktuell.',
+'cachedspecial-refresh-now' => 'Visa senaste.',
+
 # Special:Categories
 'categories' => 'Kategorier',
 'categoriespagetext' => 'Följande {{PLURAL:$1|kategori|kategorier}} innehåller sidor eller media.
@@ -2603,8 +2614,8 @@ Ange orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).',
 'ipb-confirm' => 'Bekräfta blockering',
 'badipaddress' => 'Du har inte skrivit IP-adressen korrekt.',
 'blockipsuccesssub' => 'Blockeringen är utförd',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] har blockerats.
-<br />För att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] har blockerats.<br />
+För att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].',
 'ipb-blockingself' => 'Du håller på att blockera dig själv! Är du säker på att du vill göra det?',
 'ipb-confirmhideuser' => 'Du är på väg att blockera en användare med "göm användare" aktiverat. Detta kommer upphäva användarens namn i alla listor och loggar. Är du säker på att du vill göra det?',
 'ipb-edit-dropdown' => 'Redigera blockeringsanledningar',
@@ -2659,7 +2670,7 @@ Undanhållandeloggen visas nedan för referens:',
 'reblock-logentry' => 'ändrade blockeringsinställningar för [[$1]] med en varaktighet på $2 $3',
 'blocklogtext' => 'Detta är en logg över blockeringar och avblockeringar.
 Automatiskt blockerade IP-adresser listas ej.
-I [[Special:BlockList|blockeringslistan]] listas alla IP-adresser och användare som är blockerade för närvarande.',
+Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blockeringar.',
 'unblocklogentry' => 'tog bort blockering av "$1"',
 'block-log-flags-anononly' => 'bara oinloggade',
 'block-log-flags-nocreate' => 'hindrar kontoregistrering',
@@ -3765,6 +3776,9 @@ Du bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Publi
 'version-software' => 'Installerad programvara',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'StartpunktsURLer',
+'version-entrypoints-header-entrypoint' => 'Ingångspunkt',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Sökväg till fil',
@@ -3953,4 +3967,15 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'api-error-uploaddisabled' => 'Uppladdning är inaktiverad på denna wiki.',
 'api-error-verification-error' => 'Denna fil kan vara skadad eller har fel filändelse.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minuter}}',
+'duration-hours' => '$1 {{PLURAL:$1|timme|timmar}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dagar}}',
+'duration-weeks' => '$1 {{PLURAL:$1|vecka|veckor}}',
+'duration-years' => '$1 {{PLURAL:$1|år|år}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennium|decennier}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sekel|sekel}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
+
 );
index 82cf9cf..484b493 100644 (file)
@@ -799,7 +799,7 @@ Kumbuka kwamba desturi ya kurasa za .css na .js hutumia herufi ndogo, yaani, {{n
 'updated' => '(Imesasishwa)',
 'note' => "'''Taarifa:'''",
 'previewnote' => "'''Hii ni hakikisho tu.''' 
-Mabadiliko hayajahifadhiwa bado! [[#editform|→ Endelea kuhariri]]",
+Mabadiliko hayajahifadhiwa bado!",
 'previewconflict' => 'Hakikisho hii inaonyesha maandiko yaliyopo sanduku la juu yataonekayo ukiyahifadhi.',
 'session_fail_preview' => "'''Pole! Hatukuweza kuhifadhi sahihisho lako kwa sababu data za kipindi zilipotelewa.'''
 Tafadhali jaribu tena.
index b674c0d..ceefcc5 100644 (file)
@@ -215,7 +215,7 @@ $messages = array(
 'mytalk' => 'என் பேச்சு',
 'anontalk' => 'இந்த ஐ.பி. முகவரிக்கான பேச்சு',
 'navigation' => 'வழிசெலுத்தல்',
-'and' => '&#32;மற்றும்',
+'and' => ' மற்றும்',
 
 # Cologne Blue skin
 'qbfind' => 'கண்டுபிடி',
@@ -725,7 +725,7 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'userinvalidcssjstitle' => "'''எச்சரிக்கை:'''  \"\$1\" என்றப் பெயரில் தோல்லொறுக் கிடையாது. சி.எஸ்.எஸ் மற்றும் ஜெ.எஸ். பக்கங்கள் ஆங்கில கீழ் வரிசைப் பெயர்களைக் கொண்டிருக்க வேண்டும் என்பதைக் கவனிக்கவும். எ+கா: {{ns:user}}:Foo/vector.css என்பது சரியான வடிவம் {{ns:user}}:Foo/Vector.css என்பது பிழையான வடிவம்.",
 'updated' => '(இற்றைப்படுத்தப்பட்டது)',
 'note' => "'''குறிப்பு:'''",
-'previewnote' => "'''இது ஒரு முன்தோற்றம் மட்டுமே, உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை!'''",
+'previewnote' => "'''இது ஒரு முன்தோற்றம் மட்டுமே''', உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை!",
 'previewconflict' => 'இந்த முன்தோற்றம் உரை தொகுப்புப் பகுதியின் மேற்பகுதியிலுள்ள உரையைப் பிரதிபலிக்கின்றது. நீங்கள் இப்பொழுது சேமித்தால் மேற்படி தோற்றமே கிடைக்கும்.',
 'session_fail_preview' => "'''உங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் உங்கள் தொகுப்பை செயற்படுத்த முடியவில்லை. அருள் கூர்ந்து மீண்டும் முயலவும். அதுவும் பலனளிக்காவிட்டால் விடுபதிகைச் செய்து மீண்டும் புகுபதிகைச் செய்யவும்'''",
 'session_fail_preview_html' => "'''மன்னிக்கவும்! தங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் தொகுப்பைச் செயற்படுத்த முடியவில்லை.'''
@@ -736,6 +736,7 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'token_suffix_mismatch' => "'''உங்கள் தொகுப்பினுள் சேவையாளர் நிறுத்தக்குறியீடுகளை செறுகியுள்ளனதன் காரணமாக உங்களது தொகுப்பு நிராகரிக்கப்பட்டுள்ளது. இது வலைத்தளத்தை மையமாகக் கொண்ட அடையாளம் காட்டாத புரொக்சி சேவைகளிலிருந்து தொகுக்கும் போது ஏற்படலாம்.'''",
 'edit_form_incomplete' => 'இந்த திருத்து படிவத்தின் சில பகுதிகள் SERVER ஐ சென்றடையவில்லை;ஒருமுறைக்கு இருமுறை  உங்கள் திருத்தங்களை சரிபார்த்து  மீண்டும் முயற்சிக்கவும்.',
 'editing' => '$1 தொகுக்கப்படுகிறது',
+'creating' => '$1 உருவாக்கம்',
 'editingsection' => 'தொகுப்பு $1 (பிரிவு)',
 'editingcomment' => '$1 தொகுக்கப்படுகிறது (புதிய பிரிவு)',
 'editconflict' => 'முரண்பாடுகளைத் தொகுக்கவும்: $1',
@@ -1175,7 +1176,7 @@ $1",
 'prefs-help-gender' => 'விருப்பத் தேர்வுதான்: ஒருவரைக் குறிப்பிடும்பொழுது, அவருடைய பால் சரியானதாக இருக்க மென்கலம் பயன்படுத்தும் தகவல். இத்தகவல் பொதுவில் கிடைக்கும்படி இனி இருக்கும்.',
 'email' => 'மின்னஞ்சல்',
 'prefs-help-realname' => 'உண்மையான பெயர் கட்டாயமற்றது. நீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.',
-'prefs-help-email' => 'மின்னஞ்சல் விருப்பத்தின் பேரில் ஆனால் உங்கள் கடவுச்சொல் உங்களுக்கு நினைவில்லையென்றால், புதிய கடவுச்சொல் ஒன்றை மின்னஞ்சல் மூலம் அனுப்ப வழிசெய்யும்.மேலும் உங்கள் பயனர் பக்கம் அல்லது பயனர் பேச்சுப் பக்கத்தில் இருந்து மற்ற பயனர்கள் உங்களுக்கு மின்னஞ்சல் அனுப்ப உதவும். எனினும் உங்கள் மின்னஞ்சல் முகவரி வெளிப்படுத்தப்பட மாட்டாது.',
+'prefs-help-email' => 'மின்னஞ்சல் விருப்பத் தேர்வு,  ஆனால் உங்கள் கடவுச்சொல் உங்களுக்கு நினைவில்லையென்றால், புதிய கடவுச்சொல்லை மீட்டமைக்க தேவைப்படும்.',
 'prefs-help-email-others' => 'உங்கள் பேச்சுப் பக்கத்தில் உள்ள இணைப்பு மூலம் பிற பயனர்கள் உங்களுக்கு மின்னஞ்சல் அனுப்புதலை நீங்கள் தெரிவு செய்யலாம். பிற பயனர்கள் உங்களைத் தொடர்பு கொள்ளும் அதே வேளையில் உங்கள் மின்னஞ்சல் முகவரி வெளிப்படுத்தப்பட மாட்டாது.',
 'prefs-help-email-required' => 'மின்னஞ்சல் முகவரி தேவை.',
 'prefs-info' => 'அடிப்படைச் செய்தி',
@@ -1858,6 +1859,9 @@ $1',
 'allpagesbadtitle' => 'கொடுக்கப்பட்ட தலைப்பு செல்லுபடியற்றது அல்லது பிழையான விக்கியிடை அல்லது மொழி முன்னொட்டைக் கொண்டுள்ளது. இது தலைப்புக்களில் பயன்படுத்த முடியாத எழுத்துக்களையும் கொண்டிருக்கலாம்.',
 'allpages-bad-ns' => '{{SITENAME}} தளத்தில் "$1" பெயர்வெளி கிடையாது.',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'அண்மையான பதிப்பை காண்க',
+
 # Special:Categories
 'categories' => 'பகுப்புகள்',
 'categoriespagetext' => 'கீழே கொடுத்துள்ள பக்கங்கள் அல்லது ஊடகங்கள் இந்த {{PLURAL:$1|பகுப்பை|பகுப்புக்களை}} கொண்டுள்ளது.
@@ -2770,7 +2774,8 @@ $1',
 'metadata-help' => 'இந்தக் கோப்பு கூடுதலான தகவல்களைக் கொண்டுளது, இவை பெரும்பாலும் இக்கோப்பை உருவாக்கப் பயன்படுத்திய எண்ணிம ஒளிப்படக்கருவி அல்லது ஒளிவருடியால் சேர்க்கப்பட்டிருக்கலாம். இக்கோப்பு ஏதாவது வகையில் மாற்றியமைக்கப்பட்டிருந்தால் இத்தகவல்கள் அவற்றைச் சரிவர தராமல் இருக்கலாம்.',
 'metadata-expand' => 'மேலதிகத் தகவல்களைக் காட்டு',
 'metadata-collapse' => 'மேலதிகத் தகவல்களை மறை',
-'metadata-fields' => 'இங்கே காட்டப்பட்டுள்ள எக்சிப் மேல்நிலைத் தரவுகள் படிமவிளக்கப்பக்கத்தில் காட்டப்படும். ஏனைய தரவுகள் இயல்பிருப்பாக மறைக்கப்பட்டிருக்கும்.
+'metadata-fields' => 'இங்கே காட்டப்பட்டுள்ள எக்சிப் மேல்நிலைத் தரவுகள் படிமவிளக்கப்பக்கத்தில் மேல்நிலைத் தரவுகள் அட்டவணை மறைக்கப்பட்டிருக்கும் பொழுது
+ காட்டப்படும்.
 * make
 * model
 * datetimeoriginal
@@ -3336,7 +3341,7 @@ $5
 'version-variables' => 'மாறிகள்',
 'version-antispam' => ' குப்பை (spam) தடுப்பு',
 'version-skins' => 'தோல்கள்',
-'version-other' => 'மறà¯\8dறவà¯\88',
+'version-other' => 'பிறரà¯\8d',
 'version-mediahandlers' => 'ஊடக கையாளிகள்',
 'version-hooks' => 'கொக்கிகள்',
 'version-extension-functions' => 'நீட்சி செயற்பாடுகள்',
@@ -3347,13 +3352,14 @@ $5
 'version-version' => '(பதிப்பு $1)',
 'version-license' => 'அனுமதி',
 'version-poweredby-credits' => "இந்த் விக்கி '''[//www.mediawiki.org/ MediaWiki]''' இதன் மூலம் வழங்கப்படுகிறது, காப்புரிமை © 2001-$1 $2.",
-'version-poweredby-others' => 'மறà¯\8dறவà¯\88à®\95ள்',
+'version-poweredby-others' => 'பிறர்',
 'version-license-info' => 'மீடியாவிக்கியானது இலவச மென்பொருள்.இதை நீங்கள் மற்றவர்களுக்கு கொடுப்பது அல்லது திருத்தம் செய்வது இலவச மென்பொருள் அறக்கட்டளை வழங்கிய   GNUவின் பொது உரிம விதிகளுக்குட்பட்டது;உரிமத்தின் இரண்டாவது பதிப்பு அல்லது அதற்கு மேற்பட்ட பதிப்பு (உங்கள் விருப்பத்திற்க்கேற்றவாறு).
 மீடியா உபயோகப்படக்கூடியது என்ற நம்பிக்கையில் வெளியிடப்பட்டுள்ளது, ஆனால் இதற்க்கு உத்தரவாதம் கிடையாது.மேலும் வணிகத்தன்மைக்கான அல்லது ஒரு குறிப்பிட்ட செயலுக்காகவும் உத்தரவாதம் கிடையாது.மேலும் விவரங்களுக்கு GNU பொது உரிமத்தை பார்க்கவும்.
 நீங்கள் இந்த  மென்பொருளுடன் [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] பெற்றீருப்பிர்கள்;இல்லையெனில் , Free Software Foundation, Inc.,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA க்கு எழுதவும்.அல்லது [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
 'version-software' => 'நிறுவப்பட்ட மென்பொருள்',
 'version-software-product' => 'உற்பத்திப்பொருள்',
 'version-software-version' => 'பதிப்பு',
+'version-entrypoints-header-url' => 'உரலி (URL)',
 
 # Special:FilePath
 'filepath' => 'கோப்பு வழி',
@@ -3457,7 +3463,7 @@ $5
 'sqlite-no-fts' => '$1 முழு-உரை தேடல் ஆதரவு இல்லாமல்',
 
 # New logging system
-'logentry-delete-delete' => 'பக்கம் $3 ஐ $1 நீக்கினார்',
+'logentry-delete-delete' => '$3 பக்கத்தை $1 நீக்கினார்',
 'logentry-delete-restore' => '$1 பயனரால் $3 பக்கம் மீட்டமைக்கப்பட்டது',
 'logentry-delete-event' => '$1 மாற்றிய காட்சித்தன்மை  {{PLURAL:$5| ஒரு நிகழ்வு குறிப்பேடு| $5  நிகழ்வுகள் குறிப்பேடு}} இதில்   $3 :$4',
 'logentry-delete-revision' => '$1 மாற்றப்பட்ட  காட்சித்தன்மைக்கு  {{PLURAL:$5| ஒருபரிசீலனை| $5  பரிசீலனைகளுக்கும்}} இந்த பக்கம்  $3 :$4',
index 68af6ea..07d026f 100644 (file)
@@ -657,6 +657,7 @@ $2',
 'passwordreset-disabled' => 'ఈ వికీలో సంకేతపదాల మార్పును అచేతనం చేసాం.',
 'passwordreset-pretext' => '{{PLURAL:$1||డేటా శకలాల్లోంచి ఒకదాన్ని ఇవ్వండి}}',
 'passwordreset-username' => 'వాడుకరిపేరు:',
+'passwordreset-domain' => 'డొమైన్:',
 'passwordreset-email' => 'ఈ-మెయిలు చిరునామా:',
 'passwordreset-emailtitle' => '{{SITENAME}}లో ఖాతా వివరాలు',
 'passwordreset-emailtext-ip' => 'ఎవరో (బహుశా మీరే, ఐపీ అడ్రసు $1 నుంచి)  {{SITENAME}} ($4) లో మీ ఖాతా వివరాలను చెప్పమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}
@@ -795,8 +796,8 @@ $2
 అభిమత .css మరియు .js పుటల శీర్షికలు ఇంగ్లీషు చిన్నబడి అక్షరాల లోనే ఉండాలని గుర్తుంచుకోండి, ఉదాహరణకు ఇలా {{ns:user}}:Foo/vector.css అంతేగానీ, {{ns:user}}:Foo/Vector.css ఇలా కాదు.",
 'updated' => '(నవీకరించబడింది)',
 'note' => "'''గమనిక:'''",
-'previewnote' => "'''ఇది మునుజూపు మాత్రమే;
-మారà±\8dà°ªà±\81లని à°\87à°\82à°\95à°¾ à°­à°¦à±\8dరపరà°\9aà°²à±\87à°¦à±\81!'''",
+'previewnote' => "'''ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.'''
+à°®à±\80 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\87à°\82à°\95à°¾ à°­à°¦à±\8dరమవà±\8dవలà±\87à°¦à±\81!",
 'previewconflict' => 'భద్రపరచిన తరువాత పై టెక్స్ట్‌ ఏరియాలోని టెక్స్టు ఇలాగ కనిపిస్తుంది.',
 'session_fail_preview' => "'''క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.'''
 దయచేసి మళ్ళీ ప్రయత్నించండి.
@@ -1893,6 +1894,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'allpagesprefix' => 'ఈ ఆదిపదం కలిగిన పేజీలను చూపించు:',
 'allpagesbadtitle' => 'మీరిచ్చిన పేజీ పేరు సరైనది కాకపోయి ఉండాలి లేదా దానికి భాషాంతర లేదా అంతర్వికీ ఆదిపదమైనా ఉండి ఉండాలి. పేర్లలో వాడకూడని కారెక్టర్లు ఆ పేరులో ఉండి ఉండవచ్చు.',
 'allpages-bad-ns' => '{{SITENAME}} లో "$1" అనే నేమ్&zwnj;స్పేస్ లేదు.',
+'allpages-hide-redirects' => 'దారిమార్పులను దాచు',
 
 # Special:Categories
 'categories' => 'వర్గాలు',
@@ -3491,6 +3493,7 @@ $5
 # API errors
 'api-error-badaccess-groups' => 'ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.',
 'api-error-empty-file' => 'మీరు దాఖలుచేసిన ఫైల్ ఖాళీది.',
+'api-error-emptypage' => 'కొత్త మరియు ఖాళీ పేజీలను సృష్టించడానికి అనుమతి లేదు.',
 'api-error-filename-tooshort' => 'దస్త్రపు పేరు మరీ చిన్నగా ఉంది.',
 'api-error-filetype-banned' => 'ఈ రకపు దస్త్రాలని నిషేధించారు.',
 'api-error-http' => 'అంతర్గత దోషము: సేవకానికి అనుసంధానమవలేకపోతున్నది.',
@@ -3505,4 +3508,15 @@ $5
 'api-error-uploaddisabled' => 'ఈ వికీలో ఎక్కింపులని అచేతనం చేసారు.',
 'api-error-verification-error' => 'ఈ ఫైల్ పాడైవుండవచ్చు, లేదా తప్పుడు పొడిగింతను కలిగివుండవచ్చు.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|క్షణం|క్షణాలు}}',
+'duration-minutes' => '$1 {{PLURAL:$1|నిమిషం|నిమిషాలు}}',
+'duration-hours' => '$1 {{PLURAL:$1|గంట|గంటలు}}',
+'duration-days' => '$1 {{PLURAL:$1|రోజు|రోజులు}}',
+'duration-weeks' => '$1 {{PLURAL: $1|వారం|వారాలు}}',
+'duration-years' => '$1 {{PLURAL:$1|సంవత్సరం|సంవత్సరాలు}}',
+'duration-decades' => '$1 {{PLURAL:$1|దశాబ్దం|దశాబ్దాలు}}',
+'duration-centuries' => '$1 {{PLURAL:$1|శతాబ్దం|శతాబ్దాలు}}',
+'duration-millennia' => '$1 {{PLURAL:$1|సహస్రాబ్దం|సహస్రాబ్దాలు}}',
+
 );
index f0915d8..f43a031 100644 (file)
@@ -346,7 +346,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
 'newarticle' => '(Foun)',
 'noarticletext' => "Iha momentu lá'os testu iha pájina ne'e, bele [[Special:Search/{{PAGENAME}}|buka naran pájina nian]] iha pájina seluk, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], ka [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita pájina ne'e]</span>.",
 'previewnote' => "'''Ne'e de'it pájina ba kontrola.'''
-Ita-nia mudansa la armazenadu seidauk! [[#editform|→ Nafatin edita]]",
+Ita-nia mudansa la armazenadu seidauk!",
 'editing' => 'Edita $1',
 'editingsection' => 'Edita $1 (seksaun)',
 'editingcomment' => 'Edita $1 (seksaun foun)',
index f26f2f0..9cdf5d1 100644 (file)
@@ -830,6 +830,7 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 ในบางครั้งปัญหานี้จะเกิดขึ้นถ้าคุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
 'edit_form_incomplete' => "'''บางส่วนของแบบฟอร์มแก้ไขไม่ได้ติดต่อเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังคงอยู่และลองใหม่อีกครั้ง'''",
 'editing' => 'กำลังแก้ไข $1',
+'creating' => 'สร้างหน้า $1',
 'editingsection' => 'กำลังแก้ไข $1 (เฉพาะส่วน)',
 'editingcomment' => 'กำลังแก้ไข $1 (หัวข้อใหม่)',
 'editconflict' => 'แก้ไขชนกัน: $1',
@@ -951,7 +952,7 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 [[Special:Search|ค้นหาในวิกินี้]] สำหรับหน้าอื่นที่อาจเกี่ยวข้อง',
 
 # Revision deletion
-'rev-deleted-comment' => '(à¸\84วามà¹\80หà¹\87à¸\99ถูกลบออก)',
+'rev-deleted-comment' => '(à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อถูกลบออก)',
 'rev-deleted-user' => '(ชื่อผู้ใช้ถูกลบออก)',
 'rev-deleted-event' => '(หน้าที่ใส่เข้ามาถูกลบออก)',
 'rev-deleted-user-contribs' => '[ชื่อผู้ใช้หรือหมายเลขไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]',
index 48ab680..63941d5 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Amire80
  * @author Cekli829
  * @author Flrn
  * @author Hanberke
@@ -445,6 +446,7 @@ Hasabyňyz açyldy.
 'createaccount' => 'Täze hasap aç',
 'gotaccount' => "Eýýäm hasap açdyňyzmy? '''$1'''.",
 'gotaccountlink' => 'Onda giriberiň!',
+'userlogin-resetlink' => 'Giriş maglumatlaryňyzy ýatdan çykardyňyzmy?',
 'createaccountmail' => 'e-poçta bilen',
 'createaccountreason' => 'Sebäp:',
 'badretype' => 'Girizen parollaryňyz biri-birine gabat gelmeýär.',
@@ -646,7 +648,7 @@ Salgylanmak üçin iň soňky blokirleme gündeligi ýazgysy aşakda berilýär:
 Hususy .css we .js sahypalarynyň setir harp bilen ýazylýandygyny ýatda saklaň, ýagny {{ns:user}}:Ulanyjy/Vector.css däl-de, eýsem {{ns:user}}:Ulanyjy/vector.css.",
 'updated' => '(Täzelenen)',
 'note' => "'''Bellik:'''",
-'previewnote' => "'''Bu bir ýöne deslapky syn. Üýtgeşmeleriňiz heniz ýazdyrylan däldir!'''",
+'previewnote' => "'''Ýatda saklaň, bu bir ýöne deslapky syn.''' Üýtgeşmeleriňiz heniz ýazdyrylan däldir!",
 'previewconflict' => 'Bu deslapky syn redaktirleme penjiresiniň üstünde ýerleşip, ol ýazdyran mahalyňyz sahypanyň nähili görünjekdigini görkezýär.',
 'session_fail_preview' => "'''Bagyşlaň! Sessiýa maglumatynyň ýitirilmegi zerarly serwer özgerdişiňizi işläp bilenok.'''
 Gaýtadan synanyşmagyňyzy haýyş edýäris.
@@ -1099,8 +1101,8 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 'prefs-help-gender' => 'Hökmany däl: programma tarapyndan ulanyjynyň jynsyna görä ýüzlenmek üçin ulanylýar. Bu maglumat köpçülige açyk boljakdyr.',
 'email' => 'E-poçta',
 'prefs-help-realname' => 'Hakyky at (hökmany däl): eger hakyky adyňyz berseňiz, onda eden işleriňiz görkezilende ulanyljakdyr.',
-'prefs-help-email' => 'E-poçta adresi hökmany däl; ýöne parolyňyz ýadyňyzdan çykan ýagdaýynda e-poçta adresiňize täze parol iberilmegine mümkinçilik berýär.
-Şeýle-de ol başga ulanyjylaryň ulanyjy we pikir alyşma sahypalaryňyzyň üsti bilen kimdigiňizi bilmezden siziň bilen habarlaşyp bilmeklerine şert döredýär.',
+'prefs-help-email' => 'E-poçta adresi hökmany däl, ýöne parolyňyz ýadyňyzdan çykan ýagdaýynda e-poçta adresiňize täze parol iberilmegine mümkinçilik berýär.',
+'prefs-help-email-others' => 'Ulanyjy ýa-da çekişme sahypaňyzdaky bir çykgydyň üsti bilen başga ulanyjylaryň size e-poçta ibermegine rugsat hem berip bilersiňiz. Başga ulanyjylar siziň bilen habarlaşan wagty e-poçta adresiňiz görkezilmez.',
 'prefs-help-email-required' => 'E-poçta adresi talap edilýär.',
 'prefs-info' => 'Esasy maglumat',
 'prefs-i18n' => 'Halkaralaşdyryş',
@@ -1518,7 +1520,7 @@ Bir sütüniň adyna tyklap sortirowkanyň tertibini üýtgedip bilersiňiz.',
 'filehist-filesize' => 'Faýl ölçegi',
 'filehist-comment' => 'Teswirleme',
 'filehist-missing' => 'Faýl ýok',
-'imagelinks' => 'Faýlyň çykgytlary',
+'imagelinks' => 'Faýlyň ulanylyşy',
 'linkstoimage' => 'Bu faýla çykgydy bar bolan {{PLURAL:$1|sahypa|$1 sahypa}}:',
 'linkstoimage-more' => '$1 gowrak {{PLURAL:$1|sahypa|sahypa}} bu faýla çykgyt berýär.
 Aşakdaky sanaw diňe şu faýla çykgyt berýän {{PLURAL:$1|ilkinji faýly |ilkinji $1 faýly}} görkezýär.
@@ -1683,7 +1685,7 @@ Ol indi [[$2]] sahypasyna gönükdirýär.',
 'listusers-editsonly' => 'Diňe özgerdiş eden ulanyjylary görkez',
 'listusers-creationsort' => 'Döredilen senesi boýunça tertiple',
 'usereditcount' => '$1 {{PLURAL:$1|özgerdiş|özgerdiş}}',
-'usercreated' => '$2, $1 senesinde döredildi',
+'usercreated' => '$2, $1 senesinde {{GENDER:$3|döredildi}}.',
 'newpages' => 'Täze sahypalar',
 'newpages-username' => 'Ulanyjy ady:',
 'ancientpages' => 'Iň köne sahypalar',
@@ -2094,6 +2096,7 @@ $1',
 'sp-contributions-newbies-title' => 'Täze hasaplar üçin ulanyjy goşantlary',
 'sp-contributions-blocklog' => 'Blokirleme gündeligi',
 'sp-contributions-deleted' => 'öçürilen ulanyjy goşantlary',
+'sp-contributions-uploads' => 'ýüklemeler',
 'sp-contributions-logs' => 'gündelikler',
 'sp-contributions-talk' => 'çekişme',
 'sp-contributions-userrights' => 'ulanyjy hukuklary dolandyryşy',
@@ -2590,7 +2593,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
 'metadata-help' => 'Bu faýlda, ähtimal, dijital fotoapparat ýa-da skaner tarapyndan goşulan goşmaça maglumatlar bardyr. Eger faýl soňradan redaktirlenen bolsa, onda käbir maglumatlar häzirki redaktirlenen faýly görä köneligine galan bolup biler.',
 'metadata-expand' => 'Jikme-jiklikleri görkez',
 'metadata-collapse' => 'Jikme-jiklikleri görkezme',
-'metadata-fields' => 'Bu habarlaşykda sanalýan EXIF meta-maglumat meýdançalary meta-maglumat tablisasy çöken mahaly surat görkeziş sahypalarynda ulanylýar. Galanlary gaýybana tertipde gizlenilýär.
+'metadata-fields' => 'Bu habarda sanalýan şekil meta-maglumat meýdançalary meta-maglumat tablisasy düýrlenen mahaly şekil sahypasynyň displeýine goşular. Galanlary gaýybana tertipde gizlenilýär.
 * make
 * model
 * datetimeoriginal
index 3d5997b..e418d08 100644 (file)
@@ -7,19 +7,28 @@
  * @ingroup Language
  * @file
  *
+ * @author Ganbarzada
+ * @author Tuzkozbir
  * @author Гусейн
  */
 
 $messages = array(
 # User preference toggles
+'tog-underline' => 'Линки жинтоно ријә быкәш:',
+'tog-justify' => 'Мәтни бә сәһифә кәно бәрабәр быкә.',
+'tog-hideminor' => 'Охоминә дәгишонәдә гәдә дәгишон нишо мәдә.',
+'tog-hidepatrolled' => 'Јохләмиш быә дәјишиклијон нышу мәдә.',
 'tog-newpageshidepatrolled' => 'Нијони огәтеј ноғо доә быә сәһифон бә тожә сәһифон сијоһиәдә',
+'tog-usenewrc' => 'Охоминә дәйишиклийон тәкмил версијә',
+'tog-numberheadings' => 'Автоматик башлығон нумрәләмиш быкә',
+'tog-showtoc' => 'Мындәриҹоти сијоһи нишо быдә (3 сәрловһәсә веј быә сәһифон)',
 'tog-watchcreations' => 'Зијод кардеј чымы офәјә быә сәһифон бә ноғо доә сијоһи',
 'tog-enotifwatchlistpages' => 'Ноғо доә сијоһиәдә сәһифон кејнә дәгиш бәбен бәмы е-номә бывығанд',
 'tog-watchlisthideown' => 'Чымы дәгишон ноғо доә сијһиәдә нијо кардеј',
 'tog-watchlisthideminor' => 'Нијо кардеј гәдә дәгишон ноғо доә сијоһиәдә',
 
 # Dates
-'sunday' => 'Ð\98Ñ\88анбә',
+'sunday' => 'Ð\98Ñ\88амбә',
 'monday' => 'Дышанбә',
 'tuesday' => 'Сешанбә',
 'wednesday' => 'Чошанбә',
@@ -78,16 +87,20 @@ $messages = array(
 'category-empty' => "''Ын категоријә бы дәғиғәдә тәјлије.''",
 'hidden-categories' => '{{PLURAL:$1|Нијони категоријә|Нијони категоријон}}',
 'hidden-category-category' => 'Нијони категоријон',
+'category-subcat-count' => '{{PLURAL:$2|Ым категоријә әнчәх жинтонә жинә категоријонку ибарәте.|Ҹәми $2 категоријонку {{PLURAL:$1|жинә категоријә|$1 жинә категоријә}} нишо доә быә.}}',
 'category-article-count' => '{{PLURAL:$2|Бы категоријәдә әнҹәх иглә сәһифәје.|Ҹәми $2 сәһифонку нишо доә быә {{PLURAL:$1|сәһифә|$1 сәһифә}} бы категоријәдә.}}',
 'category-article-count-limited' => 'Ын категоријәдә {{PLURAL:$1|$1 сәһифә|}} һесте.',
 'category-file-count' => '{{PLURAL:$2|Бы категоријәдә әнҹәх иглә фајле.|Ҹәми $2 фајлонку нишо доә быә {{PLURAL:$1|фајл|$1 фајл}} бы категоријәдә.}}',
 'category-file-count-limited' => 'Ын категоријәдә  {{PLURAL:$1|$1 фајл}} һесте.',
 'listingcontinuesabbrev' => '(дәвом карде)',
+'index-category' => 'Индекс быә сәһифон.',
+'noindex-category' => 'Индекс нибыә саһифон',
 
 'about' => 'Тәсвир',
 'article' => 'Мәғолә',
 'newwindow' => '(нујә пенҹәдә окардеј)',
 'cancel' => 'Ләғв кардеј',
+'moredotdotdot' => 'Веј...',
 'mypage' => 'Чымы сәһифә',
 'mytalk' => 'Чымы мызокирә сәһифә',
 'anontalk' => 'Бо ын IP-унвони мызокирә',
@@ -99,6 +112,7 @@ $messages = array(
 'qbbrowse' => 'Дијә кардеј',
 'qbedit' => 'Сәрост кардеј',
 'qbpageoptions' => 'Ым сәһифә',
+'qbpageinfo' => 'Мәзмун.',
 'qbmyoptions' => 'Чымы сәһифон',
 'qbspecialpages' => 'Хысусиә сәһифон',
 'faq' => 'РАП',
@@ -160,6 +174,8 @@ $messages = array(
 'userpage' => 'Иштирокәкә сәһифә дијә кардеј',
 'projectpage' => 'Нәхши сәһифә дијә кардеј',
 'imagepage' => 'Фајли сәһифә дијә кардеј',
+'mediawikipage' => 'Мәктуби сәһифә нишо быдә.',
+'templatepage' => 'Ғәлиби сәһифә нишо быдә.',
 'viewhelppage' => 'Араијш сәј',
 'categorypage' => 'Категоријон сәһифә дијә кардеј',
 'viewtalkpage' => 'Мызокирә дијә кардеј',
@@ -170,6 +186,7 @@ $messages = array(
 'jumpto' => 'Дәвардеј бә:',
 'jumptonavigation' => 'навигасијә',
 'jumptosearch' => 'нәве',
+'pool-timeout' => 'Че блоки чәш кардә вахт сәбе.',
 'pool-errorunknown' => 'Номәлумә сәһв',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
@@ -178,18 +195,22 @@ $messages = array(
 'copyrightpage' => '{{ns:project}}:Мыәллифә һуғуғ',
 'currentevents' => 'Есәтнә һодисон',
 'currentevents-url' => 'Project: Есәтнә һодисон',
-'disclaimers' => 'Ð\94еÑ\98ни Ð±Ó\99 Ð³Ð¸Ñ\98 Ð½Ñ\8bгÓ\99Ñ\82еÑ\98',
+'disclaimers' => 'ЧÑ\8b Ð¼Ó\99Ñ\81Ñ\83лиÑ\98Ñ\98Ó\99Ñ\82икÑ\83 Ð¸Ð¼Ñ\82ина.',
 'disclaimerpage' => 'Project:Дејни бә гиј ныгәтеј',
 'edithelp' => 'Арајиш бо редактә кардеј',
 'edithelppage' => 'Help:Арајиш бо сәрост кардеј',
 'helppage' => 'Help:Мындәриҹот',
-'mainpage' => 'Јолә сәһифә',
-'mainpage-description' => 'Јолә сәһифә',
+'mainpage' => 'Әсосә сәһифә',
+'mainpage-description' => 'Әсосә сәһифә',
+'policy-url' => 'Project:Ғајдон',
 'portal' => 'Ҹәмјәт',
 'portal-url' => 'Project:Ҹәмјәти портал',
 'privacy' => 'Мәхфијәти сијосәт',
 'privacypage' => 'Project:Мәхфијәти сијосәт',
 
+'badaccess' => 'Иҹазә хәта.',
+'badaccess-group0' => 'Ын фәалијјәти ичра карде әзынишон.',
+
 'ok' => 'OK',
 'retrievedfrom' => 'Сәвон "$1"',
 'youhavenewmessages' => 'Шымә сәјоне $1 ($2).',
@@ -223,14 +244,27 @@ $messages = array(
 
 # General errors
 'error' => 'Сәһв',
+'readonly' => 'Бә база нывыште блок быә.',
+'missing-article' => 'База мәлумотон дыләдә бә ахтар кардә быә саһифон «$1» $2 барәдә мәлумот пәјдо карде ныбе.
+Жыго вәзијјәт бе бәзне бә вахтики, ым сәһифә че рәдд кардә быә сәһифә канә рәвојәте.
+Гирәм ым жыго ни, жәгәдә шымә програм тәминатијәдә сәһв пәјдо кардәјоне.
+Хаһиш кардәмон че сәһифә URL-и бә [[Special:ListUsers/sysop|администратори]] бывғандәнән.',
 'missingarticle-rev' => '(рәвојәт#: $1)',
+'missingarticle-diff' => '(Фәрг: $1, $2)',
+'internalerror' => 'Дахили хәта',
+'internalerror_info' => 'Дахили хәта: $1',
+'fileappenderrorread' => 'Әлавон гејд карде быәдә"$1" һанде ныбе.',
+'formerror' => 'Хәта: Че формә мәлумотон әкс карде ғерри мумкуне.',
 'badtitle' => 'Роныдоә ном',
+'badtitletext' => 'Ахтар кардә быә сәһифә ном сәһве, тәјлије, јаанки сәрост доә быәнин мијонзывонон ја мијонвики номон.
+Бе бәзне ки кали рәмзон сәрловһәдә око дој әбыни.',
 'viewsource' => 'Дијә кардеј',
 
 # Login and logout pages
 'yourname' => 'Иштирокәкә ном:',
 'yourpassword' => 'Парол:',
 'yourpasswordagain' => 'Пароли сәнибәтон гырдә карде:',
+'remembermypassword' => 'Мыни ым компутерәдә јодәдә огәт (максимум $1 {{PLURAL:$1|руж|руж}})',
 'login' => 'Ыштәни едаштеј',
 'nav-login-createaccount' => 'Ыштәни едаштеј / ыштәни ғејд кардовнијеј',
 'loginprompt' => '{{SITENAME}}-әдә ыштәни едәште горнә, шымә бәбе бә «cookies» иҹозә быдән.',
@@ -309,14 +343,19 @@ $messages = array(
 Шымә бәзынејон [[Special:Search/{{PAGENAME}}|пәјдо кардеј конҹо ым ном һесте]] бә ҹо мәғолонәдә,
 јаанки <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналон ујғунә нывыштәјон пәјдо кардеј].</span>',
 'previewnote' => "'''Јодәдә огәтән ки ым һәлә сыфтәнә нишо доје.'''
-Шымә дәгишон һәлә огәтә быәнин! [[#editform|→ дәвом кардеј сәрост карде]]",
+Шымә дәгишон һәлә огәтә быәнин!",
 'editing' => 'Редәктә кардеј $1',
 'editingsection' => 'Редактә кардеј $1 (ғысм)',
 'yourtext' => 'Шымә мәтн',
 'templatesused' => '{{PLURAL:$1|Ғәлиб:|Ғәлибон}} есәтнә сәһифә истифодә кардејдә:',
 'template-protected' => '(Мыдофиә кардә быә)',
+'template-semiprotected' => 'тики муһафизә быә',
 'hiddencategories' => 'Ын сәһифә аидијотыш һесте бә {{PLURAL:$1|1 нијони категоријә|$1 нијони категоријон}}:',
 'permissionserrorstext-withaction' => "Шымәку ни иҹозә ба ым һәрәкәти «'''$2'''», бә жыго {{PLURAL:$1|сәбәби|сәбәбон}} горнә:",
+'recreate-moveddeleted-warn' => "''Дыггәт! Шымә нафко позулмуш быә сәһифон бәрпа кардеон пидә.'''
+
+Ым сәһифә чоәдәнә дуз карде зәруријјәти јохләмишкәнән.
+Жинтоно нышу доә быә бычи ым сәһифә позулмуш быә.",
 'moveddeleted-notice' => 'Ым сәһифә молә быә.
 Арајиши горнә жинтоно нишо доә быән чы сәһифә молә ијән ном дәгиш кардә нывыштәјон.',
 
@@ -324,6 +363,9 @@ $messages = array(
 'post-expand-template-inclusion-warning' => "'''Дығғәт:''' Дахыл кардә быә ғәлибон сәкыштә памјә ве јоле.
 Хәјли ғәлибон дахыл ныбабен.",
 'post-expand-template-inclusion-category' => 'Бо сәһифон дахыл кардә быә ғәлибон рәво зынә быә улгу бә кәно бешә',
+'post-expand-template-argument-warning' => "'''Дығғәт:''' Ым сәһифәдә ән ками иглә аргумент һесте, ә аргумент ки һәддиндән зијодә памјә һестыше бо окарде.
+Жыго аргументон вадоә быән.",
+'post-expand-template-argument-category' => 'Вадо быә ғәлибон аргументон огәтә сәһифон',
 
 # History pages
 'viewpagelogs' => 'Бо ым сәһифә журналон нишо дој',
@@ -338,8 +380,12 @@ $messages = array(
 'last' => 'навы.',
 'page_first' => 'иминә',
 'page_last' => 'охонә',
+'histlegend' => "Рәвојәтон выжнијеј: кон сәһифә рәвојәтон фәрғи виндеј пидәјоне нышон быжәнән ијән егәтән \"Enter\".<br />
+Изоһ: '''(исә)''' = де исәтнә рәвојәти фәрғ, '''(охо)''' = де навконә рәвојәти фәрғ, '''(г)''' = гәдә дәгиш.",
 'history-fieldset-title' => 'Тарыхи дијә кардеј',
 'history-show-deleted' => 'Әнҹәх рәдд кардә быән',
+'histfirst' => 'Ән канә',
+'histlast' => 'Охонәни',
 'historyempty' => '(тәјли)',
 
 # Revision feed
@@ -367,6 +413,7 @@ $messages = array(
 'lineno' => 'Сәтыр $1:',
 'compareselectedversions' => 'Сәчын кардә быә рәвојәтон мығојисә кардеј.',
 'editundo' => 'ләғв кардеј',
+'diff-multi' => '({{PLURAL:$2|Иглә истифадәчи|$2 истифадәчи}} тәрәфәдә кардә быә {{PLURAL:$1|иглә арә редактә|$1 арә редактә}} нушо додәни)',
 
 # Search results
 'searchresults' => 'Нәве нәтиҹон',
@@ -390,6 +437,7 @@ $messages = array(
 'searchprofile-everything-tooltip' => 'Һәммәј сәһифонәдә нәве (мызокирә сәһифонәдән)',
 'searchprofile-advanced-tooltip' => 'Бә асбардә быә номон мәкононәдә нәве',
 'search-result-size' => '$1 ({{PLURAL:$2|1 сыхан|$2 сыханон}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 елемент|$1 елементон}} ({{PLURAL:$2|$2 жинә категоријә$2 жинә категоријон }}, {{PLURAL:$3|$3 фајл|$3 фајлон}})',
 'search-redirect' => '(Унвони дәгиш кардеј  $1)',
 'search-section' => '(семонә $1)',
 'search-suggest' => 'Еһтимол шымә нәзәрәдә ым гәтејдәбијон: $1',
@@ -423,6 +471,7 @@ $messages = array(
 'yourlanguage' => 'Зывон:',
 'email' => 'E-номә',
 'prefs-help-email' => 'Е-номә унвони нывыштеј һукман ни, интаси ав бә шымә гәрәк бәбе гирам шымә пароли виро бебәкардејон.',
+'prefs-help-email-others' => 'Комәг бәка бә ҹо иштироәкон шымә е-номә унвони оныкарде, че шымә шәхси сәһифәдә быә линки де шымә әлогә огәтеј.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'Ым сәһифә сәрост кардеј',
@@ -431,13 +480,16 @@ $messages = array(
 'nchanges' => '$1 {{PLURAL:$1|дәгиши|дәгишон}}',
 'recentchanges' => 'Ән нујә дәгишон',
 'recentchanges-legend' => 'Ән нујә дәгишон печыније',
+'recentchangestext' => 'Тәмшо быкән бы сәһифәдә че вики охоминә дәгишон нишо доә быән.',
+'recentchanges-feed-description' => 'Ым каналәдә быә охонә дәгишон дығғәтәдә огәт.',
 'recentchanges-label-newpage' => 'Де ым дәгиши тожә сәһифә сохтә бе',
 'recentchanges-label-minor' => 'Ым гадә дәгишије',
 'recentchanges-label-bot' => 'Ым дәгиши бот кардәше',
+'recentchanges-label-unpatrolled' => 'Ым редактә һәлә нәзәрәдә давардәни',
 'rcnote' => "Бә жиј нишо доә быә {{PLURAL:$1|'''1''' дәгиши|'''$1''' дәгиши}}, бә охонә {{PLURAL:$2|ружәдә|'''$2''' ружәдә}}, саат $5, $4.",
 'rcnotefrom' => "Бә жиј доә быән дәгишон че вахтику '''$2''' (тосә '''$1''').",
 'rclistfrom' => '$1 вахтику дәгишон нишо быдә',
-'rcshowhideminor' => '$1 гәдәлиә дәгишон',
+'rcshowhideminor' => '$1 гәдәлијә дәгишон',
 'rcshowhidebots' => '$1 ботон',
 'rcshowhideliu' => '$1 ыштәни едаштә иштирокәкон',
 'rcshowhideanons' => '$1 әнәномә иштирокәкон',
@@ -477,6 +529,7 @@ $messages = array(
 'file-anchor-link' => 'Фајл',
 'filehist' => 'Фајли тарых',
 'filehist-help' => 'Фајли сыфтә рәвојәти виндеј горә бә тарых/вахт егәтән.',
+'filehist-revert' => 'Огард',
 'filehist-current' => 'есәтнә',
 'filehist-datetime' => 'Тарых/Вахт',
 'filehist-thumb' => 'Гәдә шикил',
@@ -493,13 +546,20 @@ $messages = array(
 # Random page
 'randompage' => 'Рајрастә мәғолә',
 
+# Statistics
+'statistics' => 'Статистика',
+
+'disambiguationspage' => 'Template:дәгиг кардеј',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|бајт|бајтон}}',
 'nmembers' => '$1 {{PLURAL:$1|узв|узвон}}',
+'prefixindex' => 'Һәммәј сәһифон де префикси',
 'usercreated' => '{{GENDER:$3|Офәјеј быә}} $1 $2',
 'newpages' => 'Тожә сәһифон',
 'move' => 'Ном дәгиш кардеј',
-'pager-newer-n' => '{{PLURAL:$1|ән нујә 1|ән нујә $1}}',
+'pager-newer-n' => '{{PLURAL:$1|ән нујә1|ән нујә $1}}',
+'pager-older-n' => '{{PLURAL:$1|1 тикиән канә|$1 ән канә}}',
 
 # Book sources
 'booksources' => 'Китобон сәвонон',
@@ -558,6 +618,7 @@ $messages = array(
 
 # Namespace form on various pages
 'namespace' => 'Номон мәкон:',
+'invert' => 'Выжнијә быәгылон дәгишкә',
 'blanknamespace' => '(Әсос)',
 
 # Contributions
@@ -566,8 +627,8 @@ $messages = array(
 'mycontris' => 'Чымы гәнҹ',
 'contribsub2' => 'Гәнҹ $1 ($2)',
 'uctop' => '(охонәни)',
-'month' => 'Чы мангику (һәнијән рә):',
-'year' => 'Чы сорику (һәнијән рә):',
+'month' => 'Че мангику (һәнијән рә):',
+'year' => 'Че сорику (һәнијән рә):',
 
 'sp-contributions-newbies' => 'Әнҹәх нујә иштирокәкон гәнҹи нишо дој',
 'sp-contributions-blocklog' => 'бастә быә чијон',
@@ -603,7 +664,8 @@ $messages = array(
 'blocklink' => 'Бә гырд гәтеј',
 'unblocklink' => 'Ошко кардеј',
 'change-blocklink' => 'Блок быә ҹо дәгиш кардеј',
-'contribslink' => 'Гәнҹ',
+'contribslink' => 'Комәкон',
+'blocklogpage' => 'Блок быәјон',
 'blocklogentry' => 'бастәше [[$1]] бә ын мыддәт $2 $3',
 'block-log-flags-nocreate' => 'нујә иштирокәкон ғејд карде ғәдәғәне',
 
@@ -620,6 +682,7 @@ $messages = array(
 
 # Thumbnails
 'thumbnail-more' => 'Һејве кардеј',
+'thumbnail_error' => 'Гәдә шикили туму кардәдә сәһф: $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Шымә иштирокәкә сәһифә',
@@ -642,9 +705,9 @@ $messages = array(
 'tooltip-search' => 'Нәве {{SITENAME}}',
 '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-recentchanges' => 'Охонә дәгишон сијоһи',
@@ -655,7 +718,7 @@ $messages = array(
 'tooltip-feed-atom' => 'Транслјасијә кардеј бә Atom бо ым сәһифә',
 'tooltip-t-contributions' => 'Чы иштирок кардәкәси дагиш кардә быә сәһифон сијоһи',
 'tooltip-t-emailuser' => 'Бы иштироәкә номә вығәнде',
-'tooltip-t-upload' => 'Шикилон јаанки мултимедиә фајлон бо жај',
+'tooltip-t-upload' => 'Шикилон јаанки мултимедијә фајлон бо жај',
 'tooltip-t-specialpages' => 'Хыдмәтә сәһифон сијоһи',
 'tooltip-t-print' => 'Ым сәһифә рәвојәт бо чап кардеј',
 'tooltip-t-permalink' => 'Бә ым сәһифә рәвојәти еғрорә сәбон',
@@ -684,6 +747,7 @@ $messages = array(
 'file-info-size' => '$1 × $2 пиксел, фајли памјә: $3, MIME тип: $4',
 'file-nohires' => 'Ән барзә рәвојәт ни.',
 'svg-long-desc' => 'SVG фајл, номинәләдә $1 × $2 пиксел, фајли памјә: $3',
+'show-big-image' => 'Тикәјән јолә кејфијјәтинә шикил',
 
 # Bad image list
 'bad_image_list' => 'Формат бәпе быбу жыго:
@@ -694,6 +758,7 @@ $messages = array(
 
 # Metadata
 'metadata' => 'Метамәлумотон',
+'metadata-help' => 'Ым фајләдә фотоапарати јаанки сканери әловә кардә быә мәлумотон һестин. Гирәм фајл сохте бә пешто сәрост кардә быә, бе бәзнеки кали мәлумотон ијо нишо дојәдә фәрғ бәдон.',
 'metadata-fields' => 'Кејнә шикили сәһифәдә метадата ҹәдвәл гырдә карда быә бәвәдә бы сијоһиәдә гылә-гылә ашмардә быә метадата шикили мәрон виндеј бәбе. 
 Әмандәј мәрон нијони бәманден.
 * make
@@ -724,9 +789,22 @@ $messages = array(
 'watchlisttools-edit' => 'Дијә кардеј/сәрост кардеј сијоһи',
 'watchlisttools-raw' => 'Сәрост кардеј бәнә мәтни',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Дыггәт:\'\'\' Еһтимал кардә быә "$2" классификасијә ачари нафконә "$1" классификасијә ачари етиборсоз кардә',
+
 # Special:SpecialPages
 'specialpages' => 'Хысусиә сәһифон',
 
+# External image whitelist
+'external_image_whitelist' => ' #Ым сәтри огәтәнән чокнәј әв һесте<pre>
+#Рә рә истифадә быә фрагментон ијо быдәнән (ә һиссә, че // мијонәдә бедә )
+#Әвон ды харичи шикили URL и дуз бәбен.
+#Дуз омә гылә бәнә шикили нишо бәбе, амандәни бәнә шикили линк нишо бәбе.
+#Сәтрон де # комментариј һисоб бедән.
+#Сәтрон бә регистри һәссос нин.
+
+#Рә рә око доә быә фрагментон че сәтри пентоно ијо быдәнән. Ым сәтри огәтәнән чокнәј һесте.</pre>',
+
 # Special:Tags
 'tag-filter' => '[[Special:Tags|нышонон]] филтр:',
 
index 7f356ae..1a33c2b 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author 82-145
  * @author Bekiroflaz
+ * @author Bilalokms
  * @author Bombola
  * @author Cekli829
  * @author Dbl2010
@@ -19,6 +20,7 @@
  * @author Goktr001
  * @author Hanberke
  * @author Hcagri
+ * @author Ijon
  * @author Incelemeelemani
  * @author Joseph
  * @author Kaganer
@@ -983,7 +985,7 @@ Son engelleme günlüğü girdisi referans için aşağıda sağlanmıştır:',
 'updated' => '(Güncellendi)',
 'note' => "'''Not: '''",
 'previewnote' => "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''
-Yaptığınız değişiklikler henüz kaydedilmedi! [[#editform|→ Düzenlemeye devam edin]]",
+Yaptığınız değişiklikler henüz kaydedilmedi!",
 'previewconflict' => 'Bu önizleme metin düzenleme kutucuğunun üstünde, maddenin eğer değişikliklerinizi kaydetmeyi seçerseniz nasıl görüneceğini yansıtır.',
 'session_fail_preview' => 'Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik. Lütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.',
 'session_fail_preview_html' => "'''Üzgünüz! Oturum verisinin kaybolmasından dolayı düzenlemenizi işleme geçiremeyeceğiz.'''
@@ -996,6 +998,7 @@ Değişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.
 Eğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''",
 'edit_form_incomplete' => "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''",
 'editing' => '"$1" sayfasını değiştirmektesiniz',
+'creating' => 'Oluşturuluyor $1',
 'editingsection' => '"$1" sayfasında bölüm değiştirmektesiniz',
 'editingcomment' => '$1 değiştiriliyor (yeni bölüm)',
 'editconflict' => 'Değişiklik çakışması: $1',
@@ -1015,7 +1018,7 @@ Yaptığınız katkının başka katılımcılar tarafından acımasızca deği
 Ayrıca buraya katkıda bulunarak, bu katkının kendiniz tarafından yazıldığına ya da kamuya açık bir kaynaktan ya da başka bir özgür/ücretsiz kaynaktan kopyalandığına güvence vermiş oluyorsunuz. '''Buraya, telif sahibinin izni olmadan telif hakkı ile korunan eserleri eklemeyiz! '''",
 'copyrightwarning2' => 'Lütfen, {{SITENAME}} sitesine bulunacağınız tüm katkıların diğer üyeler tarafından düzenlenebileceğini, değiştirilebileceğini ya da silinebileceğini hatırlayın. Yazılarınızın merhametsizce değiştirilebilmesine rıza göstermiyorsanız buraya katkıda bulunmayın. <br />
 Ayrıca bu ekleyeceğiniz yazıyı sizin yazdığınızı ya da serbest kopyalama izni veren bir kaynaktan kopyaladığınızı bize taahhüt etmektesiniz (ayrıntılar için referans: $1).',
-'longpageerror' => "'''HATA: Girdiğiniz metnin uzunluğu $1 kilobayt, ve en fazla uzunluktan $2 kilobayt daha fazladır.
+'longpageerror' => "'''HATA: Girdiğiniz metnin uzunluğu {{PLURAL:$1|bir kilobayt|$1 kilobayt}}, ve en fazla uzunluktan {{PLURAL:$2|bir kilobayt|$2 kilobayt}} daha fazladır.
 Kaydedilmesi mümkün değildir.'''",
 'readonlywarning' => "'''DİKKAT: Bakım nedeni ile veritabanı şu anda kilitlidir. Bu sebeple değişiklikleriniz şu anda kaydedilememektedir. Yazdıklarınızı başka bir editöre alıp saklayabilir ve daha sonra tekrar buraya getirip kaydedebilirsiniz'''
 
@@ -1058,6 +1061,7 @@ Silinmiş görünüyor.',
 'edit-no-change' => 'Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.',
 'edit-already-exists' => 'Yeni sayfa oluşturulamıyor.
 Sayfa zaten mevcut.',
+'defaultmessagetext' => 'Varsayılan mesaj metni',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uyarı: Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısı içeriyor.
@@ -1637,6 +1641,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'newsectionsummary' => '/* $1 */ yeni başlık',
 'rc-enhanced-expand' => 'Ayrıntıları göster (JavaScript gerekir)',
 'rc-enhanced-hide' => 'Ayrıntıları gizle',
+'rc-old-title' => 'ilk olarak oluşturulan "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'İlgili değişiklikler',
@@ -1795,6 +1800,7 @@ Eğer sorun tekrarlanırsa, bir [[Special:ListUsers/sysop|hizmetli]] ile temasa
 'upload-http-error' => 'Bir HTTP hatası oluştu: $1',
 
 # File backend
+'backend-fail-notexists' => '$1 dosyası mevcut değil.',
 'backend-fail-delete' => '"$1" dosyası silinemedi.',
 'backend-fail-opentemp' => 'Geçici dosya açılamadı.',
 'backend-fail-closetemp' => 'Geçici dosya kapanamadı.',
@@ -2111,6 +2117,7 @@ Günlük tipini, kullanıcı adını (büyük-küçük harf duyarlı), ya da etk
 'allpagesprefix' => 'Buraya yazdığınız harflerle başlayan sayfaları listeleyin:',
 'allpagesbadtitle' => 'Girilen sayfa ismi diller arası bağlantı ya da vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.',
 'allpages-bad-ns' => '{{SITENAME}} sitesinde "$1" ad alanı yok.',
+'allpages-hide-redirects' => 'Yönlendirmeleri gizle',
 
 # Special:Categories
 'categories' => 'Kategoriler',
@@ -2269,8 +2276,8 @@ $NEWPAGE
 Değişikliği yapan kullanıcının açıklaması: $PAGESUMMARY $PAGEMINOREDIT
 
 Sayfayı değiştiren kullanıcıya erişim bilgileri:
-e-posta: $PAGEEDITOR_EMAIL
-viki: $PAGEEDITOR_WIKI
+E-posta: $PAGEEDITOR_EMAIL
+Viki: $PAGEEDITOR_WIKI
 
 Bahsi geçen sayfayı ziyaret edinceye kadar sayfayla ilgili başka değişiklik bildirimi gönderilmeyecektir. İzleme listenizdeki tüm sayfalar bildirim durumlarını sıfırlayabilirsiniz.
 
index 6d0e3b4..52ceff1 100644 (file)
 
 $messages = array(
 # User preference toggles
-'tog-justify'              => 'Hikahata xirhapa',
-'tog-hideminor'            => 'Tumbeta mindzulamiso leyi tsongo',
-'tog-usenewrc'             => 'Kucinca ka sweswinyana loku hlutiweke (JavaScript)',
-'tog-showtoc'              => 'Komba nxaxamelo wa leswingandzeni (eka tinhlokomhaka tinharhu kumbe kutlula)',
-'tog-rememberpassword'     => 'Tsundzuka ku nghena eka Khompuyuta leyi (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations'       => 'Hoxa matluka lawa ndzi matumbuluxaka eka leswi ndziswi languteke',
-'tog-watchdefault'         => 'Hoxa matluka lawa ndzi malulamisaka eka leswi ndziswi languteke',
-'tog-watchmoves'           => "Hoxa matluka lawa ndzi mayisaka kun'wana eka leswi ndziswi languteke",
-'tog-watchdeletion'        => 'Hoxa matluka lawa ndzi masulaka eka leswi ndziswi languteke',
+'tog-underline' => 'Hlanganisa nkhwatiheto:',
+'tog-justify' => 'Hikahata xirhapa',
+'tog-hideminor' => 'Tumbeta mindzulamiso leyi tsongo',
+'tog-hidepatrolled' => 'Tumbeta ku cinca loku languteriweke eka kucinca ka sweswinyana',
+'tog-newpageshidepatrolled' => 'Tumbeta kucinca loku languteriweke eka nxaxamelo wa matluka lamantswa',
+'tog-extendwatchlist' => 'Ndlandlamuxa ku komba kucinca hikwako, handle ka ku cinca ka sweswinyana ntsena',
+'tog-usenewrc' => 'Tirhisa kucinca ka sweswinyana loku hlutiweke (yitirhisa ntsalo wa Java)',
+'tog-numberheadings' => 'Tinhloko-mhaka leti hleriweke',
+'tog-showtoolbar' => 'Komba xiangarhi xo cinca (yitirhisa ntsalo wa Java)',
+'tog-editondblclick' => 'Lulamisa matluka hi ku thlava kambirhi (yitirhisa ntsalo wa Java)',
+'tog-editsection' => 'Pfula ku lulamisa xiyenge hi ku tirhisa xithlavinyeti xo [edit|lulamisa]',
+'tog-editsectiononrightclick' => 'Pfula ku lulamisa hi swiyenge hi ku thlava nhlokomhaka ya xiyenge (yitirhisa ntsalo wa Java)',
+'tog-showtoc' => 'Komba nxaxamelo wa leswingandzeni (eka tinhlokomhaka tinharhu kumbe kutlula)',
+'tog-rememberpassword' => 'Tsundzuka ku nghena eka Khompuyuta leyi (kufikela eka $1 {{PLURAL:$1|siku|masiku}})',
+'tog-watchcreations' => 'Hoxa matluka lawa ndzi matumbuluxaka eka leswi ndziswi languteke',
+'tog-watchdefault' => 'Hoxa matluka lawa ndzi malulamisaka eka leswi ndziswi languteke',
+'tog-watchmoves' => "Hoxa matluka lawa ndzi mayisaka kun'wana eka leswi ndziswi languteke",
+'tog-watchdeletion' => 'Hoxa matluka lawa ndzi masulaka eka leswi ndziswi languteke',
+'tog-minordefault' => 'Funga mindzulamiso hinkwayo leyi ntsongo handle ka xivangelo',
+'tog-previewontop' => 'Komba kuringanisa ungasi lulamisa bokisi',
+'tog-previewonfirst' => 'Komba kuringanisa eka ndzulamiso wo sungula',
 'tog-enotifwatchlistpages' => 'ndzurhumele e-mail loko leswi ndzi swi languteke swi lulamisiwa',
-'tog-enotifusertalkpages'  => 'ndzurhumele e-mail loko tluka ra mbulavulo na mina ri lulamisiwa',
-'tog-enotifminoredits'     => 'ndzurhumele e-mail loko ku endleka mindzulamiso leyi ntsongo',
-'tog-enotifrevealaddr'     => 'Paluxa e-mail yamina eka mapapila lawa ndzimarhumelaka',
-'tog-shownumberswatching'  => 'Komba ntsengo wa vatirhisi lava hlaleleke tluka',
-'tog-forceeditsummary'     => 'Ndzivutisisi loko ndzinga hoxi nkomiso wa ndzulamiso lowu ndzi wu endleke',
-'tog-watchlisthideown'     => 'Tumbeta mindzulamiso ya mina eka leswi ndzi swi languteke',
-'tog-watchlisthidebots'    => 'Tumbeta mindzulamiso ya rhobhoti eka leswi ndzi swi languteke',
-'tog-watchlisthideminor'   => 'Tumbeta mindzulamiso leyi tsongo eka leswi ndzi swi languteke',
-'tog-watchlisthideliu'     => 'Tumbeta mindzulamiso ya vatirhisiwa lava ngheneke eka leswi ndzi swi languteke',
-'tog-watchlisthideanons'   => 'Tumbeta mindzulamiso ya vatirhisiwa lavanga tivekiki eka leswi ndzi swi languteke',
-'tog-ccmeonemails'         => "Ndzirhumele khopi ya ti e-mail leti ndzi ti rhumelaka van'wana",
+'tog-enotifusertalkpages' => 'ndzurhumele e-mail loko tluka ra mbulavulo na mina ri lulamisiwa',
+'tog-enotifminoredits' => 'ndzurhumele e-mail loko ku endleka mindzulamiso leyi ntsongo',
+'tog-enotifrevealaddr' => 'Paluxa e-mail yamina eka mapapila lawa ndzimarhumelaka',
+'tog-shownumberswatching' => 'Komba ntsengo wa vatirhisi lava hlaleleke tluka',
+'tog-forceeditsummary' => 'Ndzivutisisi loko ndzinga hoxi nkomiso wa ndzulamiso lowu ndzi wu endleke',
+'tog-watchlisthideown' => 'Tumbeta mindzulamiso ya mina eka leswi ndzi swi languteke',
+'tog-watchlisthidebots' => 'Tumbeta mindzulamiso ya rhobhoti eka leswi ndzi swi languteke',
+'tog-watchlisthideminor' => 'Tumbeta mindzulamiso leyi tsongo eka leswi ndzi swi languteke',
+'tog-watchlisthideliu' => 'Tumbeta mindzulamiso ya vatirhisiwa lava ngheneke eka leswi ndzi swi languteke',
+'tog-watchlisthideanons' => 'Tumbeta mindzulamiso ya vatirhisiwa lavanga tivekiki eka leswi ndzi swi languteke',
+'tog-ccmeonemails' => "Ndzirhumele khopi ya ti e-mail leti ndzi ti rhumelaka van'wana",
 
 'underline-always' => 'Nkarhi hinkwawo',
-'underline-never'  => "Swinga endleki ni kan'we",
+'underline-never' => "Swinga endleki ni kan'we",
 
 # Dates
-'sunday'    => 'Sonto',
-'mon'       => 'Musombhunuko',
-'tue'       => 'Ravumbirhi',
-'wed'       => 'Ravunharhu',
-'thu'       => 'Ravumune',
-'fri'       => 'Ravunthlanu',
-'sat'       => 'Muqhivela',
-'january'   => 'Sunguti',
-'february'  => 'Nyenyenyani',
-'march'     => 'Nyenyankulu',
-'april'     => 'Dzivamusoko',
-'may_long'  => 'Mudyaxihi',
-'june'      => 'Khotavuxika',
-'july'      => 'Mawuwani',
-'august'    => 'Mhawuri',
+'sunday' => 'Sonto',
+'monday' => 'Musombhunuko',
+'tuesday' => 'Ravumbirhi',
+'wednesday' => 'Ravunharhu',
+'thursday' => 'Ravumune',
+'friday' => 'Ravunthlanu',
+'saturday' => 'Muqhivela',
+'sun' => 'Sont',
+'mon' => 'Musombhunuko',
+'tue' => 'Ravumbirhi',
+'wed' => 'Ravunharhu',
+'thu' => 'Ravumune',
+'fri' => 'Ravunthlanu',
+'sat' => 'Muqhivela',
+'january' => 'Sunguti',
+'february' => 'Nyenyenyani',
+'march' => 'Nyenyankulu',
+'april' => 'Dzivamusoko',
+'may_long' => 'Mudyaxihi',
+'june' => 'Khotavuxika',
+'july' => 'Mawuwani',
+'august' => 'Mhawuri',
 'september' => 'Ndzhati',
-'october'   => 'Nhlangula',
-'november'  => 'Hukuri',
-'december'  => "N'wendzamhala",
-
-'newwindow'     => '(Yi pfula e ndhzawini yintswa)',
-'cancel'        => 'Thsika',
+'october' => 'Nhlangula',
+'november' => 'Hukuri',
+'december' => "N'wendzamhala",
+'january-gen' => 'Sunguti',
+'february-gen' => 'Nyenyenyani',
+'march-gen' => 'Nyenyankulu',
+'april-gen' => 'Dzivamusoko',
+'may-gen' => 'Mudyaxihi',
+'june-gen' => 'Khotavuxika',
+'july-gen' => 'Mawuwani',
+'august-gen' => 'Mhawuri',
+'september-gen' => 'Ndzhati',
+'october-gen' => 'Nhlangula',
+'november-gen' => 'Hukuri',
+'december-gen' => "N'wendzamhala",
+'jan' => 'Nsungu',
+'feb' => 'Nyenye',
+'mar' => 'Nyenya',
+'apr' => 'Dziva',
+'may' => 'Mudya',
+'jun' => 'Khota',
+'jul' => 'Mawu',
+'aug' => 'Mhawu',
+'sep' => 'Ndzha',
+'oct' => 'Nhla',
+'nov' => 'Huk',
+'dec' => "N'wen",
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Ntlawa|intlawa}}',
+'category_header' => 'Matluka eka ntlawa wa "$1"',
+'subcategories' => 'Mintlawa-ntsongo',
+'category-subcat-count' => '{{PLURAL:$2|Ntlawa lowu wukhome mintlawa-ntsongo leyi landzelaka.|Ntlawa lowu wuni  {{PLURAL:$1|ntlwa-ntsongo|$1 wa mintlaw-ntsongo}}, eka $2 wa mintlawa-ntsongo.}}',
+'category-article-count' => '{{PLURAL:$2|Ntlawa lowu wukhome matluka lamalandzelaka ntsena.| {{PLURAL:$1|Tluka leri ri le|$1 matluka lawa male}} ndzeni ka ntlawa lowu, eka $2 wamintlawa.}}',
+
+'about' => 'Timhaka hi',
+'newwindow' => '(Yi pfula e ndhzawini yintswa)',
+'cancel' => 'Thsika',
 'moredotdotdot' => "Swin'wana...",
-'mypage'        => 'Tluka ramina',
-'mytalk'        => 'Mbulavulo namina',
-'anontalk'      => 'Vulavula na IP leyi',
-'and'           => '&#32;nakambe',
+'mypage' => 'Tluka ramina',
+'mytalk' => 'Mbulavulo namina',
+'anontalk' => 'Vulavula na IP leyi',
+'navigation' => 'Xikomba ndlela',
+'and' => '&#32;nakambe',
 
 # Cologne Blue skin
-'qbfind'         => 'Kuma',
-'qbedit'         => 'Lulamisa',
-'qbpageoptions'  => 'Tluka leri',
-'qbpageinfo'     => 'mongo',
-'qbmyoptions'    => 'Matluka ya mina',
+'qbfind' => 'Kuma',
+'qbedit' => 'Lulamisa',
+'qbpageoptions' => 'Tluka leri',
+'qbpageinfo' => 'mongo',
+'qbmyoptions' => 'Matluka ya mina',
 'qbspecialpages' => 'Matluka yohlawuleka',
-'faq'            => 'FAQ',
-'faqpage'        => 'Project:FAQ',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-delete'  => 'Sula',
+'vector-action-addsection' => 'Veka nholoko ya mhaka',
+'vector-action-delete' => 'Sula',
+'vector-action-move' => 'Yi sa kunwana',
 'vector-action-protect' => 'Sirhelela',
-'vector-view-create'    => 'Tumbuluxa',
-
-'errorpagetitle'   => 'Xihoxo',
-'returnto'         => 'Thlelela e $1.',
-'tagline'          => 'Kusuka e {{SITENAME}}',
-'help'             => 'Mpfuno',
-'search'           => 'Lava',
-'searchbutton'     => 'Lava',
-'go'               => 'Nghena',
-'searcharticle'    => 'Nghena',
-'history'          => 'Matimu yaTluka',
-'history_short'    => 'Matimu',
+'vector-view-create' => 'Tumbuluxa',
+'vector-view-edit' => 'Lulamisa',
+'vector-view-history' => 'Languta matimu',
+'vector-view-view' => 'Hlaya',
+'vector-view-viewsource' => 'Languta xihlovo',
+'actions' => 'Swiendlo',
+'namespaces' => 'Swikhomela viti',
+'variants' => 'Tinxaka hi ku hambana',
+
+'errorpagetitle' => 'Xihoxo',
+'returnto' => 'Thlelela e $1.',
+'tagline' => 'Kusuka e {{SITENAME}}',
+'help' => 'Mpfuno',
+'search' => 'Lava',
+'searchbutton' => 'Lava',
+'go' => 'Nghena',
+'searcharticle' => 'Nghena',
+'history' => 'Matimu yaTluka',
+'history_short' => 'Matimu',
 'printableversion' => 'Vona Ngangliso',
-'edit'             => 'Lulamisa',
-'create'           => 'Tumbuluxa',
-'editthispage'     => 'Lulamisa Tluka leri',
+'permalink' => 'Xithlavinyeti xa nkarhi hinkwawo',
+'edit' => 'Lulamisa',
+'create' => 'Tumbuluxa',
+'editthispage' => 'Lulamisa Tluka leri',
 'create-this-page' => 'Tumbuluxa tluka leri',
-'delete'           => 'Sula',
-'deletethispage'   => 'Sula tluka leri',
-'protect'          => 'Sirhelela',
-'protect_change'   => 'Cinca',
-'newpage'          => 'Tluka rintswa',
+'delete' => 'Sula',
+'deletethispage' => 'Sula tluka leri',
+'protect' => 'Sirhelela',
+'protect_change' => 'Cinca',
+'protectthispage' => 'Sirhelela tluka leri',
+'newpage' => 'Tluka rintswa',
 'talkpagelinktext' => 'Mbulavulo',
-'talk'             => 'Mbulavuriswano',
-'toolbox'          => 'Bokisi ra switirhisiwa',
-'jumptosearch'     => 'Lava',
+'specialpage' => 'Tluka ro hlawuleka',
+'personaltools' => "Switirhisi swa n'wini",
+'talk' => 'Mbulavuriswano',
+'views' => 'Kulanguteka',
+'toolbox' => 'Bokisi ra switirhisiwa',
+'otherlanguages' => "Hi ti ndzimi tin'wana",
+'redirectedfrom' => '(Ritlerisewe kusuka e $1)',
+'lastmodifiedat' => 'Tluka leri rihetelele ku lulamisiwa hi $1, nkarhi kuri $2.',
+'jumpto' => 'Tlulela eka:',
+'jumptonavigation' => 'Xikomba-ndlela',
+'jumptosearch' => 'Lava',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => 'ta {{SITENAME}}',
-'aboutpage'            => 'Project:ta',
-'currentevents'        => 'Leswi endlekaka sweswi',
-'disclaimers'          => 'Swi alanandzu',
-'disclaimerpage'       => 'Project:Swithsuxa nadzu hikuangara',
-'edithelp'             => 'Mpfuno hi ta mindzulamiso',
-'edithelppage'         => 'Help:Mindzulamiso',
-'helppage'             => 'Help:Leswinga ndzeni',
-'mainpage'             => 'Tlukankulu',
+'aboutsite' => 'ta {{SITENAME}}',
+'aboutpage' => 'Project:ta',
+'copyrightpage' => '{{ns:project}}:Mpfumelelo wo ringisa',
+'currentevents' => 'Leswi endlekaka sweswi',
+'currentevents-url' => 'Project:Leswi endlekaka sweswi',
+'disclaimers' => 'Swi alanandzu',
+'disclaimerpage' => 'Project:Swithsuxa nadzu hikuangara',
+'edithelp' => 'Mpfuno hi ta mindzulamiso',
+'edithelppage' => 'Help:Mindzulamiso',
+'helppage' => 'Help:Leswinga ndzeni',
+'mainpage' => 'Tlukankulu',
 'mainpage-description' => 'Tluka-Nkulu',
-'policy-url'           => 'Project:Policy',
-'portal'               => 'Ntsindza wa muganga',
-'portal-url'           => 'Project:Community Portal',
-'privacy'              => 'Privacy policy',
-'privacypage'          => 'Project:Privacy policy',
+'policy-url' => 'Project:Policy',
+'portal' => 'Ntsindza wa muganga',
+'portal-url' => 'Project:Community Portal',
+'privacy' => 'Privacy policy',
+'privacypage' => 'Project:Privacy policy',
 
-'badaccess'        => 'Xihoxo hita mpfumelelo',
+'badaccess' => 'Xihoxo hita mpfumelelo',
 'badaccess-group0' => 'U hava mpumelelo wo endla xikombelo lexi.',
 'badaccess-groups' => 'The action you have requested is limited to users in one of the groups $1.',
 
-'versionrequired'     => 'Version $1 of MediaWiki required',
+'versionrequired' => 'Version $1 of MediaWiki required',
 'versionrequiredtext' => 'Version $1 of MediaWiki is required to use this page.
 See [[Special:Version|version page]].',
 
-'ok'                      => 'Hiswona',
-'retrievedfrom'           => 'ku suka e "$1"',
-'youhavenewmessages'      => 'U na $1 ($2).',
-'newmessageslink'         => 'Marungula mantswa',
-'newmessagesdifflink'     => 'last change',
+'ok' => 'Hiswona',
+'retrievedfrom' => 'ku suka e "$1"',
+'youhavenewmessages' => 'U na $1 ($2).',
+'newmessageslink' => 'Marungula mantswa',
+'newmessagesdifflink' => 'last change',
 'youhavenewmessagesmulti' => 'Una marungula mantswa hi $1',
-'editsection'             => 'Lulamisa',
-'editold'                 => 'Lulamisa',
-'viewsourceold'           => 'Languta vutsari-ntumbuluko',
-'editlink'                => 'Lulamisa',
-'editsectionhint'         => 'Lulamisa xiphemu: $1',
-'toc'                     => 'Leswinga ndzeni',
-'showtoc'                 => 'Kombisa',
-'hidetoc'                 => 'Tumbeta',
-'thisisdeleted'           => 'Langutisa kumbe Thlerisela $1?',
-'viewdeleted'             => 'Langutisa $1?',
-'restorelink'             => '{{PLURAL:$1|ndzulamiso lowu suriweke|$1 mindzulamiso leyi suriweke}}',
-'feedlinks'               => 'Feed:',
-'feed-invalid'            => 'Invalid subscription feed type.',
-'feed-unavailable'        => 'Syndication feeds are not available on {{SITENAME}}',
-'site-rss-feed'           => '$1 RSS Feed',
-'site-atom-feed'          => '$1 Atom Feed',
-'page-rss-feed'           => '"$1" RSS Feed',
-'page-atom-feed'          => '"$1" Atom Feed',
-'red-link-title'          => '$1 (Arisi tsariwa)',
+'editsection' => 'Lulamisa',
+'editold' => 'Lulamisa',
+'viewsourceold' => 'Languta vutsari-ntumbuluko',
+'editlink' => 'Lulamisa',
+'viewsourcelink' => 'Languta xihlovo',
+'editsectionhint' => 'Lulamisa xiphemu: $1',
+'toc' => 'Leswinga ndzeni',
+'showtoc' => 'Kombisa',
+'hidetoc' => 'Tumbeta',
+'thisisdeleted' => 'Langutisa kumbe Thlerisela $1?',
+'viewdeleted' => 'Langutisa $1?',
+'restorelink' => '{{PLURAL:$1|ndzulamiso lowu suriweke|$1 mindzulamiso leyi suriweke}}',
+'feedlinks' => 'Feed:',
+'feed-invalid' => 'Invalid subscription feed type.',
+'feed-unavailable' => 'Syndication feeds are not available on {{SITENAME}}',
+'site-rss-feed' => '$1 RSS Feed',
+'site-atom-feed' => '$1 Atom Feed',
+'page-rss-feed' => '"$1" RSS Feed',
+'page-atom-feed' => '"$1" Atom Feed',
+'red-link-title' => '$1 (Tluka leri, arisi tsariwa)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Tluka',
-'nstab-user'      => 'Tluka ra mutirhisi',
-'nstab-media'     => 'Media page',
-'nstab-special'   => 'Hlawuleka',
-'nstab-project'   => 'Tluka ra Phurojeki',
-'nstab-image'     => 'Fayili',
+'nstab-main' => 'Tluka',
+'nstab-user' => 'Tluka ra mutirhisi',
+'nstab-media' => 'Media page',
+'nstab-special' => 'Tluka ro hlawuleka',
+'nstab-project' => 'Tluka ra Phurojeki',
+'nstab-image' => 'Fayili',
 'nstab-mediawiki' => 'Rungula',
-'nstab-template'  => 'Template',
-'nstab-help'      => 'Tluka ra mpfuno',
-'nstab-category'  => 'Xiyenge',
+'nstab-template' => 'Template',
+'nstab-help' => 'Tluka ra mpfuno',
+'nstab-category' => 'Xiyenge',
 
 # Main script and global functions
-'nosuchaction'      => 'Kuhava xiendlo xo tano',
-'nosuchactiontext'  => 'Xikombelo xa URL a xitwisisiwi hi wiki',
+'nosuchaction' => 'Kuhava xiendlo xo tano',
+'nosuchactiontext' => 'Xikombelo xa URL a xitwisisiwi hi wiki',
 'nosuchspecialpage' => 'Ku hava Tluka rero rohlawuleka',
 'nospecialpagetext' => '<strong>U kombele tluka ro hlawuleka ro ka ri nga ri kona.</strong>
 
 Vona nxaxamelo wa ma tluka yo hlawuleka e [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error'                => 'Xihoxo',
-'databaseerror'        => 'Xihoxo xo Database',
-'dberrortext'          => 'A database query syntax error has occurred.
+'error' => 'Xihoxo',
+'databaseerror' => 'Xihoxo xo Database',
+'dberrortext' => 'A database query syntax error has occurred.
 This may indicate a bug in the software.
 The last attempted database query was:
 <blockquote><tt>$1</tt></blockquote>
 from within function "<tt>$2</tt>".
 MySQL returned error "<tt>$3: $4</tt>".',
-'dberrortextcl'        => 'A database query syntax error has occurred.
+'dberrortextcl' => 'A database query syntax error has occurred.
 The last attempted database query was:
 "$1"
 from within function "$2".
 MySQL returned error "$3: $4"',
-'laggedslavemode'      => 'Warning: Page may not contain recent updates.',
-'readonly'             => 'Database locked',
-'enterlockreason'      => 'Enter a reason for the lock, including an estimate of when the lock will be released',
-'readonlytext'         => 'The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.
+'laggedslavemode' => 'Warning: Page may not contain recent updates.',
+'readonly' => 'Database locked',
+'enterlockreason' => 'Enter a reason for the lock, including an estimate of when the lock will be released',
+'readonlytext' => 'The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.
 
 The administrator who locked it offered this explanation: $1',
-'missing-article'      => 'The database did not find the text of a page that it should have found, named "$1" $2.
-
-This is usually caused by following an outdated diff or history link to a page that has been deleted.
-
-If this is not the case, you may have found a bug in the software.
-Please report this to an administrator, making note of the URL.',
-'missingarticle-rev'   => '(revision#: $1)',
-'missingarticle-diff'  => '(Diff: $1, $2)',
-'readonly_lag'         => 'The database has been automatically locked while the slave database servers catch up to the master',
-'internalerror'        => 'Xihoxo xa le ndzeni',
-'internalerror_info'   => 'Internal error: $1',
-'filecopyerror'        => 'Could not copy file "$1" to "$2".',
-'filerenameerror'      => 'Could not rename file "$1" to "$2".',
-'filedeleteerror'      => 'Could not delete file "$1".',
+'missing-article' => 'Tsalwa leri uri lavaka eka tluka leri vuriwaka  "$1" $2, ari kumekanga eka nghula.
+
+Leswi swinga vangiwa hi kuva u landzele xithlavinyeti lexi hundzeriweke hi nkari kumbe tluka leri suriweke.
+
+Loko leswi swingari xona xivangelo, ungava ukume xigalana eka xitirhisi lexi.
+Ukomberiwa ku pota xigalana lexi eka [[Special:ListUsers/sysop|mulanguteri]], u rhumela na xithlavinyeti xa URL.',
+'missingarticle-rev' => '(revision#: $1)',
+'missingarticle-diff' => '(Diff: $1, $2)',
+'readonly_lag' => 'The database has been automatically locked while the slave database servers catch up to the master',
+'internalerror' => 'Xihoxo xa le ndzeni',
+'internalerror_info' => 'Internal error: $1',
+'filecopyerror' => 'Could not copy file "$1" to "$2".',
+'filerenameerror' => 'Could not rename file "$1" to "$2".',
+'filedeleteerror' => 'Could not delete file "$1".',
 'directorycreateerror' => 'Could not create directory "$1".',
-'filenotfound'         => 'Could not find file "$1".',
-'fileexistserror'      => 'Unable to write to file "$1": file exists',
-'unexpected'           => 'Unexpected value: "$1"="$2".',
-'formerror'            => 'Error: could not submit form',
-'badarticleerror'      => 'This action cannot be performed on this page.',
-'cannotdelete'         => 'Could not delete the page or file specified.
+'filenotfound' => 'Could not find file "$1".',
+'fileexistserror' => 'Unable to write to file "$1": file exists',
+'unexpected' => 'Unexpected value: "$1"="$2".',
+'formerror' => 'Error: could not submit form',
+'badarticleerror' => 'This action cannot be performed on this page.',
+'cannotdelete' => 'Could not delete the page or file specified.
 It may have already been deleted by someone else.',
-'badtitle'             => 'Bad title',
-'badtitletext'         => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
+'badtitle' => 'Bad title',
+'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
 It may contain one or more characters which cannot be used in titles.',
 'querypage-no-updates' => 'Updates for this page are currently disabled.
 Data here will not presently be refreshed.',
 'wrong_wfQuery_params' => 'Incorrect parameters to wfQuery()<br />
 Function: $1<br />
 Query: $2',
-'viewsource'           => 'Vona tsalwa-tumbuluxa',
+'viewsource' => 'Vona tsalwa-tumbuluxa',
 
 # Login and logout pages
-'yourname'                => 'Vito ra vutirhisi',
-'yourpassword'            => 'Vito-mpfungulo:',
-'login'                   => 'Pfula u nghena',
+'yourname' => 'Vito ra vutirhisi',
+'yourpassword' => 'Vito-mpfungulo:',
+'yourpasswordagain' => 'Thlela u hoxa ritompfungulo ra wena:',
+'login' => 'Pfula u nghena',
 'nav-login-createaccount' => 'Pfula unghena / Tumbuluxa akhawunti',
-'userlogin'               => 'Pfula unghena / Tumbuluxa akhawunti',
-'logout'                  => 'Pfala u famba',
-'userlogout'              => 'Pfala u famba',
-'nologinlink'             => 'Tumbuluxa akhawunti',
-'createaccount'           => 'Tumbuluxa akhawunti',
+'userlogin' => 'Pfula unghena / Tumbuluxa akhawunti',
+'logout' => 'Pfala u famba',
+'userlogout' => 'Pfala u famba',
+'nologinlink' => 'Tumbuluxa akhawunti',
+'createaccount' => 'Tumbuluxa akhawunti',
+'gotaccount' => 'Xna una akhawunti hi khale? $1.',
+'gotaccountlink' => 'Pfula unghena',
+'userlogin-resetlink' => 'Xana u rivele vuxokoxoko bya wena byo pfula unghena?',
+
+# Edit page toolbar
+'bold_sample' => 'Marito yo bumbula',
+'bold_tip' => 'Marito yo bumbula',
+'italic_sample' => 'Tsalawa ra xitaliki',
+'italic_tip' => 'Tsalawa ra xitaliki',
+'link_sample' => 'Khwekerisa nhlokomhaka',
+'link_tip' => 'Xikhwekerisi xala ndzeni ka wiki leyi',
+'extlink_sample' => 'http://www.example.com khwekerisa nhlokomhaka',
+'extlink_tip' => 'Xikhwekerisi xa tluka ralehandle ka wiki leyi (tsundzuka xi rhangi xa http:// )',
+'headline_sample' => 'tsala ra nhlokomhaka',
+'media_tip' => 'Xikhwekerisi xa fayili',
 
 # Edit pages
-'summary'          => 'Nkomiso:',
-'minoredit'        => 'Lowu i ndzulamiso wu tsongo',
-'watchthis'        => 'Langutisa tluka leri',
-'savearticle'      => 'Hlayisa tluka',
-'preview'          => 'Ringanisa',
-'showpreview'      => 'Komba kuringanisa',
-'showdiff'         => 'Komba ku cinca',
-'previewnote'      => "'''Lowu i ndzinganiso ntsena;
+'summary' => 'Nkomiso:',
+'minoredit' => 'Lowu i ndzulamiso wu tsongo',
+'watchthis' => 'Langutisa tluka leri',
+'savearticle' => 'Hlayisa tluka',
+'preview' => 'Ringanisa',
+'showpreview' => 'Komba kuringanisa',
+'showdiff' => 'Komba ku cinca',
+'anoneditwarning' => "'''Watsundzuxiwa:''' awu pfulanga unghena eka wiki leyi.
+Adirese ya khompuyuta ya wena ya IP yita tsariwa eka matimu ya ku lulamisiwa ka tluka leri.",
+'newarticletext' => "Ulandzele xikhwekerisi lexi kombaka tluka leringasi tsariwaka.
+Leswaku u tumbuluxa tluka leri, tsala eka bokisi leringa e hansi (Nkambe unga ye eka [[{{MediaWiki:Helppage}}|tluka ra mpfuno]] kukuma vuxokoxoko lebyi engetelekeke).
+Loko ufike eka tluka leri hixihoxo, thlava bhatheni leyinge '''thlelela'''.",
+'noarticletext' => 'Kuhava matsalwa eka tluka leri.
+Unga [[Special:Search/{{PAGENAME}}|lavalava nhlokomhaka ya tluka leri]] eka matluka man\'wana,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} lavalava eka nghula leyiyelanaka],
+kumbe [{{fullurl:{{FULLPAGENAME}}|action=edit}} u hlakarhelisa tluka leri]</span>.',
+'previewnote' => "'''Lowu i ndzinganiso ntsena;
 kucinca a ku sihlayisiwa!'''",
+'editing' => 'Ulekululamiseni ka $1',
 'copyrightwarning' => "Xiya leswaku minyikelo hinkwayo e ka {{SITENAME}} yi tekiwa yitshuxiwe e hansi ka $2 (Vona $1 ku kuma vuxokoxoko).
 loko unga tsakeli leswaku vutsari bya wena byi lulamisiwa no aviwa handle ko tweriwa vusiwana, unga tsari laha.<br />
 U hi tshembisa nakambe leswaku hi wena mutsari wa leswi nyikeriwaka laha, kumbe leswi u swinyikelaka u swi tekile e xihloveni xa lerivaleni kumbe laha kunga na mpfumelelo wa mani na mani.
 '''UNGA RHUMERI MATSALWA LA MA SIRHELERIWEKE HANDLE KA MPFUMELELO!'''",
+'template-protected' => '(Ri sirheleriwile)',
+'template-semiprotected' => '(lisirheleriwile switsanana)',
+'permissionserrorstext-withaction' => 'Awupfumeleriwanga ku $2, hikwalaho ka {{PLURAL:$1|wa xivangelo|wa swivangelo}}:',
+'moveddeleted-notice' => 'Tluka leri ri suriwile.
+nhula ya minxaxamelo leyi kombaka ku suriwa na ku susiwa ka tluka leri ya kombiwa laha ehansi.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Tivonele:''' xivumbiwa-ntirho xa ntsengo xitele ngopfu.
+swivumbiwa-ntirho swin'wana aswinge xaxametiwi.",
+'post-expand-template-inclusion-category' => 'Matluka lawa xivumbiwa-ntirho xa wona xi lavaka ntsengo ma hundze mpimo',
 
 # History pages
-'next'                 => 'Leswilandzelaka',
-'last'                 => 'Swo hetelela',
-'page_first'           => 'Xo sungula',
+'viewpagelogs' => 'Vona nghula ya minxaxamelo ya tluka leri',
+'currentrev-asof' => 'Mindzulamiso ya sweswinyana ya $1',
+'revisionasof' => 'Ndzulamiso kusukela hi $1',
+'previousrevision' => '← Ndzulamiso wakhale',
+'next' => 'Leswilandzelaka',
+'last' => 'Swo hetelela',
+'page_first' => 'Xo sungula',
+'history-fieldset-title' => 'Langutisa matimu',
 'history-show-deleted' => 'Leswi suriweke ntsena',
+'histfirst' => 'Swa khalenyana',
+'histlast' => 'Swa sweswinyana',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 hi $2',
 
 # Revision deletion
 'rev-delundel' => 'Komba/Tumbeta',
-'pagehist'     => 'Matimu ya tluka',
-'deletedhist'  => 'Matimu lamasuriweke',
+'revdel-restore' => 'Cinca kuvoniwa',
+'revdel-restore-deleted' => 'Mindzulamiso leyi suriweke',
+'revdel-restore-visible' => 'mindzulamiso leyi voniwaka himani na mani',
+'pagehist' => 'Matimu ya tluka',
+'deletedhist' => 'Matimu lamasuriweke',
 
 # Merge log
 'revertmerge' => 'Hambanisa',
 
+# Diffs
+'history-title' => 'Matimu ya mindulamiso ya "$1"',
+'lineno' => 'Ntila $1:',
+'compareselectedversions' => 'Hambaniisa exikarhi ka mindzulamiso leyi langiweke',
+'editundo' => 'Thlerisela',
+
 # Search results
-'searchhelp-url'        => 'Help:Leswinga ndzeni',
+'searchresults' => 'Lavisisa eka mimbuyelo',
+'searchresults-title' => 'Lavisisa "$1" eka mimbuyelo',
+'prevn' => 'Leswihundzeke  {{PLURAL:$1|$1}}',
+'nextn' => 'Leswilandzelaka  {{PLURAL:$1|$1}}',
+'prevn-title' => '$1 {{PLURAL:$1|nkutlunya lo wu|minkutlunya leyi}} hundzeke',
+'nextn-title' => '$1 {{PLURAL:$1|nkutlunya lowu|minkutlunya leyi}} landzelaka',
+'shown-title' => "Komba $1 {{PLURAL:$1|mbuyelo|mimbuyelo}} eka tluka rin'wana na ri n'wana",
+'searchmenu-exists' => "'''Tluka leri vuriwaka \"[[:\$1]]\" ikhale ririkona eka wiki leyi.'''",
+'searchmenu-new' => "'''Tumbuluxa tluka ra \"[[:\$1]]\" eka wiki leyi!'''",
+'searchhelp-url' => 'Help:Leswinga ndzeni',
+'searchprofile-articles' => 'Matluka lama tsariweke',
+'searchprofile-everything' => 'Hinkwaswo',
+'searchprofile-articles-tooltip' => 'Lavisisa eka $1',
+'searchprofile-project-tooltip' => 'Lavisisa eka $1',
+'searchprofile-images-tooltip' => 'Lava tifayili',
+'search-result-size' => '$1 ({{PLURAL:$2|1 viti|$2 maviti}})',
+'search-redirect' => '(nkongomiso kusaka e $1)',
+'search-section' => '(Xiyenge $1)',
+'search-suggest' => 'Xana uvula: $1',
 'search-interwiki-more' => '(Leswi engetelekeke)',
 'search-relatedarticle' => 'Leswi yelanaka',
-'searchrelated'         => 'Yelanaka',
-'searchall'             => 'Hinkwaswo',
-'showingresults'        => "Kombisa e hansi kufika eka {{PLURAL:$1|'''1''' mbuyelo|'''$1''' mimbuyelo}} Kusungula hi#'''$2'''.",
-'powersearch'           => 'Ndzavisiso',
+'searchrelated' => 'Yelanaka',
+'searchall' => 'Hinkwaswo',
+'showingresults' => "Kombisa e hansi kufika eka {{PLURAL:$1|'''1''' mbuyelo|'''$1''' mimbuyelo}} Kusungula hi#'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|nkutlunya '''$1''' wa '''$3''' lowu|minkutlunya '''$1 - $2''' ya '''$3''' leyi}} yelanaka na '''$4'''",
+'search-nonefound' => 'Kuhava mimbuyelo leyi yelanaka xikombelo lexi.',
+'powersearch' => 'Ndzavisiso',
 
 # Preferences page
-'mypreferences'   => 'Minhlawulo ya mina',
-'prefs-edits'     => 'Ntsengo wa mindzulamiso:',
-'skin-preview'    => 'Ndzinganiso',
-'prefs-datetime'  => 'Siku na nkarhi',
+'mypreferences' => 'Minhlawulo ya mina',
+'prefs-edits' => 'Ntsengo wa mindzulamiso:',
+'skin-preview' => 'Ndzinganiso',
+'prefs-datetime' => 'Siku na nkarhi',
 'prefs-watchlist' => 'Nxaxamelo wa Leswivoniwaka',
-'saveprefs'       => 'Hlayisa',
-'resetprefs'      => 'sula kucinca lokungahlayisiwangiki',
-'prefs-editing'   => 'Kululamisa',
-'yourrealname'    => 'Vito ra ntiyiso:',
-'yourlanguage'    => 'Ririmi:',
+'saveprefs' => 'Hlayisa',
+'resetprefs' => 'sula kucinca lokungahlayisiwangiki',
+'prefs-editing' => 'Kululamisa',
+'yourrealname' => 'Vito ra ntiyiso:',
+'yourlanguage' => 'Ririmi:',
+'prefs-help-email' => 'Adiresi ya e-mail ayibohi, kambe yita laveka leswaku u cinca ritompfungulo ra wena, loko swiendleka leswaku u ri rivala.',
+'prefs-help-email-others' => "Unga langa leswaku van'wana va bula na wena hi e-mail hikutirhisa xikhwekeri eka tluka ra wena ravutirhis kumbe eka tluka ra mbulavulo.
+Adiresi ya wena ya e-mail yitunberile loko van'wana va bula na wena.",
 
 # Rights
-'right-read'       => 'Matluka yo Hlaya',
-'right-edit'       => 'Lulamisa ma tluka',
+'right-read' => 'Matluka yo Hlaya',
+'right-edit' => 'Lulamisa ma tluka',
 'right-createpage' => 'Tumbuluxa matluka (mangariki eka matluka ya mbulavulo)',
 'right-createtalk' => 'Tumbuluxa matluka ya mbulavulo',
 
@@ -300,111 +452,257 @@ U hi tshembisa nakambe leswaku hi wena mutsari wa leswi nyikeriwaka laha, kumbe
 'action-edit' => 'Lulamisa tluka leri',
 
 # Recent changes
-'recentchanges'    => 'Ku cinca ka sweswi-nyana',
-'hide'             => 'Tumbeta',
-'show'             => 'Komba',
+'recentchanges' => 'Ku cinca ka sweswi-nyana',
+'recentchanges-legend' => 'Tindlela to langutisa ku cinca ka sweswinyana',
+'recentchanges-label-newpage' => 'Ndzulamiso lowu wu tumbuluxe tluka rintswa',
+'recentchanges-label-minor' => 'Lowu i ndzulamiso wu tsongo',
+'recentchanges-label-bot' => 'Ndzulamiso lowu wu endliwe hi rhobhoto',
+'recentchanges-label-unpatrolled' => 'Ndzulamiso lowu awusi languteriwa',
+'rclistfrom' => 'Komba mindzilamiso leyintswa kusukela eka $1',
+'rcshowhideminor' => '$1 wa mindzulamiso leyi ntsanana',
+'rcshowhideliu' => '$1 wa va tirhisi lavanga kona sweswi',
+'rcshowhideanons' => '$1 wa vatirhisi lava tumbeleke',
+'rcshowhidepatr' => '$1 mundzulamiso leyi languteriweke',
+'rcshowhidemine' => '$1 wa mindzulamiso ya mina',
+'rclinks' => 'Kumba $1 ya ku cinca eka $2 wa masiku lamahundzeke<br />$3',
+'hist' => 'Matimu',
+'hide' => 'Tumbeta',
+'show' => 'Komba',
+'rc-enhanced-expand' => 'Komba vuxokoxoko (yi tirhisa tswala ra Java)',
 'rc-enhanced-hide' => 'Tumbeta vuxokoxoko',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Kuncica loku yelanaka',
-'recentchangeslinked-feed'    => 'Kuncica loku yelanaka',
+'recentchangeslinked' => 'Kuncica loku yelanaka',
+'recentchangeslinked-feed' => 'Kuncica loku yelanaka',
 'recentchangeslinked-toolbox' => 'Kuncica loku yelanaka',
+'recentchangeslinked-title' => 'Kucinca loku yelanaka na "$1"',
+'recentchangeslinked-noresult' => 'Kuhava mindzulamiso eka matluka lawa eka nkarhi lowu langiweke',
+'recentchangeslinked-summary' => "Lowu inxaxamelo wa kucinca kasweswinyana loku endliweke eka matluka la ma khwekelaka eka tluka leri u rilavaka (kumbe yinw'ana ya mitlawa leyi yelanaka).Matluka lawa [[Special:Watchlist|umalanguteke]] ma '''bumburisiwile'''.",
+'recentchangeslinked-page' => 'Vito ratluka:',
+'recentchangeslinked-to' => 'Komba kucinca eka matluka lama khwekelaka eka tluka leri ntsena',
 
 # Upload
 'upload' => 'Khandziyisa fayili',
+'filedesc' => 'Nkomiso',
+
+'license' => 'Nawu wo pfumelela',
+'license-header' => 'Nawu wo pfumelela',
 
 # Special:ListFiles
-'imgfile'        => 'fayili',
-'listfiles'      => 'Nxaxamelo wa tifayili',
+'imgfile' => 'fayili',
+'listfiles' => 'Nxaxamelo wa tifayili',
 'listfiles_date' => 'Siku',
 'listfiles_name' => 'vito',
 
 # File description page
-'file-anchor-link'   => 'Fayili',
+'file-anchor-link' => 'Fayili',
+'filehist' => 'Matimu ya fayili',
+'filehist-help' => 'thlava eka siku/nkarhi leswaku u vona leswi fayili ayirixiswona hi knarhi walowo',
 'filehist-deleteall' => 'sula hinkwaswo',
 'filehist-deleteone' => 'Dlaya',
-'filehist-revert'    => 'thlerisela',
-'filehist-datetime'  => 'Siku/Nkarhi',
-'filehist-user'      => 'Mutirhisi',
+'filehist-revert' => 'thlerisela',
+'filehist-current' => 'Sweswinyana',
+'filehist-datetime' => 'Siku/Nkarhi',
+'filehist-thumb' => 'Xifanisonyana',
+'filehist-thumbtext' => 'Xifaniso lexi tsongahatiweke kusukela hi $1',
+'filehist-user' => 'Mutirhisi',
+'filehist-dimensions' => 'Mpimo',
+'filehist-comment' => 'Nhlamulo',
+'imagelinks' => 'Ntsengo wakutirhisiwa ka fiyili leyi',
+'linkstoimage' => ' {{PLURAL:$1|tluka leri rikhekela|$1 matluka lawa makhwekela}} eka fayili leyi:',
+'nolinkstoimage' => 'Kuhava tluka leri khwekelaka eka fayili leyi',
+'sharedupload-desc-here' => "Fayili leyi yi suka e $1 naswona swinga endleka leswaku yi tirhisiwa hiti phurojeki tin'wanana.
+Nhlamuselo ya yona leyi nge ndzeni ka [$2 tluka ro hlamusela] hi yona leyi kombiweke ehansi.",
+
+# Random page
+'randompage' => "Tluka rin'wana na rin'wana",
 
 # Statistics
 'statistics' => 'Mintsengo',
 
 # Miscellaneous special pages
-'newpages'     => 'Matluka mantswa',
-'move'         => 'Yi sa kunwana',
+'nbytes' => '$1 {{PLURAL:$1|wa bayiti|wa tibayit}}',
+'nmembers' => '$1 {{PLURAL:$1|museketeri| wa vaseketeri}}',
+'newpages' => 'Matluka mantswa',
+'move' => 'Yi sa kunwana',
 'movethispage' => 'Yisa tluka leri ndhzawini yinwana',
 
+# Book sources
+'booksources' => 'Swihlovo swatibuku',
+'booksources-go' => 'Nghena',
+
 # Special:Log
 'specialloguserlabel' => 'Mutirhisi:',
+'log' => 'Nghula ya minxaxamelo',
 
 # Special:AllPages
-'allpages'       => 'Matluka hinkwawo',
+'allpages' => 'Matluka hinkwawo',
 'alphaindexline' => '$1 kuya fika eka $2',
-'allarticles'    => 'Matluka hinkwawo',
+'allarticles' => 'Matluka hinkwawo',
+'allpagessubmit' => 'Nghena',
+
+# Special:Categories
+'categories' => 'Mintlawa',
 
 # Special:LinkSearch
 'linksearch-ok' => 'Lava',
+'linksearch-line' => '$1 yi khwekerisiwe kusuka eka $2',
 
 # E-mail user
 'emailuser' => 'rhumela mutirhisi loyi E-mail',
 
 # Watchlist
-'watchlist'     => 'Leswi ndziswilanguteke',
-'mywatchlist'   => 'Leswi ndziswilanguteke',
-'watch'         => 'Languta',
+'watchlist' => 'Leswi ndziswilanguteke',
+'mywatchlist' => 'Leswi ndziswilanguteke',
+'watch' => 'Languta',
 'watchthispage' => 'Languta tluka leri',
-'unwatch'       => 'Ungalanguti',
+'unwatch' => 'Ungalanguti',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Ulangutile...',
+'watching' => 'Ulangutile...',
 'unwatching' => 'Utshika ku languta...',
 
+# Delete
+'actioncomplete' => 'Swiendlekile',
+'actionfailed' => 'Switsandzile',
+'dellogpage' => 'Nghula ya matluka lama suriweke',
+
+# Rollback
+'rollbacklink' => 'thlerisela ku cinca',
+
+# Protect
+'protectlogpage' => 'Nghula ya minxaxamelo ya matsalwa lama sirheleriweke',
+
+# Undelete
+'undeletelink' => 'Langutisa/thlerisela',
+'undeleteviewlink' => 'Langutisa',
+
 # Namespace form on various pages
-'invert'         => 'Invert selection',
+'namespace' => 'Swikhomela viti',
+'invert' => 'Invert selection',
 'blanknamespace' => '(Ntsindza)',
 
 # Contributions
 'contributions' => 'Minyikelo ya mutirhisi',
-'mycontris'     => 'Minyikelo ya mina',
-'contribsub2'   => 'For $1 ($2)',
-'nocontribs'    => 'Ku hava ku cinca loku kumiweke eka xiyenge lexi.',
-'uctop'         => '(Henhla)',
-'month'         => 'Kusukela e ka nhweti ya (kuya endhzaku):',
-'year'          => 'Ku sukela e ka lembe ra (kuya endhzaku):',
-
-'sp-contributions-newbies'     => 'Komba minyikela ya ti akhawunti tintswa ntsena',
+'mycontris' => 'Minyikelo ya mina',
+'contribsub2' => 'For $1 ($2)',
+'nocontribs' => 'Ku hava ku cinca loku kumiweke eka xiyenge lexi.',
+'uctop' => '(Henhla)',
+'month' => 'Kusukela e ka nhweti ya (kuya endhzaku):',
+'year' => 'Ku sukela e ka lembe ra (kuya endhzaku):',
+
+'sp-contributions-newbies' => 'Komba minyikela ya ti akhawunti tintswa ntsena',
 'sp-contributions-newbies-sub' => 'Eka ti akhawunti ti ntswa',
-'sp-contributions-talk'        => 'Mbulavulo',
-'sp-contributions-search'      => 'Lava minyikelo',
+'sp-contributions-talk' => 'Mbulavulo',
+'sp-contributions-search' => 'Lava minyikelo',
+'sp-contributions-submit' => 'Lava',
 
 # What links here
 'whatlinkshere' => 'Leswi khwekelaka laha',
+'whatlinkshere-title' => 'Matluka lama khwekelaka eka $1',
+'whatlinkshere-page' => 'Tluka:',
+'linkshere' => "Matluka lama landzelaka makhwekela eka '''[[:$1]]''':",
+'isredirect' => 'Tluka ro kongomisa',
+'isimage' => 'Xikhwekerisi xa fayili',
+'whatlinkshere-prev' => '{{PLURAL:$1|leri hundzeka| $1 lama hundzeke}}',
+'whatlinkshere-next' => '{{PLURAL:$1|lowu landzelaka| $1 leyi landzelaka}}',
+'whatlinkshere-links' => '← Swikhwekerisi',
+'whatlinkshere-hideredirs' => '$1 ya matluka yo thlerisela',
+'whatlinkshere-hidelinks' => '$1 wa swikhwekeri',
+'whatlinkshere-filters' => 'Tinhlelo',
 
 # Block/unblock
+'ipboptions' => "Ti awara timbirhi:2 hours,Siku rin'we:1 day,Masiku manharhu:3 days,Vhiki rin'we:1 week,Mavhiki manbirhi:2 weeks,Nhweti yin'we:1 month,Tinwheti tinharhu:3 months,Tinhweti ta ntsevu:6 months,Lembe rin'we:1 year,hilaha kungaheriki:infinite",
+'ipblocklist' => 'Vatirhisi lava siveriweke',
+'blocklink' => 'Sivela',
+'unblocklink' => 'Cinca kusivela',
+'change-blocklink' => 'Cinca xirhapa',
 'contribslink' => 'Minyikelo',
+'block-log-flags-nocreate' => 'Kupfula akhawunti swa arisiwa',
+
+# Move page
+'revertmove' => 'thlerisela',
+
+# Export
+'export' => 'Rhumela matluka ehandle ka wiki',
 
 # Namespace 8 related
 'allmessagesname' => 'Vito',
 
+# Thumbnails
+'thumbnail-more' => 'Kurisa',
+'thumbnail_error' => 'Kuvena xihoxo ekutumbuluxiweni ka xifaniso-ntongo hkwalaho ka: $1',
+
 # Tooltip help for the actions
-'tooltip-pt-userpage'     => 'Tluka ra vutirhisi',
-'tooltip-pt-mytalk'       => 'Mbulavulo namina',
-'tooltip-pt-preferences'  => 'Minyikelo ya mina',
-'tooltip-pt-mycontris'    => 'Nxaxamelo wa minyikelo ya mina',
-'tooltip-pt-logout'       => 'pfala u famba',
-'tooltip-ca-protect'      => 'Sirhelela tluka leri',
-'tooltip-ca-delete'       => 'Sula tluka leri',
-'tooltip-ca-move'         => 'Veka tluka endhzawini yinwana',
-'tooltip-ca-watch'        => 'Hoxa tluka leri eka leswi uswilanguteke',
-'tooltip-n-mainpage'      => 'Endzela tlukankulu',
+'tooltip-pt-userpage' => 'Tluka ra wena ra vutirhisi',
+'tooltip-pt-mytalk' => 'Tluka ro vulavula ra wena',
+'tooltip-pt-preferences' => 'Minyikelo ya mina',
+'tooltip-pt-watchlist' => 'Nxaxamelo wa matluka lawa umalanguteleke kucinca',
+'tooltip-pt-mycontris' => 'Nxaxamelo wa minyikelo hinkwayo ya wena',
+'tooltip-pt-login' => 'Utsundzuxiwa ku pfula unghena; hambiswiritano, aswi bohi',
+'tooltip-pt-logout' => 'pfala u famba',
+'tooltip-ca-talk' => 'Mbulavuriswano hi tluka',
+'tooltip-ca-edit' => 'Unga lulamisa tluka leri. Ukomberiwa ku komba kuringanisa ka ku cinca ka wena ungasi rihlayisa',
+'tooltip-ca-addsection' => 'Sungula xiyenge lexinthswa',
+'tooltip-ca-history' => 'Mindzulamiso yakhale ya tluka leri',
+'tooltip-ca-protect' => 'Sirhelela tluka leri',
+'tooltip-ca-delete' => 'Sula tluka leri',
+'tooltip-ca-move' => 'Veka tluka endhzawini yinwana',
+'tooltip-ca-watch' => 'Hoxa tluka leri eka leswi uswilanguteke',
+'tooltip-ca-unwatch' => 'Susa tluka leri eka leswi uswi languteke',
+'tooltip-search' => 'Lavisisa {{SITENAME}}',
+'tooltip-search-fulltext' => 'Lavisisa riviti leri eka matluka lawa',
+'tooltip-p-logo' => 'Vhakela tluka-nkulu',
+'tooltip-n-mainpage' => 'Endzela tlukankulu',
+'tooltip-n-mainpage-description' => 'Vhakela tlukankulu',
+'tooltip-n-portal' => 'Leswi engetelekeke hi phurojeki leyi, leswi undla swi endlaka, laha unga kumana kona switirhisiwa',
+'tooltip-n-currentevents' => 'Kuma vuxokoxoko hi leswi endlekaka sweswi',
+'tooltip-n-recentchanges' => 'Nxaxamelo wa kucinca ka sweswinyana eka wiki',
+'tooltip-n-randompage' => "Vona tluka rin'wana na rin'wana",
+'tooltip-n-help' => 'Ndzawu yo twisisa leswi',
 'tooltip-t-whatlinkshere' => 'Nxaxamelo wa matluka lama khwekelaka laha',
-'tooltip-t-upload'        => 'Khandziyisa tifayili',
-'tooltip-t-specialpages'  => 'Nxaxamelo wa matluka yo hlawuleka',
-'tooltip-ca-nstab-user'   => 'Vona tluka ra mutirhisi',
-'tooltip-save'            => 'Hlayiso ku cinca ka wena',
-'tooltip-preview'         => 'Ringanisa ku cinca loku uku endleke, Tirhisa Xitirhisiwa lexi ungasi hlayisa tluka leri!',
-'tooltip-summary'         => 'Tsala nkomiso',
+'tooltip-t-recentchangeslinked' => 'Kucinca kasweswinyana ka matluka la ma thlavinyetiweke eka tluka leri',
+'tooltip-t-contributions' => 'Nxaxamelo wa minyikelo ya mutirhisi loyi',
+'tooltip-t-upload' => 'Khandziyisa tifayili',
+'tooltip-t-specialpages' => 'Nxaxamelo wa matluka yo hlawuleka',
+'tooltip-t-print' => 'Gangliso wa tluka leri',
+'tooltip-t-permalink' => 'Xithlavinyeti xa nkarhi hinkwawo xa ndzulamiso wa tluka',
+'tooltip-ca-nstab-main' => 'Langutisa tluka ra matsalwa',
+'tooltip-ca-nstab-user' => 'Vona tluka ra mutirhisi',
+'tooltip-ca-nstab-special' => 'Tluka leri rihlawulekile, awu pfumeleriwanga ku endla ndzulamiso eka rona hikukongoma',
+'tooltip-ca-nstab-project' => 'Vona tluka ra phurojeki',
+'tooltip-ca-nstab-image' => 'Vona tluka ra fayili leyi',
+'tooltip-ca-nstab-template' => 'Langutisa xivumbiwa-ntirho',
+'tooltip-ca-nstab-category' => 'Langutisa tluka ra ntlawa',
+'tooltip-minoredit' => 'Fungha ndzulamiso lowu wuri lowu tsanana',
+'tooltip-save' => 'Hlayiso ku cinca ka wena',
+'tooltip-preview' => 'Ringanisa ku cinca loku uku endleke, Tirhisa Xitirhisiwa lexi ungasi hlayisa tluka leri!',
+'tooltip-diff' => 'Komba kucinca loku uku endleke aka xivulwa',
+'tooltip-compareselectedversions' => 'Vona kuhambana exikarhi ka mindzulamiso leyi uyilangeke ya tluka leri',
+'tooltip-watch' => 'Hoxa tluka leri eka nxaxamelo wa matluka lawa umalanguteke',
+'tooltip-rollback' => 'Xirhangi "Thlerisela" xita thlerisela ku cinca lokuendliweke hi mutirhisi wo hetelela eka tluka leri hi ku thlava kan\'we',
+'tooltip-summary' => 'Tsala nkomiso',
+
+# Bad image list
+'bad_image_list' => 'Minxaxamelo leyi landzelaka yi andlariwe hindlela leyi:
+
+nxaxamelo wa mintila (Mintila leyi sungulaka hi *) ntsena le yi kombiwaka.
+Xithlavinyeti xo sungula eka ntila i xithlavinyeta fayili leyi onhiweke.
+Swithlavinyeti leswi engetelekeke eka ntila lowu fanaka swilangutiwa swiri swihambukisi, hileswaku matluka lawa fiyili yinga kumekaka kona endzeni.',
+
+# Metadata
+'metadata-help' => 'Fayili leyi yi khome vuxokoxoko lebyi engetelekeke, swingaendleka yi hoxiwile kusuka eka Khemera kumbe muchini wo gandlisa lowu tirhisiweke ku yi tumbuluxa.
+Loko fayili yi antswisiwile kusukela eka matshamelo ya yona yo sungula, vuxokoxoko bya yona byinga va byi cincile.',
+
+# External editor support
+'edit-externally-help' => '(Vona [//www.mediawiki.org/wiki/Manual:External_editors swiletelo swo sungurisa] leswaku ukuma vuxokoxoko lebyi engetelekeke)',
+
+# 'all' in various places, this might be different for inflected languages
+'namespacesall' => 'Hinkwawo',
+'monthsall' => 'hikwato',
+
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Tivonele\'\'\' mpfungulo wo hluta wa "$2" wu rhangela lowa "$1"',
 
 # Special:SpecialPages
 'specialpages' => 'Matluka yo hlawuleka',
index 669acb8..a5aac59 100644 (file)
@@ -284,7 +284,7 @@ $messages = array(
 'site-atom-feed' => '$1 Atom Медээ Агымы',
 'page-rss-feed' => '«$1» RSS Медээ Агымы',
 'page-atom-feed' => '«$1» Atom Медээ Агымы',
-'red-link-title' => '$1 (арынны чок)',
+'red-link-title' => '$1 (арны чок)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Арын',
@@ -425,7 +425,7 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
 'newarticle' => '(Чаа)',
 'note' => "'''Тайылбыр:'''",
 'previewnote' => "'''Бо чүгле шенеп көөрү-дүр.'''
- Бижик ам-даа шыгжатынмаан! [[#editform|→ Continue editing]]",
+ Бижик ам-даа шыгжатынмаан!",
 'editing' => '«$1» деп арынны өскертип турар',
 'editingsection' => '«$1» деп арынның салбырын өскертип турар',
 'editingcomment' => '«$1» деп арынны өскертип турар (чаа салбыр)',
@@ -434,14 +434,17 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
 'templatesused' => 'Бо арында {{PLURAL:$1|Майык|Майыктар}} ажыглаттырган:',
 'template-protected' => '(камгалаан)',
 'template-semiprotected' => '(четпес камгалаан)',
-'moveddeleted-notice' => 'Бо арын ырадыпкан.
-The deletion and move log for the page are provided below for reference.',
+'permissionserrorstext-withaction' => "Мында «'''$2'''» силерниң эргеңер чок, {{PLURAL:$1|чылдагааны|чылдагааннары}}:",
+'moveddeleted-notice' => 'Бо арын ап каавыткан.
+Адаанда ап каавыткан биле өскээр адаан бижиктер шынзылгазын көргүскен.',
 
 # History pages
 'viewpagelogs' => 'Бо арынның журналын көргүзери',
 'nohistory' => 'Бо арынның өскерлиишкин төөгүзү чок.',
 'currentrev' => 'Амгы үе үндүрери',
+'currentrev-asof' => 'Амгы $1 үениң бижээни',
 'revisionasof' => '$1 версиязы',
+'revision-info' => '$2 киржикчиниң $1 хүнүнде киирилдези',
 'previousrevision' => '←Артык эрги үндүрери',
 'nextrevision' => 'Артык чаа үндүрери→',
 'currentrevisionlink' => 'Амгы үе үндүрери',
@@ -517,6 +520,7 @@ The deletion and move log for the page are provided below for reference.',
 'searchprofile-advanced-tooltip' => 'Айыткан аттар делгемнеринден дилээри',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сөс}})',
 'search-section' => '(«$1» деп салбыр)',
+'search-suggest' => 'Силер «$1» деп бодадыңар чадавас',
 'search-interwiki-more' => '(артык)',
 'search-mwsuggest-enabled' => 'саналдар',
 'search-mwsuggest-disabled' => 'саналдар чок',
@@ -751,6 +755,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'statistics' => 'Статистика',
 'statistics-pages' => 'Арыннар',
 
+'disambiguationspage' => 'Майык: уш-бажы билдинмес',
+
 'brokenredirects-edit' => 'өскертири',
 'brokenredirects-delete' => 'ырадыры',
 
@@ -782,6 +788,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'mostlinkedtemplates' => 'Эң холбаалар майыктар',
 'mostcategories' => 'Эңне бөлүктер арыннар',
 'mostimages' => 'Эң холбаалар файлдар',
+'prefixindex' => 'Арыннарның эгезиниң аайы-биле айтыкчы',
 'shortpages' => 'Чолдак арыннар',
 'longpages' => 'Узун арыннар',
 'protectedpages' => 'Камгалаган арыннар',
@@ -932,10 +939,14 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 # What links here
 'whatlinkshere' => 'Шөлүлгелерни бээр',
 'whatlinkshere-page' => 'Арын:',
+'isredirect' => 'шиглидер арын',
+'istemplate' => 'киирткен арыннар',
 'isimage' => 'файлдың холбаазы',
 'whatlinkshere-prev' => '{{PLURAL:$1|эрткен|эрткен $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|дараазында|дараазында $1}}',
 'whatlinkshere-links' => '← холбаалар',
+'whatlinkshere-hideredirs' => '$1-че шиглиглер',
+'whatlinkshere-hidetrans' => '$1 даңзылааннар',
 'whatlinkshere-hidelinks' => 'холбааларны $1',
 'whatlinkshere-hideimages' => 'Чурумалдың холбааларын $1',
 'whatlinkshere-filters' => 'Шүүрлер',
@@ -955,6 +966,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'ipblocklist-submit' => 'Дилээр',
 'infiniteblock' => 'кезээ-мөңгеде',
 'blocklink' => 'кызыгаарлаары',
+'unblocklink' => 'ажыдып хостаар',
 'change-blocklink' => 'кызыгаарлаашкынны өскертири',
 'contribslink' => 'немелделер',
 'blocklogpage' => 'Кызыгаарлаашкынның журналы',
@@ -1077,7 +1089,9 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 # Media information
 'widthheightpage' => '$1x$2, $3 {{PLURAL:$3|арын}}',
 'file-info-size' => '$1 × $2 пиксел, Файл хемчээли: $3, MIME янзызы: $4',
+'file-nohires' => 'Оон улуг хевири чок',
 'svg-long-desc' => 'SVG файл, $1 x $2 пиксел, файл хемчээли: $3',
+'show-big-image' => 'Улуг чурук',
 'show-big-image-size' => '$1 × $2 пиксел',
 
 # Special:NewFiles
index a3e3934..1c5a17c 100644 (file)
@@ -40,7 +40,7 @@ $namespaceGenderAliases = array();
 
 $linkTrail = '/^([a-zа-яёӝӟӥӧӵ“»]+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
-$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $messages = array(
 # User preference toggles
index e4ffdb9..695bd37 100644 (file)
@@ -922,12 +922,12 @@ $2
 'userpage-userdoesnotexist-view' => 'Обліковий запис користувача „$1“ не зареєстровано.',
 'blocked-notice-logextract' => 'Цей користувач наразі заблокований.
 Останній запис у журналі блокувань такий:',
-'clearyourcache' => "'''Ð\97аÑ\83важеннÑ\8f:''' Ð¿Ñ\96Ñ\81лÑ\8f Ð·Ð±ÐµÑ\80еженнÑ\8f Ð\92и Ð¼Ð°Ñ\94Ñ\82е Ñ\83никнÑ\83Ñ\82и Ð·Ð°Ð²Ð°Ð½Ñ\82аженнÑ\8f Ð· ÐºÐµÑ\88Ñ\83 Ð²Ð°Ñ\88ого браузера, щоб побачити зміни.
-* '''Firefox / Safari:''' тримайте ''Shift'', коли натискаєте ''Reload'' або натисніть ''Ctrl-F5'' або ''Ctrl-R'' (''⌘-R'' на Apple Mac)
+'clearyourcache' => "'''Увага:''' Ð\9fÑ\96Ñ\81лÑ\8f Ð·Ð±ÐµÑ\80еженнÑ\8f Ñ\81лÑ\96д Ð¾Ñ\87иÑ\81Ñ\82иÑ\82и ÐºÐµÑ\88 браузера, щоб побачити зміни.
+* '''Firefox / Safari:''' тримайте ''Shift'', коли натискаєте ''Оновити'', або натисніть ''Ctrl-F5'' чи ''Ctrl-Shift-R'' (''⌘-R'' на Apple Mac)
 * '''Google Chrome:''' натисніть ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Apple Mac)
-* '''Internet Explorer:''' тримайте ''Ctrl'', коли натискаєте ''Refresh'' або натисніть ''Ctrl-F5''
-* '''Konqueror:''' натисніть кнопку ''Reload'' або клавішу ''F5''
-* '''Opera:''' очистіть кеш за допомогою ''Tools → Preferences''",
+* '''Internet Explorer:''' тримайте ''Ctrl'', коли натискаєте ''Оновити'' або натисніть ''Ctrl-F5''
+* '''Konqueror:''' натисніть кнопку ''Оновити'' або клавішу ''F5''
+* '''Opera:''' очистіть кеш за допомогою ''Інструменти → Налаштування''",
 'usercssyoucanpreview' => "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.",
 'userjsyoucanpreview' => "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий код JavaScript перед збереженням.",
 'usercsspreview' => "'''Пам'ятайте, що це лише попередній перегляд вашого css-файлу.'''
@@ -941,8 +941,8 @@ $2
 Пам'ятайте, що користувацькі .css та .js сторінки повинні мати назву, що складається лише з малих літер, наприклад «{{ns:user}}:Хтось/vector.css», а не «{{ns:user}}:Хтось/Vector.css».",
 'updated' => '(Оновлена)',
 'note' => "'''Зауваження:'''",
-'previewnote' => "'''Це Ð»Ð¸Ñ\88е Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд,
-текст ще не збережений!'''",
+'previewnote' => "'''Ð\9fам'Ñ\8fÑ\82айÑ\82е, Ñ\89о Ñ\86е Ð»Ð¸Ñ\88е Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд.'''
+Ваші зміни ще не були збережені!",
 'previewconflict' => 'Цей попередній перегляд відображає текст з верхнього вікна редагування так, як він буде виглядіти, якщо ви вирішите зберегти його.',
 'session_fail_preview' => "'''Система не може зберегти ваші редагування, оскільки втрачені дані сеансу. Будь ласка, повторіть вашу спробу.
 Якщо помилка буде повторюватись, спробуйте [[Special:UserLogout|вийти з системи]] і зайти знову.'''",
@@ -955,6 +955,7 @@ $2
 Подібні проблеми можуть виникати при використанні анонімізуючих веб-проксі, що містять помилки.'''",
 'edit_form_incomplete' => "'''Частина даних із форми редагування не досягла сервера. Уважно перевірте чи не пошкоджено ваших правок і спробуйте ще раз.'''",
 'editing' => 'Редагування $1',
+'creating' => 'Створення $1',
 'editingsection' => 'Редагування $1 (розділ)',
 'editingcomment' => 'Редагування $1 (новий розділ)',
 'editconflict' => 'Конфлікт редагування: $1',
@@ -4095,4 +4096,15 @@ MediaWiki поширюється в надії, що вона буде кори
 'api-error-uploaddisabled' => 'Завантаження вимкнуто у цій вікі.',
 'api-error-verification-error' => 'Цей файл можливо пошкоджено, або він має неправильне розширення.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунда|секунди|секунд}}',
+'duration-minutes' => '$1 {{PLURAL:$1|хвилина|хвилини|хвилин}}',
+'duration-hours' => '$1 {{PLURAL:$1|година|години|годин}}',
+'duration-days' => '$1 {{PLURAL:$1|день|дні|днів}}',
+'duration-weeks' => '$1 {{PLURAL:$1|тиждень|тижні|тижнів}}',
+'duration-years' => '$1 {{PLURAL:$1|рік|роки|років}}',
+'duration-decades' => '$1 {{PLURAL:$1|десятиліття|десятиліття|десятиліть}}',
+'duration-centuries' => '$1 {{PLURAL:$1|століття|століття|століть}}',
+'duration-millennia' => '$1 {{PLURAL:$1|тисячоліття|тисячоліття|тисячоліть}}',
+
 );
index af3489a..57a1a94 100644 (file)
@@ -14,6 +14,7 @@
  * @author Rachitrali
  * @author Reedy
  * @author Wisesabre
+ * @author ZxxZxxZ
  * @author לערי ריינהארט
  * @author سمرقندی
  * @author محبوب عالم
@@ -902,7 +903,7 @@ HTML tags جانچئے.',
 'userrights' => 'حقوقِ صارف کی نظامت',
 'userrights-lookup-user' => 'گروہائے صارف کا انتظام',
 'userrights-user-editname' => 'کوئی اسم‌صارف داخل کیجئے:',
-'editinguser' => "تبدیلئ حقوق برائے صارف '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "تبدیلئ حقوق برائے صارف '''[[صارف:$1|$1]]''' $2",
 'userrights-groupsmember' => 'رکنِ:',
 'userrights-reason' => 'وجہ:',
 'userrights-no-interwiki' => 'دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.',
index 5523ea3..2b5966b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Uzbek (O'zbek)
+/** Uzbek (Oʻzbek)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -9,6 +9,8 @@
  *
  * @author Abdulla
  * @author Behzod Saidov <behzodsaidov@gmail.com>
+ * @author Casual
+ * @author Lyncos
  * @author Urhixidur
  */
 
@@ -48,237 +50,246 @@ $namespaceAliases = array(
 $linkTrail = '/^([a-zʻʼ“»]+)(.*)$/sDu';
 
 $messages = array(
+'underline-always' => 'Har doim',
+'underline-never' => 'Hech qachon',
+
 # Dates
-'sunday'        => 'Yakshanba',
-'monday'        => 'Dushanba',
-'tuesday'       => 'Seshanba',
-'wednesday'     => 'Chorshanba',
-'thursday'      => 'Payshanba',
-'friday'        => 'Juma',
-'saturday'      => 'Shanba',
-'sun'           => 'Yak',
-'mon'           => 'Dsh',
-'tue'           => 'Ssh',
-'wed'           => 'Chr',
-'thu'           => 'Pay',
-'fri'           => 'Jum',
-'sat'           => 'Shn',
-'january'       => 'yanvar',
-'february'      => 'fevral',
-'march'         => 'mart',
-'april'         => 'aprel',
-'may_long'      => 'may',
-'june'          => 'iyun',
-'july'          => 'iyul',
-'august'        => 'avgust',
-'september'     => 'sentabr',
-'october'       => 'oktabr',
-'november'      => 'noyabr',
-'december'      => 'dekabr',
-'january-gen'   => 'yanvarning',
-'february-gen'  => 'fevralning',
-'march-gen'     => 'martning',
-'april-gen'     => 'aprelning',
-'may-gen'       => 'mayning',
-'june-gen'      => 'iyunning',
-'july-gen'      => 'iyulning',
-'august-gen'    => 'avgustning',
+'sunday' => 'Yakshanba',
+'monday' => 'Dushanba',
+'tuesday' => 'Seshanba',
+'wednesday' => 'Chorshanba',
+'thursday' => 'Payshanba',
+'friday' => 'Juma',
+'saturday' => 'Shanba',
+'sun' => 'Yak',
+'mon' => 'Dsh',
+'tue' => 'Ssh',
+'wed' => 'Chr',
+'thu' => 'Pay',
+'fri' => 'Jum',
+'sat' => 'Shn',
+'january' => 'yanvar',
+'february' => 'fevral',
+'march' => 'mart',
+'april' => 'aprel',
+'may_long' => 'may',
+'june' => 'iyun',
+'july' => 'iyul',
+'august' => 'avgust',
+'september' => 'sentabr',
+'october' => 'oktabr',
+'november' => 'noyabr',
+'december' => 'dekabr',
+'january-gen' => 'yanvarning',
+'february-gen' => 'fevralning',
+'march-gen' => 'martning',
+'april-gen' => 'aprelning',
+'may-gen' => 'mayning',
+'june-gen' => 'iyunning',
+'july-gen' => 'iyulning',
+'august-gen' => 'avgustning',
 'september-gen' => 'sentabrning',
-'october-gen'   => 'oktabrning',
-'november-gen'  => 'noyabrning',
-'december-gen'  => 'dekabrning',
-'jan'           => 'yan',
-'feb'           => 'fev',
-'mar'           => 'mar',
-'apr'           => 'apr',
-'may'           => 'may',
-'jun'           => 'iyn',
-'jul'           => 'iyl',
-'aug'           => 'avg',
-'sep'           => 'sen',
-'oct'           => 'okt',
-'nov'           => 'noy',
-'dec'           => 'dek',
+'october-gen' => 'oktabrning',
+'november-gen' => 'noyabrning',
+'december-gen' => 'dekabrning',
+'jan' => 'yan',
+'feb' => 'fev',
+'mar' => 'mar',
+'apr' => 'apr',
+'may' => 'may',
+'jun' => 'iyn',
+'jul' => 'iyl',
+'aug' => 'avg',
+'sep' => 'sen',
+'oct' => 'okt',
+'nov' => 'noy',
+'dec' => 'dek',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Turkum|Turkumlar}}',
-'category_header'        => '"$1" turkumidagi maqolalar.',
-'subcategories'          => 'Ostturkumlar',
-'category-empty'         => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
-'hidden-categories'      => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
-'category-subcat-count'  => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
+'pagecategories' => '{{PLURAL:$1|Turkum|Turkumlar}}',
+'category_header' => '"$1" turkumidagi maqolalar.',
+'subcategories' => 'Ostturkumlar',
+'category-empty' => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
+'hidden-categories' => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
+'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
 'category-article-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta sahifa mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}}, hammasi boʻlib $2 ta sahifa mavjud.}}',
 'listingcontinuesabbrev' => 'davomi',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu',
 
-'about'      => 'Haqida',
-'newwindow'  => '(yangi oynada ochiladi)',
-'cancel'     => 'Voz kechish',
-'mytalk'     => 'Suhbatim',
-'anontalk'   => 'Bu IP uchun suhbat',
+'about' => 'Haqida',
+'newwindow' => '(yangi oynada ochiladi)',
+'cancel' => 'Voz kechish',
+'moredotdotdot' => 'Batafsil...',
+'mytalk' => 'Suhbatim',
+'anontalk' => 'Bu IP uchun suhbat',
 'navigation' => 'Saytda harakatlanish',
-'and'        => '&#32;va',
+'and' => '&#32;va',
 
 # Cologne Blue skin
-'qbedit'         => 'Tahrirlash',
+'qbedit' => 'Tahrirlash',
 'qbspecialpages' => 'Maxsus sahifalar',
 
 # Vector skin
-'vector-view-create'     => 'Yarat',
-'vector-view-edit'       => 'Tahrirla',
-'vector-view-history'    => 'Tarix',
-'vector-view-view'       => 'Mutolaa',
+'vector-action-delete' => 'O‘chirish',
+'vector-action-move' => 'Ko‘chirish',
+'vector-view-create' => 'Yarat',
+'vector-view-edit' => 'Tahrirla',
+'vector-view-history' => 'Tarix',
+'vector-view-view' => 'Mutolaa',
 'vector-view-viewsource' => 'Manbasini koʻrsat',
-'actions'                => 'Amallar',
-'namespaces'             => 'Nomfazolar',
-'variants'               => 'Variantlar',
-
-'errorpagetitle'   => 'Xato',
-'returnto'         => '$1 sahifasiga qaytish.',
-'tagline'          => '{{SITENAME}} dan',
-'help'             => 'Yordam',
-'search'           => 'Qidirish',
-'searchbutton'     => 'Qidirish',
-'go'               => "O'tish",
-'searcharticle'    => "O'tish",
-'history'          => 'Sahifa tarixi',
-'history_short'    => 'Tarix',
+'actions' => 'Amallar',
+'namespaces' => 'Nomfazolar',
+'variants' => 'Variantlar',
+
+'errorpagetitle' => 'Xato',
+'returnto' => '$1 sahifasiga qaytish.',
+'tagline' => '{{SITENAME}} dan',
+'help' => 'Yordam',
+'search' => 'Qidirish',
+'searchbutton' => 'Qidirish',
+'go' => "O'tish",
+'searcharticle' => 'O‘tish',
+'history' => 'Sahifa tarixi',
+'history_short' => 'Tarix',
 'printableversion' => 'Bosma uchun versiya',
-'permalink'        => 'Doimiy ishorat',
-'print'            => 'Chop et',
-'view'             => 'Koʻrish',
-'edit'             => 'Tahrirlash',
-'create'           => 'Yarat',
-'editthispage'     => 'Sahifani tahrirla',
+'permalink' => 'Doimiy ishorat',
+'print' => 'Chop et',
+'view' => 'Koʻrish',
+'edit' => 'Tahrirlash',
+'create' => 'Yaratish',
+'editthispage' => 'Sahifani tahrirlash',
 'create-this-page' => 'Bu sahifani yarat',
-'delete'           => "O'chirish",
-'protect'          => 'Himoyalash',
-'protectthispage'  => 'Bu sahifani himoyala',
-'unprotect'        => 'Himoyadan chiqarish',
-'newpage'          => 'Yangi sahifa',
-'talkpage'         => 'Bu sahifa haqida munozara',
+'delete' => 'O‘chirish',
+'protect' => 'Himoyalash',
+'protect_change' => 'o‘zgartirish',
+'protectthispage' => 'Ushbu sahifani himoyalash',
+'unprotect' => 'Himoyadan chiqarish',
+'newpage' => 'Yangi sahifa',
+'talkpage' => 'Bu sahifa haqida munozara',
 'talkpagelinktext' => 'Munozara',
-'specialpage'      => 'Maxsus sahifa',
-'personaltools'    => 'Shaxsiy uskunalar',
-'postcomment'      => 'Yangi boʻlim',
-'talk'             => 'Munozara',
-'views'            => "Ko'rinishlar",
-'toolbox'          => 'Asboblar',
-'categorypage'     => 'Turkum sahifasi',
-'viewtalkpage'     => 'Munozara',
-'otherlanguages'   => 'Boshqa tillarda',
-'redirectedfrom'   => '($1dan yoʻnaltirildi)',
-'redirectpagesub'  => 'Yoʻnaltiruvchi sahifa',
-'lastmodifiedat'   => 'Bu sahifa oxirgi marta $2, $1 sanasida tahrirlangan.',
-'viewcount'        => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
-'protectedpage'    => 'Himoyalangan sahifa',
-'jumpto'           => 'Oʻtish:',
+'specialpage' => 'Maxsus sahifa',
+'personaltools' => 'Shaxsiy uskunalar',
+'postcomment' => 'Yangi boʻlim',
+'talk' => 'Munozara',
+'views' => 'Ko‘rinishlar',
+'toolbox' => 'Asboblar',
+'categorypage' => 'Turkum sahifasi',
+'viewtalkpage' => 'Munozara',
+'otherlanguages' => 'Boshqa tillarda',
+'redirectedfrom' => '($1dan yoʻnaltirildi)',
+'redirectpagesub' => 'Yoʻnaltiruvchi sahifa',
+'lastmodifiedat' => 'Bu sahifa oxirgi marta $2, $1 sanasida tahrirlangan.',
+'viewcount' => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
+'protectedpage' => 'Himoyalangan sahifa',
+'jumpto' => 'Oʻtish:',
 'jumptonavigation' => 'foydalanish',
-'jumptosearch'     => 'Qidir',
+'jumptosearch' => 'Qidir',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => '{{SITENAME}} haqida',
-'aboutpage'            => 'Project:Haqida',
-'copyright'            => 'Kontent $1 ostidadir.',
-'currentevents'        => 'Joriy hodisalar',
-'currentevents-url'    => 'Project:Joriy hodisalar',
-'disclaimers'          => 'Ogohlantirishlar',
-'disclaimerpage'       => 'Project:Umumiy ogohlatirish',
-'edithelp'             => 'Tahrirlash yordami',
-'edithelppage'         => 'Help:Tahrirlash',
-'helppage'             => 'Help:Mundarija',
-'mainpage'             => 'Bosh sahifa',
+'aboutsite' => '{{SITENAME}} haqida',
+'aboutpage' => 'Project:Haqida',
+'copyright' => 'Kontent $1 ostidadir.',
+'currentevents' => 'Joriy hodisalar',
+'currentevents-url' => 'Project:Joriy hodisalar',
+'disclaimers' => 'Ogohlantirishlar',
+'disclaimerpage' => 'Project:Umumiy ogohlantirish',
+'edithelp' => 'Tahrirlash yordami',
+'edithelppage' => 'Help:Tahrirlash',
+'helppage' => 'Help:Mundarija',
+'mainpage' => 'Bosh sahifa',
 'mainpage-description' => 'Bosh sahifa',
-'portal'               => 'Jamoa portali',
-'portal-url'           => 'Project:Jamoa portali',
-'privacy'              => 'Konfidensiallik siyosati',
-'privacypage'          => 'Project:Konfidensiallik siyosati',
-
-'retrievedfrom'        => ' "$1" dan olindi',
-'youhavenewmessages'   => 'Sizga $1 keldi ($2).',
-'newmessageslink'      => 'yangi xabarlar',
-'newmessagesdifflink'  => 'soʻnggi oʻzgarish',
-'editsection'          => 'tahrirlash',
-'editold'              => 'tahrir',
-'editlink'             => 'tahrirla',
-'viewsourcelink'       => 'manbasini koʻr',
-'editsectionhint'      => 'Boʻlimni tahrirlash: $1',
-'toc'                  => 'Mundarija',
-'showtoc'              => "Ko'rsatish",
-'hidetoc'              => 'yashirish',
+'portal' => 'Jamoa portali',
+'portal-url' => 'Project:Jamoa portali',
+'privacy' => 'Konfidensiallik siyosati',
+'privacypage' => 'Project:Konfidensiallik siyosati',
+
+'retrievedfrom' => ' "$1" dan olindi',
+'youhavenewmessages' => 'Sizga $1 keldi ($2).',
+'newmessageslink' => 'yangi xabarlar',
+'newmessagesdifflink' => 'soʻnggi oʻzgarish',
+'editsection' => 'tahrirlash',
+'editold' => 'tahrir',
+'editlink' => 'tahrirla',
+'viewsourcelink' => 'manbasini koʻr',
+'editsectionhint' => 'Boʻlimni tahrirlash: $1',
+'toc' => 'Mundarija',
+'showtoc' => "Ko'rsatish",
+'hidetoc' => 'yashirish',
 'collapsible-collapse' => 'Yashir',
-'collapsible-expand'   => 'Koʻrsat',
-'red-link-title'       => '$1 (sahifa yaratilmagan)',
+'collapsible-expand' => 'Koʻrsat',
+'page-atom-feed' => '«$1» — Atom-lenta',
+'red-link-title' => '$1 (sahifa yaratilmagan)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Maqola',
-'nstab-user'     => 'Foydalanuvchi sahifasi',
-'nstab-special'  => 'Maxsus sahifa',
-'nstab-project'  => 'Loyiha sahifasi',
-'nstab-image'    => 'Fayl',
+'nstab-main' => 'Maqola',
+'nstab-user' => 'Foydalanuvchi sahifasi',
+'nstab-special' => 'Maxsus sahifa',
+'nstab-project' => 'Loyiha sahifasi',
+'nstab-image' => 'Fayl',
 'nstab-template' => 'Andoza',
-'nstab-help'     => 'Yordam sahifasi',
+'nstab-help' => 'Yordam sahifasi',
 'nstab-category' => 'Turkum',
 
 # General errors
-'error'             => 'Xato',
-'badtitle'          => 'Notoʻgʻri sarlavha',
-'viewsource'        => 'Manbasini koʻrish',
+'error' => 'Xato',
+'badtitle' => 'Notoʻgʻri sarlavha',
+'viewsource' => 'Manbasini koʻrish',
 'protectedpagetext' => 'Bu sahifa tahrirlashdan saqlanish maqsadida qulflangan.',
-'viewsourcetext'    => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
+'viewsourcetext' => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
 
 # Login and logout pages
-'logouttext'              => "'''Siz saytdan muvaffaqiyatli chiqdingiz.'''
+'logouttext' => "'''Siz saytdan muvaffaqiyatli chiqdingiz.'''
 
 {{SITENAME}} saytidan anonim holda foydalanishda davom etishindiz mumkin. Yoki siz yana hozirgi yoki boshqa foydalanuvchi nomi bilan qaytadan tizimga kirishingiz mumkin.
 Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguningizga qadar xuddi tizimga kirganingizdagidek ko'rinishda davom etaverishi mumkin.",
-'yourname'                => 'Foydalanuvchi nomi',
-'yourpassword'            => "Maxfiy so'z",
-'yourpasswordagain'       => "Maxfiy so'zni qayta kiriting",
-'remembermypassword'      => "Hisob ma'lumotlarini shu kompyuterda eslab qolish (for a maximum of $1 {{PLURAL:$1|day|days}})",
-'login'                   => 'Kirish',
+'yourname' => 'Foydalanuvchi nomi',
+'yourpassword' => 'Maxfiy soʻz',
+'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
+'remembermypassword' => 'Hisob ma’lumotlarini ushbu kompyuterda eslab qolish (eng ko‘pi bilan $1 {{PLURAL:$1|kun|kun}} uchun)',
+'login' => 'Kirish',
 'nav-login-createaccount' => 'Kirish / Hisob yaratish',
-'loginprompt'             => "{{SITENAME}}ga kirish uchun kukilar yoqilgan bo'lishi kerak.",
-'userlogin'               => 'Kirish / Hisob yaratish',
-'logout'                  => 'Chiqish',
-'userlogout'              => 'Chiqish',
-'nologin'                 => "Hisobingiz yoʻqmi? '''$1'''.",
-'nologinlink'             => 'Hisob yaratish',
-'createaccount'           => 'Hisob yaratish',
-'gotaccount'              => "Hisobingiz bormi? '''$1'''.",
-'gotaccountlink'          => 'Kirish',
-'loginsuccesstitle'       => 'Kirish muvaffaqiyatli amalga oshdi',
-'loginsuccess'            => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
-'wrongpassword'           => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
+'loginprompt' => "{{SITENAME}}ga kirish uchun kukilar yoqilgan bo'lishi kerak.",
+'userlogin' => 'Kirish / Hisob yaratish',
+'logout' => 'Chiqish',
+'userlogout' => 'Chiqish',
+'nologin' => "Hisobingiz yoʻqmi? '''$1'''.",
+'nologinlink' => 'Hisob yaratish',
+'createaccount' => 'Hisob yaratish',
+'gotaccount' => "Hisobingiz bormi? '''$1'''.",
+'gotaccountlink' => 'Kirish',
+'loginsuccesstitle' => 'Kirish muvaffaqiyatli amalga oshdi',
+'loginsuccess' => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
+'wrongpassword' => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
+'loginlanguagelabel' => 'Til: $1',
 
 # Change password dialog
 'retypenew' => 'Yangi mahfiy soʻzni qayta tering:',
 
 # Edit page toolbar
-'bold_sample'     => 'Qalin matn',
-'bold_tip'        => 'Qalin matn',
-'italic_sample'   => 'Kursiv',
-'italic_tip'      => 'Kursiv',
-'link_sample'     => 'Ishorat nomi',
-'link_tip'        => 'Ichki ishorat',
-'extlink_sample'  => 'http://www.example.com ishorat nomi',
-'extlink_tip'     => 'Tashqi ishorat (http:// prefiksini unutmang)',
+'bold_sample' => 'Qalin matn',
+'bold_tip' => 'Qalin matn',
+'italic_sample' => 'Kursiv',
+'italic_tip' => 'Kursiv',
+'link_sample' => 'Ishorat nomi',
+'link_tip' => 'Ichki ishorat',
+'extlink_sample' => 'http://www.example.com ishorat nomi',
+'extlink_tip' => 'Tashqi ishorat (http:// prefiksini unutmang)',
 'headline_sample' => 'Sarlavha',
-'image_tip'       => 'Qoʻshilgan tasvir',
-'media_tip'       => 'Faylga ishorat',
-'sig_tip'         => 'Imzoingiz va sana',
+'image_tip' => 'Qoʻshilgan tasvir',
+'media_tip' => 'Faylga ishorat',
+'sig_tip' => 'Imzoingiz va sana',
 
 # Edit pages
-'summary'                    => 'Qisqa izoh:',
-'minoredit'                  => 'Bu kichik tahrir',
-'watchthis'                  => 'Sahifani kuzatish',
-'savearticle'                => 'Saqlash',
-'preview'                    => "Ko'rib chiqish",
-'showpreview'                => "Ko'rib chiqish",
-'showdiff'                   => "O'zgarishlarni ko'rsatish",
-'anoneditwarning'            => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
-'blockedtext'                => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
+'summary' => 'Qisqa izoh:',
+'minoredit' => 'Bu kichik tahrir',
+'watchthis' => 'Sahifani kuzatish',
+'savearticle' => 'Saqlash',
+'preview' => 'Ko‘rib chiqish',
+'showpreview' => 'Ko‘rib chiqish',
+'showdiff' => 'O‘zgarishlarni ko‘rsatish',
+'anoneditwarning' => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
+'blockedtext' => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
 
 Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 
@@ -288,27 +299,27 @@ Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 Siz $1 yoki boshqa [[{{MediaWiki:Grouppage-sysop}}|administrator]] bilan bogʻlanib, arz qilishingiz mumkin.
 You cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
 Sizning hozirgi IP manzilingiz - $3, chetlashtirish raqamingiz - #$5. Arizaga bularni ilova qilishingiz mumkin.",
-'newarticle'                 => '(Yangi)',
-'newarticletext'             => "Bu sahifa hali mavjud emas.
+'newarticle' => '(Yangi)',
+'newarticletext' => "Bu sahifa hali mavjud emas.
 Sahifani yaratish uchun quyida matn kiritishingiz mumkin (qo'shimcha axborot uchun [[{{MediaWiki:Helppage}}|yordam sahifasini]] ko'ring).
 Agar bu sahifaga xatolik sabab kelgan bo'lsangiz brauzeringizning '''orqaga''' tugmasini bosing.",
-'noarticletext'              => 'Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli loglarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.',
-'clearyourcache'             => "'''Etibor bering:''' O'zgartirishlaringiz ko'rish uchun, yangi moslamalaringizning saqlashdan keyin, brauser keshini tozalash kerak:<br />
+'noarticletext' => 'Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli loglarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.',
+'clearyourcache' => "'''Etibor bering:''' O'zgartirishlaringiz ko'rish uchun, yangi moslamalaringizning saqlashdan keyin, brauser keshini tozalash kerak:<br />
 '''Mozilla / Firefox:''' ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari:''' ''Cmd+Shift+R'', '''Konqueror:''' ''F5'', '''Opera:''' ''Tools → Preferences'' orqali keshni tozalang.",
-'previewnote'                => "'''Bu shunchaki ko'rib chiqish. O'zgarishlar hali saqlangani yo'q!'''",
-'editing'                    => '$1 tahrirlanmoqda',
-'editingsection'             => '$1 (boʻlim) tahrirlanmoqda',
-'copyrightwarning'           => "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).
+'previewnote' => "'''Bu shunchaki ko‘rib chiqish. O‘zgartirishlar hali saqlangani yo‘q!'''",
+'editing' => '$1 tahrirlanmoqda',
+'editingsection' => '$1 (boʻlim) tahrirlanmoqda',
+'copyrightwarning' => "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).
 Agar yozganlaringiz keyinchalik tahrir qilinishi va qayta tarqatilishiga rozi bo'lmasangiz, u holda bu yerga yozmang.<br />
 Siz shuningdek bu yozganlaringiz sizniki yoki erkin litsenziya ostida ekanligini va'da qilmoqdasiz.
 '''MUALLIFLIK HUQUQLARI BILAN HIMOYALANGAN ISHLARNI ZINHOR BERUXSAT YUBORMANG!'''",
-'copyrightwarning2'          => "Iltimos, shuni esda tutingki, {{SITENAME}} sahifalaridagi barcha matnlar boshqa foydalanuvchilar tomonidan tahrirlanishi, almashtirilishi yoki o'chirilishi mumkin. Agar siz yozgan ma'lumotlaringizni bunday tartibda tahrirlanishiga rozi bo'lmasangiz, unda uni bu yerga joylashtirmang.<br />
+'copyrightwarning2' => "Iltimos, shuni esda tutingki, {{SITENAME}} sahifalaridagi barcha matnlar boshqa foydalanuvchilar tomonidan tahrirlanishi, almashtirilishi yoki o'chirilishi mumkin. Agar siz yozgan ma'lumotlaringizni bunday tartibda tahrirlanishiga rozi bo'lmasangiz, unda uni bu yerga joylashtirmang.<br />
 Bundan tashqari, siz ushbu ma'lumotlarni o'zingiz yozgan bo'lishingiz yoki ruxsat berilgan internet manzilidan yoki shu kabi erkin resursdan nusxa olgan bo'lishingiz lozim (Qo'shimcha ma'lumotlar ushun $1 sahifasiga murojaat qiling).
 '''MUALLIFLIK HUQUQI QO'YILGAN ISHLARNI RUXSATSIZ BU YERGA JOYLASHTIRMANG!'''",
-'templatesused'              => '{{PLURAL:$1|Template|Templates}} used on this page:',
-'template-protected'         => '(himoyalangan)',
-'template-semiprotected'     => '(yarim-himoyalangan)',
-'nocreatetext'               => 'Ushbu sayt yangi sahifa yaratishni taqiqlagan.
+'templatesused' => 'Ushbu sahifada foydalanilgan {{PLURAL:$1|andoza|andozalar}}:',
+'template-protected' => '(himoyalangan)',
+'template-semiprotected' => '(yarim-himoyalangan)',
+'nocreatetext' => 'Ushbu sayt yangi sahifa yaratishni taqiqlagan.
 Ortga qaytib, mavjud sahifani tahrirlashingiz yoki [[Special:UserLogin|tizimga kirishingiz]] mumkin.',
 'recreate-moveddeleted-warn' => "'''Diqqat: Siz avval yoʻqotilgan sahifani yana yaratmoqchisiz.'''
 
@@ -316,136 +327,150 @@ Bu sahifani yaratishda davom etishdan avval uning nega avval yoʻqotilgani bilan
 Qulaylik uchun quyida yoʻqotilish qaydlari keltirilgan:",
 
 # History pages
-'viewpagelogs'        => 'Ushbu sahifaga doir qaydlarni koʻrsat',
-'currentrev'          => 'Hozirgi koʻrinishi',
-'currentrev-asof'     => '$1dagi, joriy koʻrinishi',
-'revisionasof'        => '$1 paytdagi koʻrinishi',
-'previousrevision'    => '←Avvalgi koʻrinishi',
-'nextrevision'        => 'Yangiroq koʻrinishi→',
+'viewpagelogs' => 'Ushbu sahifaga doir qaydlarni koʻrsat',
+'currentrev' => 'Hozirgi koʻrinishi',
+'currentrev-asof' => '$1dagi, joriy koʻrinishi',
+'revisionasof' => '$1 paytdagi koʻrinishi',
+'previousrevision' => '←Avvalgi koʻrinishi',
+'nextrevision' => 'Yangiroq koʻrinishi→',
 'currentrevisionlink' => 'Hozirgi koʻrinishi',
-'cur'                 => 'joriy',
-'next'                => 'keyingi',
-'last'                => 'oxirgi',
-'histlegend'          => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
+'cur' => 'joriy',
+'next' => 'keyingi',
+'last' => 'oxirgi',
+'histlegend' => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
 Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 (oxirgi) = avvalgi koʻrinish bilan farq, k = kichkina tahrir.',
-'histfirst'           => 'Eng avvalgi',
-'histlast'            => 'Eng soʻnggi',
+'history-show-deleted' => 'Faqat o‘chirilganlari',
+'histfirst' => 'Eng avvalgi',
+'histlast' => 'Eng soʻnggi',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 $2 da',
 
 # Revision deletion
 'rev-delundel' => 'koʻrsat/yashir',
 
 # Diffs
-'history-title'           => '"$1"ning tarixi',
-'difference'              => '(Koʻrinishlar orasidagi farq)',
-'lineno'                  => 'Qator $1:',
+'history-title' => '"$1"ning tarixi',
+'difference' => '(Koʻrinishlar orasidagi farq)',
+'lineno' => 'Qator $1:',
 'compareselectedversions' => 'Tanlangan versiyalarni solishtir',
-'editundo'                => 'qaytar',
+'editundo' => 'qaytar',
 
 # Search results
-'searchresults'                  => 'Qidiruv natijalari',
-'searchresults-title'            => '"$1" uchun qidiruv natijalari',
-'searchresulttext'               => "{{SITENAME}}da qidirish haqida qo'shimcha ma'lumotga ega bo'lishini xoxlasangiz, [[{{MediaWiki:Helppage}}|{{SITENAME}}da qidiruv]] sahifasini o'qing.",
-'searchsubtitle'                 => '\'\'\'[[:$1]]\'\'\'ni qidirdingiz ([[Special:Prefixindex/$1|"$1" bilan boshlanadigan sahifalar]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"ga bogʻlangan sahifalar]])',
-'searchsubtitleinvalid'          => "'''$1'''ni qidirdingiz",
-'notitlematches'                 => 'Bunday sarlavha topilmadi',
-'notextmatches'                  => 'Bunday matn topilmadi',
-'prevn'                          => 'oldingi $1',
-'nextn'                          => 'keyingi {{PLURAL:$1|$1}}',
-'prevn-title'                    => 'Avvalgi $1 {{PLURAL:$1|natija|natijalar}}',
-'nextn-title'                    => 'Keyingi $1 {{PLURAL:$1|natija|natijalar}}',
-'shown-title'                    => 'Har sahifada $1 natija koʻrsat',
-'viewprevnext'                   => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-new'                 => "'''Ushbu vikida \"[[:\$1]]\" sahifani yarat!'''",
-'searchhelp-url'                 => 'Help:Mundarija',
-'searchprofile-everything'       => 'Har yerda',
+'searchresults' => 'Qidiruv natijalari',
+'searchresults-title' => '"$1" uchun qidiruv natijalari',
+'searchresulttext' => "{{SITENAME}}da qidirish haqida qo'shimcha ma'lumotga ega bo'lishini xoxlasangiz, [[{{MediaWiki:Helppage}}|{{SITENAME}}da qidiruv]] sahifasini o'qing.",
+'searchsubtitle' => '\'\'\'[[:$1]]\'\'\'ni qidirdingiz ([[Special:Prefixindex/$1|"$1" bilan boshlanadigan sahifalar]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"ga bogʻlangan sahifalar]])',
+'searchsubtitleinvalid' => "'''$1'''ni qidirdingiz",
+'notitlematches' => 'Bunday sarlavha topilmadi',
+'notextmatches' => 'Bunday matn topilmadi',
+'prevn' => 'oldingi $1',
+'nextn' => 'keyingi {{PLURAL:$1|$1}}',
+'prevn-title' => 'Avvalgi $1 {{PLURAL:$1|natija|natijalar}}',
+'nextn-title' => 'Keyingi $1 {{PLURAL:$1|natija|natijalar}}',
+'shown-title' => 'Har sahifada $1 natija koʻrsat',
+'viewprevnext' => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifani yarat!'''",
+'searchhelp-url' => 'Help:Mundarija',
+'searchprofile-articles' => 'Asosiy sahifalar',
+'searchprofile-images' => 'Multimediya',
+'searchprofile-everything' => 'Har yerda',
+'searchprofile-advanced' => 'Kengaytirilgan',
 'searchprofile-articles-tooltip' => '$1da qidir',
-'searchprofile-project-tooltip'  => '$1da qidir',
-'searchprofile-images-tooltip'   => 'Fayllarni qidir',
-'search-result-size'             => '$1 ({{PLURAL:$2|1 soʻz|$2 soʻz}})',
-'search-redirect'                => '(yoʻnaltirish $1)',
-'search-section'                 => '($1 boʻlimi)',
-'search-suggest'                 => 'Balki buni nazarda tutgandirsiz: $1',
-'search-interwiki-default'       => '$1 natijalar:',
-'searchall'                      => 'barchasi',
-'showingresults'                 => "#<b>$2</b> boshlanayotgan <b>$1</b> natijalar ko'rsatilyapti.",
-'showingresultsheader'           => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
-'powersearch'                    => 'Qidiruv',
-'powersearch-ns'                 => 'Bu nom-fazolarda izla:',
-'powersearch-redir'              => 'Yoʻnaltirishlarni koʻrsat',
-'powersearch-field'              => 'Qidir',
+'searchprofile-project-tooltip' => '$1da qidir',
+'searchprofile-images-tooltip' => 'Fayllarni qidir',
+'search-result-size' => '$1 ({{PLURAL:$2|1 soʻz|$2 soʻz}})',
+'search-redirect' => '(yoʻnaltirish $1)',
+'search-section' => '($1 boʻlimi)',
+'search-suggest' => 'Balki buni nazarda tutgandirsiz: $1',
+'search-interwiki-default' => '$1 natijalar:',
+'searchall' => 'barchasi',
+'showingresults' => "#<b>$2</b> boshlanayotgan <b>$1</b> natijalar ko'rsatilyapti.",
+'showingresultsheader' => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
+'powersearch' => 'Qidiruv',
+'powersearch-ns' => 'Bu nom-fazolarda izla:',
+'powersearch-redir' => 'Yoʻnaltirishlarni koʻrsat',
+'powersearch-field' => 'Qidir',
 
 # Preferences page
-'preferences'       => 'Moslamalar',
-'mypreferences'     => 'Moslamalarim',
-'prefs-skin'        => "Tashqi ko'rinish",
-'prefs-datetime'    => 'Sana va vaqt',
-'prefs-personal'    => "Shaxsiy ma'lumotlar",
-'prefs-rc'          => "Yangi o'zgartirishlar",
-'prefs-watchlist'   => "Kuzatuv ro'yxati",
-'prefs-misc'        => 'Boshqa moslamalar',
-'saveprefs'         => 'Saqlash',
-'resetprefs'        => 'Bekor qilish',
-'prefs-editing'     => 'Tahrirlash',
+'preferences' => 'Moslamalar',
+'mypreferences' => 'Moslamalarim',
+'prefs-skin' => 'Tashqi ko‘rinish',
+'prefs-datetime' => 'Sana va vaqt',
+'prefs-personal' => 'Shaxsiy ma’lumotlar',
+'prefs-rc' => 'Yangi o‘zgartirishlar',
+'prefs-watchlist' => "Kuzatuv ro'yxati",
+'prefs-misc' => 'Boshqa moslamalar',
+'saveprefs' => 'Saqlash',
+'resetprefs' => 'Bekor qilish',
+'prefs-editing' => 'Tahrirlash',
 'searchresultshead' => 'Qidiruv natijalari',
-'prefs-files'       => 'Fayllar',
-'yourrealname'      => 'Haqiqiy ism *:',
+'prefs-files' => 'Fayllar',
+'youremail' => 'E-mail:',
+'yourrealname' => 'Haqiqiy ism *:',
 
 # Groups
 'group-sysop' => 'Administratorlar',
 
 'grouppage-sysop' => '{{ns:project}}:Administratorlar',
 
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'ushbu sahifani tahrirlash',
+
 # Recent changes
-'recentchanges'     => "Yangi o'zgartirishlar",
-'recentchangestext' => "Bu sahifada siz oxirgi o'zgartirishlarni ko'rishingiz mumkin.",
-'rcnote'            => "Quyida $5, $4ga koʻra oxirgi {{PLURAL:$2|kun|'''$2''' kun}} davomida sodir boʻlgan {{PLURAL:$1|'''1''' oʻzgartirish|'''$1''' oʻzgartirishlar}} koʻrsatilgan.",
-'rclistfrom'        => "$1dan boshlab yangi o'zgartirishlarni ko'rsat.",
-'rcshowhideminor'   => 'Kichik tahrirlarni $1',
-'rcshowhidebots'    => 'Botlarni $1',
-'rcshowhideliu'     => "Ro'yxatdan o'tgan foydalanuvchilarni $1",
-'rcshowhideanons'   => 'Anonim foydalanuvchilarni $1',
-'rcshowhidepatr'    => 'Tekshirilgan tahrirlarni $1',
-'rcshowhidemine'    => "O'z tahrirlarimni $1",
-'rclinks'           => "Oxirgi $2 kun davomida sodir bo'lgan $1 o'zgartirishlarni ko'rsat.<br />$3",
-'diff'              => 'farq',
-'hist'              => 'tarix',
-'hide'              => 'yashirish',
-'show'              => 'koʻrsat',
-'minoreditletter'   => 'k',
-'newpageletter'     => 'Y',
+'recentchanges' => 'Yangi o‘zgartirishlar',
+'recentchangestext' => 'Ushbu sahifada siz eng so‘nggi o‘zgartirishlarni ko‘rishingiz mumkin.',
+'rcnote' => "Quyida $5, $4ga koʻra oxirgi {{PLURAL:$2|kun|'''$2''' kun}} davomida sodir boʻlgan {{PLURAL:$1|'''1''' oʻzgartirish|'''$1''' oʻzgartirishlar}} koʻrsatilgan.",
+'rclistfrom' => "$1dan boshlab yangi o'zgartirishlarni ko'rsat.",
+'rcshowhideminor' => 'Kichik tahrirlarni $1',
+'rcshowhidebots' => '$1 ta bot',
+'rcshowhideliu' => 'Ro‘yxatdan o‘tgan foydalanuvchilar: $1 ta',
+'rcshowhideanons' => 'Anonim foydalanuvchilar: $1 ta',
+'rcshowhidepatr' => 'Tekshirilgan tahrirlarni $1',
+'rcshowhidemine' => "O'z tahrirlarimni $1",
+'rclinks' => "Oxirgi $2 kun davomida sodir bo'lgan $1 o'zgartirishlarni ko'rsat.<br />$3",
+'diff' => 'farq',
+'hist' => 'tarix',
+'hide' => 'yashirish',
+'show' => 'koʻrsat',
+'minoreditletter' => 'k',
+'newpageletter' => 'Y',
 
 # Recent changes linked
-'recentchangeslinked'          => "Bog'langan o'zgarishlar",
-'recentchangeslinked-toolbox'  => 'Bogʻliq oʻzgarishlar',
-'recentchangeslinked-title'    => '"$1"ga aloqador oʻzgarishlar',
+'recentchangeslinked' => "Bog'langan o'zgarishlar",
+'recentchangeslinked-toolbox' => 'Bogʻliq oʻzgarishlar',
+'recentchangeslinked-title' => '"$1"ga aloqador oʻzgarishlar',
 'recentchangeslinked-noresult' => 'Berilgan davrda bogʻlangan sahifalarda oʻzgarishlar boʻlmagan.',
-'recentchangeslinked-summary'  => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
+'recentchangeslinked-summary' => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
+'recentchangeslinked-page' => 'Sahifa nomi:',
 
 # Upload
-'upload'        => 'Fayl yuklash',
-'uploadbtn'     => 'Fayl yukla',
+'upload' => 'Fayl yuklash',
+'uploadbtn' => 'Fayl yukla',
 'uploadlogpage' => 'Yuklash qaydlari',
+'filedesc' => 'Qisqa izoh',
 'uploadedimage' => '"[[$1]]" yuklandi',
 
 # Special:ListFiles
 'listfiles' => 'Fayllar roʻyxati',
 
 # File description page
-'file-anchor-link'          => 'Fayl',
-'filehist'                  => 'Fayl tarixi',
-'filehist-help'             => 'Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.',
-'filehist-current'          => 'joriy',
-'filehist-datetime'         => 'Sana/Vaqt',
-'filehist-user'             => 'Foydalanuvchi',
-'filehist-dimensions'       => 'Oʻlchamlari',
-'filehist-filesize'         => 'Fayl hajmi',
-'filehist-comment'          => 'Izoh',
-'imagelinks'                => 'Fayllarga ishoratlar',
-'linkstoimage'              => 'Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:',
-'nolinkstoimage'            => 'Bu faylga bogʻlangan sahifalar yoʻq.',
-'sharedupload'              => 'This file is from $1 and may be used by other projects.',
-'sharedupload-desc-here'    => 'Ushbu fayl $1dan boʻlib, boshqa loyihalarda ham ishlatilishi mumkin.
+'file-anchor-link' => 'Fayl',
+'filehist' => 'Fayl tarixi',
+'filehist-help' => 'Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.',
+'filehist-current' => 'joriy',
+'filehist-datetime' => 'Sana/Vaqt',
+'filehist-thumb' => 'Miniatyura',
+'filehist-user' => 'Foydalanuvchi',
+'filehist-dimensions' => 'Oʻlchamlari',
+'filehist-filesize' => 'Fayl hajmi',
+'filehist-comment' => 'Izoh',
+'imagelinks' => 'Fayllarga ishoratlar',
+'linkstoimage' => 'Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:',
+'nolinkstoimage' => 'Bu faylga bogʻlangan sahifalar yoʻq.',
+'sharedupload' => 'This file is from $1 and may be used by other projects.',
+'sharedupload-desc-here' => 'Ushbu fayl $1dan boʻlib, boshqa loyihalarda ham ishlatilishi mumkin.
 Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'uploadnewversion-linktext' => 'Bu faylning yangi versiyasini yukla',
 
@@ -456,226 +481,245 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'randompage' => 'Tasodifiy sahifa',
 
 # Statistics
-'statistics'              => 'Statistika',
+'statistics' => 'Statistika',
 'statistics-header-users' => 'Foydalanuvchilar statistikasi',
 
 'disambiguationspage' => '{{ns:template}}:Disambig',
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 bayt',
-'ncategories'             => '$1 {{PLURAL:$1|turkum|turkumlar}}',
-'lonelypages'             => 'Yetim sahifalar',
-'uncategorizedpages'      => 'Turkumlashtirilmagan sahifalar',
+'nbytes' => '$1 bayt',
+'ncategories' => '$1 {{PLURAL:$1|turkum|turkumlar}}',
+'lonelypages' => 'Yetim sahifalar',
+'uncategorizedpages' => 'Turkumlashtirilmagan sahifalar',
 'uncategorizedcategories' => 'Turkumlashtirilmagan turkumlar',
-'uncategorizedimages'     => 'Kategoriyasiz tasvirlar',
-'uncategorizedtemplates'  => 'Turkumlashtirilmagan andozalar',
-'unusedcategories'        => 'Ishlatilinmagan turkumlar',
-'unusedimages'            => 'Ishlatilinmagan fayllar',
-'wantedcategories'        => 'Talab qilinayotgan turkumlar',
-'mostcategories'          => 'Eng koʻp turkumli sahifalar',
-'protectedpages'          => 'Himoyalangan sahifalar',
-'listusers'               => 'Foydalanuvchilar roʻyxati',
-'newpages'                => 'Yangi sahifalar',
-'move'                    => "Ko'chirish",
-'movethispage'            => 'Bu sahifani koʻchir',
-'pager-newer-n'           => '{{PLURAL:$1|yangiroq 1|yangiroq $1}}',
-'pager-older-n'           => '{{PLURAL:$1|eskiroq 1|eskiroq $1}}',
+'uncategorizedimages' => 'Kategoriyasiz tasvirlar',
+'uncategorizedtemplates' => 'Turkumlashtirilmagan andozalar',
+'unusedcategories' => 'Ishlatilinmagan turkumlar',
+'unusedimages' => 'Ishlatilinmagan fayllar',
+'wantedcategories' => 'Talab qilinayotgan turkumlar',
+'mostcategories' => 'Eng koʻp turkumli sahifalar',
+'protectedpages' => 'Himoyalangan sahifalar',
+'listusers' => 'Foydalanuvchilar roʻyxati',
+'newpages' => 'Yangi sahifalar',
+'move' => 'Ko‘chirish',
+'movethispage' => 'Bu sahifani koʻchir',
+'pager-newer-n' => '{{PLURAL:$1|yangiroq 1|yangiroq $1}}',
+'pager-older-n' => '{{PLURAL:$1|eskiroq 1|eskiroq $1}}',
+
+# Book sources
+'booksources-go' => 'O‘tish',
 
 # Special:Log
-'log'           => 'Qaydlar',
+'log' => 'Qaydlar',
 'all-logs-page' => 'Barcha qaydlar',
 
 # Special:AllPages
-'allpages'       => 'Barcha sahifalar',
+'allpages' => 'Barcha sahifalar',
 'alphaindexline' => '$1 dan $2 ga',
-'nextpage'       => 'Keyingi sahifa ($1)',
-'prevpage'       => 'Avvalgi sahifa ($1)',
-'allpagesfrom'   => 'Sahifalarni koʻrsat:',
-'allarticles'    => 'Barcha sahifalar',
-'allpagesnext'   => 'Keyingi',
+'nextpage' => 'Keyingi sahifa ($1)',
+'prevpage' => 'Avvalgi sahifa ($1)',
+'allpagesfrom' => 'Sahifalarni koʻrsat:',
+'allarticles' => 'Barcha sahifalar',
+'allpagesnext' => 'Keyingi',
 'allpagessubmit' => 'Oʻt',
 'allpagesprefix' => 'Bunday prefiksli sahifalarni koʻrsat:',
 
 # Special:Categories
-'categories'         => 'Turkumlar',
+'categories' => 'Turkumlar',
 'categoriespagetext' => 'The following {{PLURAL:$1|category contains|categories contain}} pages or media.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
+# Special:ListGroupRights
+'listgrouprights-members' => '(a’zolar ro‘yxati)',
+
 # E-mail user
 'emailuser' => 'Bu foydalanuvchiga e-maktub joʻnat',
 
 # Watchlist
-'watchlist'        => 'Kuzatuv roʻyxatim',
-'mywatchlist'      => 'Kuzatuv roʻyxatim',
-'nowatchlist'      => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
-'addedwatchtext'   => "\"[[:\$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv ro'yxatingizga]] qo'shildi. Bu sahifada va unga mos munozara sahifasida bo'ladigan kelajakdagi o'zgarishlar bu yerda ro'yxatga olinadi, hamda bu sahifa topish qulay bo'lishi uchun [[Special:RecentChanges|yangi o'zgarishlar ro'yxati]]da '''qalin''' harflar bilan ko'rsatiladi.
+'watchlist' => 'Kuzatuv roʻyxatim',
+'mywatchlist' => 'Kuzatuv roʻyxatim',
+'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
+'addedwatchtext' => "\"[[:\$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv ro'yxatingizga]] qo'shildi. Bu sahifada va unga mos munozara sahifasida bo'ladigan kelajakdagi o'zgarishlar bu yerda ro'yxatga olinadi, hamda bu sahifa topish qulay bo'lishi uchun [[Special:RecentChanges|yangi o'zgarishlar ro'yxati]]da '''qalin''' harflar bilan ko'rsatiladi.
 
 Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmaslik\" yozuvini bosing.",
 'removedwatchtext' => '"[[:$1]]" sahifasi kuzatuv ro\'yxatingizdan o\'chirildi.',
-'watch'            => 'kuzatish',
-'watchthispage'    => 'Sahifani kuzatish',
-'unwatch'          => 'kuzatmaslik',
-'wlnote'           => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
-'wlshowlast'       => "Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko'rsatish. $3 tahrirlarni ko'rsatish",
+'watch' => 'kuzatish',
+'watchthispage' => 'Sahifani kuzatish',
+'unwatch' => 'kuzatmaslik',
+'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
+'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko‘rsatish. $3 tahrirlarni ko‘rsatish',
 
 # Delete
-'actioncomplete'        => 'Bajarildi',
-'deletedtext'           => '"$1" yoʻqotildi.
+'actioncomplete' => 'Bajarildi',
+'actionfailed' => 'Jarayon amalga oshmadi',
+'deletedtext' => '"$1" yoʻqotildi.
 Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
-'dellogpage'            => 'Yoʻqotish qaydlari',
-'deletecomment'         => 'Sabab:',
-'deleteotherreason'     => 'Boshqa/qoʻshimcha sabab:',
+'dellogpage' => 'Yoʻqotish qaydlari',
+'deletecomment' => 'Sabab:',
+'deleteotherreason' => 'Boshqa/qoʻshimcha sabab:',
 'deletereasonotherlist' => 'Boshqa sabab',
 
 # Rollback
 'rollbacklink' => 'eski holiga keltir',
 
 # Protect
-'protectlogpage'         => 'Himoyalash qaydlari',
-'protect-level-sysop'    => 'Faqat administratorlar uchun',
+'protectlogpage' => 'Himoyalash qaydlari',
+'protect-level-sysop' => 'Faqat administratorlar uchun',
 'protect-expiry-options' => '2 soat:2 hours,1 kun:1 day,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Tahrirlash',
 
 # Undelete
-'undeletebtn'  => 'Qayta tikla',
-'undeletelink' => 'tikla',
+'undeletebtn' => 'Qayta tikla',
+'undeletelink' => 'ko‘rib chiqish/tiklash',
+'undeleteviewlink' => "ko'rib chiqish",
 
 # Namespace form on various pages
 'namespace' => 'Soha:',
-'invert'    => 'Tanlash tartibini almashtirish',
+'invert' => 'Tanlash tartibini almashtirish',
+'blanknamespace' => '(asosiy)',
 
 # Contributions
 'contributions' => 'Foydalanuvchining hissasi',
-'mycontris'     => 'Hissam',
-'contribsub2'   => '$1 uchun ($2)',
+'mycontris' => 'Hissam',
+'contribsub2' => '$1 uchun ($2)',
 
-'sp-contributions-newbies'  => 'Faqatgina yangi foydalanuvchilarning hissalarini koʻrsat',
+'sp-contributions-newbies' => 'Faqatgina yangi foydalanuvchilarning hissalarini koʻrsat',
 'sp-contributions-blocklog' => 'Chetlashtirish qaydlari',
-'sp-contributions-talk'     => 'Munozara',
-'sp-contributions-search'   => 'Hissalarni qidir',
+'sp-contributions-talk' => 'munozara',
+'sp-contributions-search' => 'Hissalarni qidir',
 'sp-contributions-username' => 'IP manzil yoki foydalanuvchi ismi:',
-'sp-contributions-submit'   => 'Qidir',
+'sp-contributions-submit' => 'Qidir',
 
 # What links here
-'whatlinkshere'       => "Bu sahifaga bog'langan sahifalar",
+'whatlinkshere' => "Bu sahifaga bog'langan sahifalar",
 'whatlinkshere-title' => '"$1"ga bogʻlangan sahifalar',
-'linkshere'           => "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bog'langan:",
-'nolinkshere'         => "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog'lanmagan.",
-'isredirect'          => 'yoʻnaltiruvchi sahifa',
-'istemplate'          => 'qoʻshimcha',
+'whatlinkshere-page' => 'Sahifa:',
+'linkshere' => "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bog'langan:",
+'nolinkshere' => "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
+'isredirect' => 'yoʻnaltiruvchi sahifa',
+'istemplate' => 'qoʻshimcha',
 'whatlinkshere-links' => '← ishoratlar',
+'whatlinkshere-filters' => 'Filtrlar',
 
 # Block/unblock
-'blockip'      => 'Foydalanuvchini chetlashtir',
-'ipboptions'   => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
-'ipblocklist'  => 'Chetlashtirilgan IP manzillari va foydalanuvchilar',
-'blocklink'    => 'chetlashtir',
+'blockip' => 'Foydalanuvchini chetlashtir',
+'ipboptions' => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
+'ipblocklist' => 'Chetlashtirilgan IP manzillari va foydalanuvchilar',
+'blocklink' => 'chetlashtir',
 'contribslink' => 'hissasi',
 'blocklogpage' => 'Chetlashtirish qaydlari',
 
 # Move page
-'movearticle'    => "Sahifani ko'chirish",
-'movepagebtn'    => 'Sahifani koʻchir',
-'pagemovedsub'   => 'Koʻchirildi',
+'movearticle' => "Sahifani ko'chirish",
+'movepagebtn' => 'Sahifani koʻchir',
+'pagemovedsub' => 'Koʻchirildi',
 'movepage-moved' => '\'\'\'"$1" nomli sahifa "$2" nomli sahifaga koʻchirildi\'\'\'',
-'movelogpage'    => 'Koʻchirish qaydlari',
-'movereason'     => 'Sabab:',
-'revertmove'     => 'qaytar',
+'movelogpage' => 'Koʻchirish qaydlari',
+'movereason' => 'Sabab:',
+'revertmove' => 'qaytar',
+
+# Export
+'export' => 'Sahifalar eksporti',
+
+# Namespace 8 related
+'allmessagesname' => 'Ism',
 
 # Thumbnails
 'thumbnail-more' => 'Kattalashtir',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Foydalanuvchi sahifangiz',
-'tooltip-pt-anonuserpage'         => 'Siznig ip manzilingiz foydalanuvchi sahifasi',
-'tooltip-pt-mytalk'               => 'Suhbat sahifangiz',
-'tooltip-pt-anontalk'             => 'Bu ip manzildan amalga oshirilgan tahrirlar munozarasi',
-'tooltip-pt-preferences'          => 'Moslamalaringiz',
-'tooltip-pt-watchlist'            => "Siz kuzatib borayotgan sahifalar ro'yxati.",
-'tooltip-pt-mycontris'            => 'Hissalaringiz roʻyxati',
-'tooltip-pt-login'                => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
-'tooltip-pt-anonlogin'            => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
-'tooltip-pt-logout'               => 'Chiqish',
-'tooltip-ca-talk'                 => 'Sahifa matni borasida munozara',
-'tooltip-ca-edit'                 => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
-'tooltip-ca-addsection'           => 'Yangi boʻlim och',
-'tooltip-ca-viewsource'           => "Bu sahifa himoyalangan. Siz uning manbasini ko'rishingiz mumkin.",
-'tooltip-ca-history'              => 'Bu sahifaning oldingi versiyalari.',
-'tooltip-ca-protect'              => 'Bu sahifani himoyalash',
-'tooltip-ca-delete'               => "Bu sahifani o'chirish",
-'tooltip-ca-undelete'             => "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
-'tooltip-ca-move'                 => 'Bu sahifani koʻchir',
-'tooltip-ca-watch'                => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
-'tooltip-ca-unwatch'              => "Bu sahifani kuzatuv ro'yxatingizga o'chirish",
-'tooltip-search'                  => '{{SITENAME}}da qidirish',
-'tooltip-search-go'               => 'Xuddi shu nomli sahifa bor boʻlsa, uni och',
-'tooltip-search-fulltext'         => 'Sahifalarda shu matnni izla',
-'tooltip-p-logo'                  => 'Bosh sahifa',
-'tooltip-n-mainpage'              => 'Bosh sahifaga oʻtish',
-'tooltip-n-portal'                => 'Loyiha haqida, nimalar qilishingiz mumkin, nimalarni qayerdan topish mumkin',
-'tooltip-n-currentevents'         => "Joriy hodisalar haqida ma'lumot olish",
-'tooltip-n-recentchanges'         => "Yangi o'zgarishlar ro'yxati.",
-'tooltip-n-randompage'            => 'Tasodifiy sahifani yuklash',
-'tooltip-n-help'                  => "O'rganish uchun manzil.",
-'tooltip-t-whatlinkshere'         => "Bu sahifaga bog'langan sahifalar ro'yxati",
-'tooltip-t-recentchangeslinked'   => "Bu sahifa bog'langan sahifalardagi yangi o'zgarishlar",
-'tooltip-feed-rss'                => "Bu sahifa uchun RSS ta'minot",
-'tooltip-feed-atom'               => "Bu sahifa uchun Atom ta'minot",
-'tooltip-t-contributions'         => "Bu foydalanuvchinig qo'shgan hissasini ko'rish",
-'tooltip-t-emailuser'             => "Bu foydalanuvchiga xat jo'natish",
-'tooltip-t-upload'                => 'Rasmlar yoki media fayllar yuklash',
-'tooltip-t-specialpages'          => "Maxsus sahifalar ro'yxati",
-'tooltip-t-print'                 => 'Ushbu sahifaning bosma uchun versiyasi',
-'tooltip-t-permalink'             => 'Sahifaning ushbu versiyasiga doimiy ishorat',
-'tooltip-ca-nstab-main'           => "Sahifani ko'rish",
-'tooltip-ca-nstab-user'           => "Foydalanuvchi sahifasini ko'rish",
-'tooltip-ca-nstab-media'          => "Media sahifasini ko'rish",
-'tooltip-ca-nstab-special'        => 'Bu maxsus sahifa, uni tahrirlay olmaysiz.',
-'tooltip-ca-nstab-project'        => "Loyiha sahifasini ko'rish",
-'tooltip-ca-nstab-image'          => "Rasm sahifasini ko'rish",
-'tooltip-ca-nstab-mediawiki'      => "Tizim xabarini ko'rish",
-'tooltip-ca-nstab-template'       => 'Andozani koʻrish',
-'tooltip-ca-nstab-help'           => "Yordam sahifasini ko'rish",
-'tooltip-ca-nstab-category'       => 'Turkum sahifasini koʻrish',
-'tooltip-minoredit'               => "Kichik o'zgarish sifatida belgilash",
-'tooltip-save'                    => "O'zgarishlarni saqlash",
-'tooltip-preview'                 => "O'zgarishlarni saqlash. Iltimos saqlashdan oldin uni ishlating!",
-'tooltip-diff'                    => "Matnga qanday o'zgarishlar kiritganligingizni ko'rish.",
+'tooltip-pt-userpage' => 'Foydalanuvchi sahifangiz',
+'tooltip-pt-anonuserpage' => 'Siznig ip manzilingiz foydalanuvchi sahifasi',
+'tooltip-pt-mytalk' => 'Suhbat sahifangiz',
+'tooltip-pt-anontalk' => 'Bu ip manzildan amalga oshirilgan tahrirlar munozarasi',
+'tooltip-pt-preferences' => 'Moslamalaringiz',
+'tooltip-pt-watchlist' => "Siz kuzatib borayotgan sahifalar ro'yxati.",
+'tooltip-pt-mycontris' => 'Hissalaringiz roʻyxati',
+'tooltip-pt-login' => 'Bu majburiyat mavjud bo‘lmasa-da, kirishingiz taklif qilinadi.',
+'tooltip-pt-anonlogin' => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
+'tooltip-pt-logout' => 'Chiqish',
+'tooltip-ca-talk' => 'Sahifa matni borasida munozara',
+'tooltip-ca-edit' => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
+'tooltip-ca-addsection' => 'Yangi boʻlim och',
+'tooltip-ca-viewsource' => "Bu sahifa himoyalangan. Siz uning manbasini ko'rishingiz mumkin.",
+'tooltip-ca-history' => 'Bu sahifaning oldingi versiyalari.',
+'tooltip-ca-protect' => 'Bu sahifani himoyalash',
+'tooltip-ca-delete' => 'Ushbu sahifani o‘chirib tashlash',
+'tooltip-ca-undelete' => "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
+'tooltip-ca-move' => 'Bu sahifani koʻchir',
+'tooltip-ca-watch' => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
+'tooltip-ca-unwatch' => "Bu sahifani kuzatuv ro'yxatingizga o'chirish",
+'tooltip-search' => '{{SITENAME}}da qidirish',
+'tooltip-search-go' => 'Xuddi shu nomli sahifa bor boʻlsa, uni och',
+'tooltip-search-fulltext' => 'Sahifalarda ushbu matnni izlash',
+'tooltip-p-logo' => 'Bosh sahifaga o‘tish',
+'tooltip-n-mainpage' => 'Bosh sahifaga oʻtish',
+'tooltip-n-mainpage-description' => 'Bosh sahifaga o‘tish',
+'tooltip-n-portal' => 'Loyiha haqida, nimalar qilishingiz mumkin, nimalarni qayerdan topish mumkin',
+'tooltip-n-currentevents' => 'Joriy hodisalar haqida ma’lumot olish',
+'tooltip-n-recentchanges' => 'Wikidagi eng so‘nggi o‘zgartirishlar ro‘yxati',
+'tooltip-n-randompage' => 'Tasodifiy sahifani yuklash',
+'tooltip-n-help' => 'O‘rganish uchun manzil',
+'tooltip-t-whatlinkshere' => "Bu sahifaga bog'langan sahifalar ro'yxati",
+'tooltip-t-recentchangeslinked' => "Bu sahifa bog'langan sahifalardagi yangi o'zgarishlar",
+'tooltip-feed-rss' => "Bu sahifa uchun RSS ta'minot",
+'tooltip-feed-atom' => "Bu sahifa uchun Atom ta'minot",
+'tooltip-t-contributions' => "Bu foydalanuvchinig qo'shgan hissasini ko'rish",
+'tooltip-t-emailuser' => 'Ushbu foydalanuvchiga xat jo‘natish',
+'tooltip-t-upload' => 'Rasmlar yoki media fayllar yuklash',
+'tooltip-t-specialpages' => 'Maxsus sahifalar ro‘yxati',
+'tooltip-t-print' => 'Ushbu sahifaning bosma uchun versiyasi',
+'tooltip-t-permalink' => 'Sahifaning ushbu versiyasiga doimiy ishorat',
+'tooltip-ca-nstab-main' => 'Sahifani ko‘rish',
+'tooltip-ca-nstab-user' => "Foydalanuvchi sahifasini ko'rish",
+'tooltip-ca-nstab-media' => "Media sahifasini ko'rish",
+'tooltip-ca-nstab-special' => 'Bu maxsus sahifa, uni tahrirlay olmaysiz.',
+'tooltip-ca-nstab-project' => "Loyiha sahifasini ko'rish",
+'tooltip-ca-nstab-image' => "Rasm sahifasini ko'rish",
+'tooltip-ca-nstab-mediawiki' => "Tizim xabarini ko'rish",
+'tooltip-ca-nstab-template' => 'Andozani koʻrish',
+'tooltip-ca-nstab-help' => "Yordam sahifasini ko'rish",
+'tooltip-ca-nstab-category' => 'Turkum sahifasini koʻrish',
+'tooltip-minoredit' => 'Kichik o‘zgartirish sifatida belgilash',
+'tooltip-save' => "O'zgarishlarni saqlash",
+'tooltip-preview' => "O'zgarishlarni saqlash. Iltimos saqlashdan oldin uni ishlating!",
+'tooltip-diff' => "Matnga qanday o'zgarishlar kiritganligingizni ko'rish.",
 'tooltip-compareselectedversions' => "Bu sahifaning ikki tanlangan versiyalari o'rtasidagi farqni ko'rish.",
-'tooltip-watch'                   => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
-'tooltip-recreate'                => "Bu sahifani u o'chirilgan bo'lishiga qaramasdan qayta yaratish",
-'tooltip-summary'                 => 'Qisqa mazmun kiriting',
+'tooltip-watch' => 'Ushbu sahifani kuzatuv ro‘yxatingizga qo‘shish',
+'tooltip-recreate' => "Bu sahifani u o'chirilgan bo'lishiga qaramasdan qayta yaratish",
+'tooltip-summary' => 'Qisqa mazmun kiriting',
 
 # Browsing diffs
 'previousdiff' => '← Avvalgi tahrir',
-'nextdiff'     => 'Keyingi tahrir →',
+'nextdiff' => 'Keyingi tahrir →',
 
 # Media information
-'imagemaxsize'   => "Tasvir ta'rifi sahifasidagi tasvirning kattaligi:",
-'thumbsize'      => 'Tasvirning kichiklashtirilgan versiyasining kattaligi:',
+'imagemaxsize' => "Tasvir ta'rifi sahifasidagi tasvirning kattaligi:",
+'thumbsize' => 'Tasvirning kichiklashtirilgan versiyasining kattaligi:',
 'file-info-size' => '$1 × $2 piksel, fayl hajmi: $3, MIME tipi: $4',
-'file-nohires'   => 'Bundan kattaroq tasvir yoʻq.',
-'svg-long-desc'  => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
+'file-nohires' => 'Bundan kattaroq tasvir yoʻq.',
+'svg-long-desc' => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
 'show-big-image' => 'Asl hajmdagi tasvir',
 
 # Special:NewFiles
 'ilsubmit' => 'Qidirish',
 
 # Metadata
-'metadata'          => "Metama'lumot",
-'metadata-expand'   => 'Batafsil axborot koʻrsat',
+'metadata' => 'Metama’lumot',
+'metadata-expand' => 'Batafsil axborot koʻrsat',
 'metadata-collapse' => 'Batafsil axborotni yashir',
 
 # External editor support
-'edit-externally'      => 'Bu faylni tashqi dasturiy ilovalar yordamida tahrirla',
+'edit-externally' => 'Bu faylni tashqi dasturiy ilovalar yordamida tahrirla',
 'edit-externally-help' => "(Batafsil ma'lumotlar uchun [//www.mediawiki.org/wiki/Manual:External_editors bu yerga] qarang)",
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'Barcha',
 'namespacesall' => 'Barchasi',
+'monthsall' => 'barchasi',
 
 'unit-pixel' => 'piksel',
 
index 0304476..2b061d6 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Alunardon90
  * @author BrokenArrow
  * @author Candalua
  * @author Frigotoni
@@ -177,10 +178,10 @@ $messages = array(
 'tog-enotifminoredits' => 'Avìseme par e-mail anca par i canbiamenti picenini',
 'tog-enotifrevealaddr' => 'Fà védar el me indirisso e-mail in tei messagi de aviso',
 'tog-shownumberswatching' => 'Mostra el numaro de utenti che i ga ła pajina en oservasion',
-'tog-oldsig' => 'Anteprima de la firma:',
+'tog-oldsig' => 'Anteprima de ła firma:',
 'tog-fancysig' => 'Interpreta i comandi wiki in te la firma (sensa colegamento automatego)',
-'tog-externaleditor' => "Dopara par default on editor de testo esterno (soło par utenti esperti, el richiede l'uso de impostasion particołari sol proprio computer)",
-'tog-externaldiff' => "Dopara par default on programa de diff esterno (soło par utenti esperti, el richiede l'uso de impostasion particołari sol proprio computer)",
+'tog-externaleditor' => "Dopara par default un editor de testo esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
+'tog-externaldiff' => "Dopara par default un programa de diff esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
 'tog-showjumplinks' => 'Ativa i cołegamenti acesibiłi "va a"',
 'tog-uselivepreview' => 'Ativa ła funsion "Line preview" (el richiede JavaScript; sperimentałe)',
 'tog-forceeditsummary' => "Chiedi conferma se l'ozeto de ła modifega el xé vodo",
@@ -305,7 +306,7 @@ $messages = array(
 'vector-action-move' => 'Sposta',
 'vector-action-protect' => 'Protezi',
 'vector-action-undelete' => 'Recupera',
-'vector-action-unprotect' => 'Sbloca',
+'vector-action-unprotect' => 'Canbia ła protesion',
 'vector-simplesearch-preference' => "Intaca i sugerimenti di ricerca avansadi (solo par l'interfacia Vector)",
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Canbia',
@@ -338,11 +339,12 @@ $messages = array(
 'delete' => 'Scansela',
 'deletethispage' => 'Scansela sta pagina',
 'undelete_short' => 'Recupera {{PLURAL:$1|na revision|$1 revision}}',
+'viewdeleted_short' => 'Vedi {{PLURAL:$1|na modifega cancełà|$1 modifeghe cancełade}}',
 'protect' => 'Protezi',
 'protect_change' => 'canbia',
 'protectthispage' => 'Protezi sta pagina',
-'unprotect' => 'Sbloca',
-'unprotectthispage' => 'Cava ła protesion a sta pajina',
+'unprotect' => 'Canbia ła protesion',
+'unprotectthispage' => 'Canbia ła protesion de sta pajina',
 'newpage' => 'Pagina nova',
 'talkpage' => 'Pagina de discussion',
 'talkpagelinktext' => 'Discussion',
@@ -421,6 +423,8 @@ $1',
 'toc' => 'Indice',
 'showtoc' => 'mostra',
 'hidetoc' => 'scondi',
+'collapsible-collapse' => 'Conprimi',
+'collapsible-expand' => 'Espandi',
 'thisisdeleted' => 'Varda o ripristina $1?',
 'viewdeleted' => 'Varda $1?',
 'restorelink' => '{{PLURAL:$1|un canbiamento scanselà|$1 canbiamenti scanselà}}',
@@ -432,6 +436,8 @@ $1',
 'page-rss-feed' => 'Feed RSS par "$1"',
 'page-atom-feed' => 'Feed Atom par "$1"',
 'red-link-title' => '$1 (sta pagina no la ghe xe)',
+'sort-descending' => 'Ordinamento decresente',
+'sort-ascending' => 'Ordinamento cresente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Voxe',
@@ -499,10 +505,11 @@ Se prega de dìrghelo a un [[Special:ListUsers/sysop|aministradore]] indicando l
 'badarticleerror' => 'Operasion no consentia par sta pajina.',
 'cannotdelete' => 'No xè sta posibiłe scansełare el file "$1".
 Podaria esare sta zà scansełà da qualcun altro.',
+'cannotdelete-title' => 'Inposibiłe ełiminare ła pajina "$1"',
 'badtitle' => 'Titoło mia justo',
 'badtitletext' => "El titoło de ła pajina richiesta xè vodo, erà o con carateri no amesi opure el deriva da n'erore ne i cołegamenti tra siti wiki diversi o version en łengue diverse de ło steso sito.",
-'perfcached' => 'Sti dati qua no i vien mia azornà in tenpo reale, ma solo na olta ogni tanto. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => "Sti dati qua i xe stà azornà l'ultima olta el $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+'perfcached' => 'Sti dati vien tiradi fora da na copia "cache" del database e łi podarìa no esare ajornadi. Inte ła cache xe {{PLURAL:$1|disponibiłe un rixultado|xe disponibiłi $1 rixultadi}}.',
+'perfcachedts' => "Sti dati cua xe stà ajornadi l'ultima volta el $1. Inte ła cache xe disponibiłe al masimo {{PLURAL:$4|on rexultado|$4 rexultadi}}.",
 'querypage-no-updates' => "L'azornamento periodico de sta pagina el xe sospeso. 
 I dati che ghè qua drento no i xe azornà.",
 'wrong_wfQuery_params' => 'Erore ne i parametri invià a ła funsion wfQuery()<br />
@@ -527,6 +534,9 @@ $2',
 'ns-specialprotected' => 'No xè posibiłe modifegare łe pajine spesałi.',
 'titleprotected' => 'Ła creasion de na pajina con sto titoło xè sta blocà da [[User:$1|$1]].
 Ła modivasion xè ła seguente: "$2".',
+'filereadonlyerror' => 'No xe stà posibiłe modifegare el file "$1" parché el repository de file "$2" xe in modałità de soła letura.
+
+L\'aministradore che ło ga blocà ga fornìo sta spiegasion: "$3".',
 
 # Virus scanner
 'virus-badscanner' => 'Erore de configurasion: antivirus sconossuo: "$1"',
@@ -566,8 +576,8 @@ Te poli sistemarte come te vol le to [[Special:Preferences|prefarense de {{SITEN
 'createaccountmail' => 'Par e-mail',
 'createaccountreason' => 'Motivassion:',
 'badretype' => 'Le do password le xe difarenti.',
-'userexists' => 'Sto nome utente se lo gà zà tolto qualchedun altro.
-Tòtene uno difarente.',
+'userexists' => 'El nome utente inserido vien xa doparà da cualchedun altro.
+Prova co un nome utente difarente.',
 'loginerror' => "Erore ne l'aceso",
 'createaccounterror' => "No se pole crear l'utente: $1",
 'nocookiesnew' => "Ła rejistrasion xè sta conpletà, ma no xè sta posibiłe asedare a {{SITENAME}} parché i cookie i xè disativai. Riprovare l'aceso con el nome utente e ła password pena creai dopo aver ativà i cookie nel proprio browser.",
@@ -609,6 +619,8 @@ Par piaser, fà subito un login \'pena che la te riva.',
 'emailconfirmlink' => 'Conferma el to indirizo de e-mail',
 'invalidemailaddress' => "L'indirisso email no'l pode èssar acetà parché el gà un formato mìa valido.
 Inserissi un indirisso valido o svoda la casèła.",
+'cannotchangeemail' => "I indirisi de posta ełetronega de l'account no połe esare canbiadi inte sto projeto wiki.",
+'emaildisabled' => 'Sto sito no połe spedire mesaji de posta ełetronega.',
 'accountcreated' => 'Acesso creà',
 'accountcreatedtext' => "Xè stà creà un acesso par l'utente $1.",
 'createaccount-title' => 'Creazion de un acesso a {{SITENAME}}',
@@ -619,9 +631,14 @@ Se l\'acesso el xe stà creà par sbaglio, se pol ignorar sto messagio.',
 'usernamehasherror' => "El nome utente no'l pode contegner caràteri hash",
 'login-throttled' => 'Te ghè fato massa tentativi de autenticarte.
 Spèta un tocheto prima de proàr da novo.',
+'login-abort-generic' => 'El to login no xe riusido - Anułà.',
 'loginlanguagelabel' => 'Lengua: $1',
 'suspicious-userlogout' => 'Ła to richiesta de disconesion xè sta negà parché e a senbra invià da on browser non funsionante o on proxy de caching.',
 
+# E-mail sending
+'php-mail-error-unknown' => "Erore sconosudo nte'l funsionamento deła posta ełetronega PHP",
+'user-mail-no-addy' => 'Te ghe provà spedire un mesajo de posta ełetronega sensa un indiriso.',
+
 # Change password dialog
 'resetpass' => 'Cànbia la password',
 'resetpass_announce' => "L'acesso el xe stà efetuà con un codice tenporaneo, mandà par e-mail. Par conpletar l'acesso bisogna inpostar na password nova:",
@@ -640,6 +657,51 @@ Spèta un tocheto prima de proàr da novo.',
 Forse te ghè zà canbià la to password o te ghè domandà na password tenporanea nova.',
 'resetpass-temp-password' => 'Password tenporanea:',
 
+# Special:PasswordReset
+'passwordreset' => 'Rinposta ła password',
+'passwordreset-text' => 'Conpleta sto moduło par riçevare i detaji del to account via posta ełetronega.',
+'passwordreset-legend' => 'Rinposta ła password',
+'passwordreset-disabled' => 'Ła rinpostasion deła password xe stà dixabiłità so sto projeto wiki.',
+'passwordreset-pretext' => '{{PLURAL:$1|| Inserisi una dełe porsion de dati cua soto}}',
+'passwordreset-username' => 'Nome utente:',
+'passwordreset-domain' => 'Dominio',
+'passwordreset-capture' => 'Vixuałixare el contenuto del mesajo de posta ełetronega?',
+'passwordreset-capture-help' => "Se se sełesiona sta caxeła, l'indiriso de posta ełetronega (co' ła password tenporanea) ve vegnarà mostrà anca a voialtri oltre che esare invià a 'l utente.",
+'passwordreset-email' => 'Indiriso de posta ełetronega',
+'passwordreset-emailtitle' => "Detaji de l'account so {{SITENAME}}",
+'passwordreset-emailtext-ip' => "Cualcheduni (probabilmente ti, co indiriso IP $1) ga richiesto l'invio de na nova password par l'aceso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente asocià|I utenti asociadi}} a sto indiriso de posta ełetronega łi xe:
+
+$2
+
+{{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.
+Sarìa mejo acedare e deçidare na nova password sùito. 
+
+Se no te si stà ti a fare ła richiesta, o se te te ghe ricordà ła password originałe e no te vołi pi canbiarla, te połi ignorare sto mesajo e continuar doparare ła to password vecia.",
+'passwordreset-emailtext-user' => "El utente $1 da {{SITENAME}} (probabilmente ti steso) ga richiesto l'invio dei to detaji del profiło par {{SITENAME}} ($4). {{PLURAL:$3|El profiło utente asocià|I profiłi utenti asociadi}} a sto indiriso de posta ełetronega łi xe:
+
+$2
+
+{{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.
+Sarìa mejo acedare e deçidare na nova password sùito. 
+
+Se no te si stà ti a fare ła richiesta, o se te te ghe ricordà ła password originałe e no te vołi pi canbiarla, te połi ignorare sto mesajo e continuar doparare ła to password vecia.",
+'passwordreset-emailelement' => 'Nome utente: $1
+Password tenporanea: $2',
+'passwordreset-emailsent' => 'Xe stà invià on promemoria via posta eletronega.',
+'passwordreset-emailsent-capture' => 'Xe stà invià un promemoria via posta eletronega: el contegù xe riportà cuà de seguito.',
+'passwordreset-emailerror-capture' => "Xe stà generà el promemoria riportà cuà de seguito. L'invio al utente no xe riusido: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Canbia indiriso de posta ełetronega',
+'changeemail-header' => 'Canbia el indiriso de posta ełetronega del account',
+'changeemail-text' => 'Conpleta sto moduło par canbiare el to indiriso de posta ełetronega. Sarà necesario inserire ła password par confermare ła modifega.',
+'changeemail-no-info' => "Te ghe da aver efetuà l'aceso par acedare a sta pajina diretamente.",
+'changeemail-oldemail' => 'Indiriso de posta ełetronega atuałe:',
+'changeemail-newemail' => 'Novo indiriso de posta ełetronega:',
+'changeemail-none' => '(nisun)',
+'changeemail-submit' => 'Canbia indiriso de posta ełetronega',
+'changeemail-cancel' => 'Anuła',
+
 # Edit page toolbar
 'bold_sample' => 'Testo in grosso',
 'bold_tip' => 'Testo in grosso',
@@ -739,7 +801,12 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'userpage-userdoesnotexist-view' => 'L\'utensa "$1" no la xe gnancora registrà.',
 'blocked-notice-logextract' => "Sto utente xè atualmente blocà.
 L'ultimo ełemento del rejistro de i blochi xè riportà de seguito par informasion:",
-'clearyourcache' => "'''Ocio: dopo aver salvà, te ghè da netar la cache del to browser par védar i canbiamenti.''' Par '''Mozilla / Firefox / Safari:''' tien macà el boton de le majuscole e schiza \"Ricarica\", o senò maca ''Ctrl-F5'' o ''Ctrl-R'' (''Command-R'' se te ghè el Mac); par '''Konqueror:''' schiza \"Ricarica\" o maca ''F5;'' par '''Opera:''' néta la cache in ''Strumenti → Preferenze;'' par '''Internet Explorer:''' tien macà ''Ctrl'' fin che te schizi ''Ricarica'', o maca ''Ctrl-F5.''",
+'clearyourcache' => "Ocio: dopo aver salvà, połe darse che te gabi da netare ła cache del to browser par védar i canbiamenti.
+*Par '''Firefox / Safari:''' tien macà el boton de łe majuscołe e schicia \"Recarga\", o senò maca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' se te ghè el Mac)
+*Par '''Google Chrome''':schicia ''Ctrl-Shift-R'' (''⌘-Shift-R'' co' un Mac)
+*Par '''Internet Explorer''': tien schicià el boton \"Ctrl\" fin che te schici '''Recarga''', senò schicia '''Ctrl+F5'''
+*Par '''Konqueror''': schicia \"Recarga\" o maca ''F5'';
+*Par '''Opera:''' néta la cache in ''Strumenti → Preferense;''",
 'usercssyoucanpreview' => "'''Sugerimento:''' se consiglia de doparar el boton \"{{int:showpreview}} par proàr i novi CSS prima de salvarli.",
 'userjsyoucanpreview' => "'''Sugerimento:''' se consiglia de doparar el boton \"{{int:showpreview}}\" par proàr i novi JavaScript prima de salvarli.",
 'usercsspreview' => "'''Sta qua la xe solo n'anteprima del proprio CSS personal.
@@ -750,7 +817,8 @@ Le modifiche no le xe gnancora stà salvà!'''",
 'userinvalidcssjstitle' => "'''Ocio:'''  No ghe xe nissuna skin con nome \"\$1\". Nota che le pagine par i .css e .js personalizà le gà l'iniziale del titolo minuscola, par esenpio {{ns:user}}:Esenpio/vector.css e no {{ns:user}}:Esenpio/Vector.css.",
 'updated' => '(Agiornà)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Sta qua la xe solo n'anteprima; i canbiamenti a la pagina NO i xe gnancora stà salvà!'''",
+'previewnote' => "Sta cua ła xe soło n'anteprima; i canbiamenti a ła pajina NO i xe gnancora stà salvài!",
+'continue-editing' => 'Continua modifegare',
 'previewconflict' => 'Sta anteprima la corisponde al testo ne la casèla de edizion de sora, e la fa védar come vegnarà fora la pagina se te machi "Salva la pagina" in sto momento.',
 'session_fail_preview' => "No xè stà possibiłe salvar le to modifiche parché i dati de la session i xè andai persi.
 Par piaser, riproa da novo.
@@ -762,7 +830,9 @@ Se no funsiona gnancora, proa a [[Special:UserLogout|scołegarte]] e a cołegart
 '''Se te stè fasendo na modifica legìtima, par piaser próa de novo.
 Se no funsiona gnancora, te pol proár a [[Special:UserLogout|scolegarte]] e efetuar da novo l'acesso.'''",
 'token_suffix_mismatch' => "'''La modifica no la xe mìa stà salvà parché el client el gà mostrà de gestir in maniera sbaglià i caràteri de puntegiatura nel token associà a la stessa. Par evitar na possibile coruzion del testo de la pagina, xe stà rifiutà l'intera modifica. Sta situazion la pode verificarse, a olte, quando vien doparà serti servizi de proxy anonimi via web che presenta dei bug.'''",
+'edit_form_incomplete' => "' ' Alcune parte del moduło de modifega no łe xe rivade al server; controłare che łe modifeghe sìe intate e riprovare. ' '",
 'editing' => 'Canbia $1',
+'creating' => 'Te si drio creare $1',
 'editingsection' => 'Canbia $1 (sezion)',
 'editingcomment' => 'Modifica de $1 (sezion nova)',
 'editconflict' => 'Conflito de edizion: $1',
@@ -783,8 +853,8 @@ Cargando el testo te dichiari inoltre, soto la to responsabilità, che el testo
 Se no te voli che i to scriti i vegna modificà sensa pietà, alora no sta inserirli qua.<br />
 Sapi che te stè prometendo che te stè inserendo un testo scrito de to pugno, o copià da na fonte de publico dominio o similarmente lìbara (varda $1 par i detagli).
 '''NO STA INSERIR OPERE PROTETE DA COPYRIGHT SENSA PERMESSO!'''",
-'longpageerror' => "'''ERROR: The text you have submitted is $1 kilobytes
-long, which is longer than the maximum of $2 kilobytes. It cannot be saved.'''",
+'longpageerror' => "'''Erore: el testo invià xe grando {{PLURAL:$1|1|$1}} kilobyte, che xe de pì deła dimension masima consentìa de {{PLURAL:$2|1|$2}} kilobyte.'''
+El testo no połe esare salvà.",
 'readonlywarning' => "'''OCIO: El database el xe stà blocà par manutenzion, quindi no se pol salvar le modifiche in sto momento.
 Par no pèrdarle, te pol copiar tuto quel che te ghè inserìo fin desso ne la casela de modifica, incolarlo in un programa de elaborazion de testi e salvarlo, intanto che te speti che i sbloca el database.'''
 
@@ -822,6 +892,7 @@ Pararìa che la sìpia stà scancelà.',
 'edit-no-change' => 'La to modifica la xe stà ignorà, parché no ti gà canbià gnente nel testo.',
 'edit-already-exists' => 'No se pol crear na pagina nova.
 La esiste de zà.',
+'defaultmessagetext' => 'Testo predefinìo',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Ocio: Sta pagina la contien dele chiamate de funzion al parser massa onerose.
@@ -837,6 +908,7 @@ Sti argomenti i xe stà omessi.",
 'parser-template-loop-warning' => 'Xe stà catà un ciclo in tel modèl: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Xe stà rajunto el limite màssimo de ricorsion in tel modèl ($1)',
 'language-converter-depth-warning' => 'Limite de profondità del convertidor de lengua superà ($1)',
+'node-count-exceeded-category' => 'Pajine ndove che el node-count supera el limite',
 
 # "Undo" feature
 'undo-success' => 'Sta modifica la pode èssar anulà. Verifica el confronto presentà de seguito par èssar sicuro che el contenuto el sia come te lo voli e quindi salva le modifiche par conpletar la procedura de anulamento.',
@@ -888,29 +960,27 @@ Legenda: '''({{int:cur}})''' = difarense co l'ultima version, '''({{int:last}})'
 'rev-deleted-user-contribs' => '[nome utente o indirisso IP cavà - modifica sconta dai contributi]',
 'rev-deleted-text-permission' => "Sta version de la pagina la xe stà '''scancelà'''.
 Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelazion] par ulteriori detagli.",
-'rev-deleted-text-unhide' => "Sta version de la pàxena la xe sta '''scancelà'''.
-Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.
-Ai aministradori xe ancora consentìo [$1 vardar sta version] se i vole.",
-'rev-suppressed-text-unhide' => "Sta version de la pagina la xe stà '''cavà'''.
-Varda el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de rimozion] par ulteriori detagli.
-I aministratori i pode ancora [$1 vardar sta versione] se i vole.",
+'rev-deleted-text-unhide' => "Sta version de la pajina ła xe stà '''scancełà'''.
+Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.
+Ai aministradori ghe xe uncora consentìo [$1 vardar sta version] se i vołe.",
+'rev-suppressed-text-unhide' => "Sta version de ła pagina la xe stà ''rimosa'''.
+Controłare el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe rimosion] par ulteriori detaji.
+I aministradori połe uncora [$1 vardar sta version] se i vołe.",
 'rev-deleted-text-view' => "Sta version de la pagina la xe stà '''scancelà'''.
-El testo el pode èssar visualizà soltanto dai aministradori del sito.
-Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelazion] par ulteriori detagli.",
-'rev-suppressed-text-view' => "Sta version de la pagina la xe stà '''cavà'''.
-Solo i aministratori i pole ancora védarla.
-Varda el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de rimozion] par ulteriori detagli.",
+I aministradori połe uncora vixuałixarla. Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.",
+'rev-suppressed-text-view' => "Sta version de ła pajina xe stà '''rimosa'''.
+I aministradori i połe uncora vedarla; controłare el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe rimosion] par ulteriori detaji.",
 'rev-deleted-no-diff' => "No te pode vardar sta difarensa parché una de le revision la xe stà '''scancelà'''.
 Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par savérghene piessè.",
 'rev-suppressed-no-diff' => "No te pol védar sta difarensa, parché una de le revision la xe stà '''scancelà'''.",
-'rev-deleted-unhide-diff' => "Una dele revision de sta difarensa la xe stà '''scancelà'''.
-Consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.
-I aministradori i pode ancora [$1 vardar sta difarensa] se i vole.",
-'rev-suppressed-unhide-diff' => "Una dele revision de sta difarensa la xe stà '''sopressa'''.
-Consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de sopression] par ulteriori detagli.
-I aministradori i pode ancora [$1 vardar sta difarensa] se i vole.",
-'rev-deleted-diff-view' => "Una dele revision de sta difarensa la xe stà '''scancelà'''.
-Come aministrador, te pol vardar el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.",
+'rev-deleted-unhide-diff' => "Una dełe revixion de sto confronto fra version xe stà '''scancełà'''.
+Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.
+Ai aministradori ghe xe uncora consentìo [$1 vixualixare el confronto] se i vołe.",
+'rev-suppressed-unhide-diff' => "Una dełe revixion de sto confronto de version xe stà '''sopresa'''.
+Controła el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe sopresion] par ulteriori detaji.
+I aministradori i połe uncora [$1 vixualixare el confronto] se i vołe.",
+'rev-deleted-diff-view' => "Una dełe revixion de sto confronto de version ła xe stà '''scancelà'''.
+Te połi uncora vixuałixare sto confronto; controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.",
 'rev-suppressed-diff-view' => "Una dele revision de sta difarensa la xe stà '''sopressa'''.
 Come aminitrador, te pol vardar el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de sopression] par ulteriori detagli.",
 'rev-delundel' => 'mostra/scondi',
index 1ab293b..5e6f22f 100644 (file)
@@ -277,6 +277,7 @@ $messages = array(
 'delete' => 'Čuta poiš',
 'deletethispage' => "Čuta nece lehtpol'",
 'undelete_short' => "Endištada {{PLURAL:$1|üks' redakcii|$1 redakcijad}}",
+'viewdeleted_short' => 'Kc. {{PLURAL:$1|čutud redakcii|$1 čutud redakcijad}}',
 'protect' => 'Kaita',
 'protect_change' => 'toižetada',
 'protectthispage' => "Kaita nece lehtpol'",
@@ -583,7 +584,10 @@ Aigaline peitsana: $2',
 'passwordreset-emailsent' => 'Muštatai kirjeine oigetihe e-počtadme',
 
 # Special:ChangeEmail
+'changeemail' => 'Toižetada e-počtan adres',
+'changeemail-no-info' => 'Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.',
 'changeemail-newemail' => "Uz' e-počtan adres",
+'changeemail-none' => '(ei ole)',
 'changeemail-submit' => 'Toižetada e-počtan adres',
 'changeemail-cancel' => 'Heitta',
 
@@ -689,9 +693,10 @@ Alemba om anttud jälgmäine kirjutuz blokiruindaiglehtesespäi:",
 'updated' => '(Udištadud)',
 'note' => "'''Homaičend:'''",
 'previewnote' => "'''Muštkat, miše nece om vaiše ezikacund.''' 
-Teiden toižetused ei olgoi völ kirjutadud! [[#editform|→ jatkta redakrtiruind]]",
+Teiden toižetused ei olgoi völ kirjutadud!",
 'previewconflict' => "Tekst redaktiruindan üläiknas kuvazub neche ezikacundha muga, kut se nägub lopkirjutamižen jäl'ghe.",
 'editing' => '$1-lehtpolen redaktiruind',
+'creating' => 'Sätas $1',
 'editingsection' => '$1-lehtpolen redaktiruind (jaguz)',
 'editingcomment' => "$1-lehtpolen redaktiruind (uz' jaguz)",
 'editconflict' => 'Redaktiruindan konflikt: $1',
@@ -754,6 +759,7 @@ Voib olda, se om jo čutud.",
 'edit-no-change' => 'Teiden redakcii ignoriruidihe, sikš miše tekst ei ole toižetadud.',
 'edit-already-exists' => "Ei voi säta uz' lehtpol'.
 Wikiš om jo mugoi lehtpol'.",
+'defaultmessagetext' => 'Tekst augotižjärgendusen mödhe',
 
 # Parser/template warnings
 'expensive-parserfunction-category' => 'Lehtpoled, kudambil kävutadas äjahko resursokahid funkcijoid',
@@ -901,6 +907,7 @@ Tö ei voigoi kävutada sidä.',
 # Diffs
 'history-title' => '"$1"-lehtpolen toižetusiden istorii',
 'difference' => '(Erod versijoiden keskes)',
+'difference-multipage' => '(Lehtpoliden erinend)',
 'lineno' => 'Rivi $1:',
 'compareselectedversions' => 'Rindatada valitud versijad',
 'showhideselectedversions' => 'Ozutada/peitta valitud versijad',
@@ -1051,6 +1058,7 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 'prefs-files' => 'Failad',
 'prefs-custom-css' => 'Ičeze CSS',
 'prefs-custom-js' => 'Ičeze JS',
+'prefs-common-css-js' => 'Ühthižed CSS/JavaScript kaikiden temiden täht:',
 'prefs-reset-intro' => "Tö sat kävutada nece lehtpol', miše pördutada teiden järgendused saitan ezijärgendusidennoks.
 Necidä tegendad ei sa toižetada.",
 'prefs-emailconfirm-label' => 'E-počtan vahvištand:',
@@ -1269,6 +1277,7 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
 '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",
 'rc-enhanced-expand' => 'Ozutada detalid (JavaScript)',
 'rc-enhanced-hide' => 'Peitta detalid',
@@ -2871,7 +2880,7 @@ Necen vahvištoitandkodan kävutamižen lopstrok om $4.',
 'autosumm-blank' => 'Lehtpolen südäiolend om čutud',
 'autosumm-replace' => "Lehtpolen südäiolend om vajehtud '$1'-südäiolendaks",
 'autoredircomment' => 'Om läbioigetud [[$1]]-lehtpolele',
-'autosumm-new' => "Om sätud uz' lehtpol', kudamban suruz om '$1'",
+'autosumm-new' => "Om sätud uz' lehtpol', kudamban südäiolend om '$1'",
 
 # Size units
 'size-bytes' => '$1 b',
index 64aa47b..64c8318 100644 (file)
@@ -415,7 +415,7 @@ $messages = array(
 'category-article-count-limited' => '{{PLURAL:$1|Trang|$1 trang}} sau nằm trong thể loại hiện hành.',
 'category-file-count' => '{{PLURAL:$2|Thể loại này có tập tin sau.|{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại này, trong tổng số $2 tập tin.}}',
 'category-file-count-limited' => '{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại hiện hành.',
-'listingcontinuesabbrev' => 'tiếp',
+'listingcontinuesabbrev' => '(tiếp theo)',
 'index-category' => 'Trang được ghi chỉ mục',
 'noindex-category' => 'Trang không hiển thị trong bộ máy tìm kiếm',
 'broken-file-category' => 'Trang nhúng tập tin không tồn tại',
@@ -959,7 +959,8 @@ Nó chưa được lưu!'''",
 'updated' => '(Cập nhật)',
 'note' => "'''Ghi chú:'''",
 'previewnote' => "'''Đây chỉ mới là xem thử.'''
-Các thay đổi của bạn vẫn chưa được lưu! [[#editform|→ Sửa tiếp]]",
+Các thay đổi của bạn vẫn chưa được lưu!",
+'continue-editing' => 'Sửa tiếp',
 'previewconflict' => 'Phần xem thử này là kết quả của văn bản trong vùng soạn thảo phía trên và nó sẽ xuất hiện như vậy nếu bạn chọn lưu trang.',
 'session_fail_preview' => "'''Những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.
 Xin hãy thử lần nữa.
@@ -1054,6 +1055,10 @@ Những giá trị này sẽ bị bỏ đi.',
 'parser-template-loop-warning' => 'Phát hiện bản mẫu lặp vòng: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Bản mẫu đã vượt quá giới hạn về độ sâu đệ quy ($1)',
 'language-converter-depth-warning' => 'Đã vượt quá giới hạn độ sâu của bộ chuyển đổi ngôn ngữ ($1)',
+'node-count-exceeded-category' => 'Những trang có số nốt vượt quá giới hạn cho phép',
+'node-count-exceeded-warning' => 'Trang có nhiều nốt quá',
+'expansion-depth-exceeded-category' => 'Những trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép',
+'expansion-depth-exceeded-warning' => 'Trang bung bản mẫu sâu quá',
 
 # "Undo" feature
 'undo-success' => 'Các sửa đổi có thể được lùi lại. Xin hãy kiểm tra phần so sánh bên dưới để xác nhận lại những gì bạn muốn làm, sau đó lưu thay đổi ở dưới để hoàn tất việc lùi lại sửa đổi.',
@@ -1198,7 +1203,7 @@ Xin hãy kiểm tra nhật trình.',
 # Suppression log
 'suppressionlog' => 'Nhật trình ẩn giấu',
 'suppressionlogtext' => 'Dưới đây là danh sách các tác vụ xóa và cấm liên quan đến nội dung mà các quản lý không nhìn thấy.
-Xem [[Special:BlockList|danh sách các IP bị cấm]] để xem danh sách các tác vụ cấm chỉ và cấm thông thường hiện nay.',
+Xem [[Special:BlockList|danh sách cấm]] để xem danh sách các tác vụ cấm chỉ và cấm thông thường hiện nay.',
 
 # History merging
 'mergehistory' => 'Trộn lịch sử trang',
@@ -1865,6 +1870,7 @@ Vì lý do bảo mật, img_auth.php đã bị tắt.',
 'http-curl-error' => 'Có lỗi khi truy xuất URL: $1',
 'http-host-unreachable' => 'Không thể truy cập URL',
 'http-bad-status' => 'Có vấn đề khi yêu cầu HTTP: $1 $2',
+'http-truncated-body' => 'Chỉ nhận được một phần của thân yêu cầu.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Không thể truy cập URL',
@@ -2140,6 +2146,11 @@ Bạn có thể thu hẹp kết quả bằng cách chọn loại nhật trình,
 'allpages-bad-ns' => '{{SITENAME}} không có không gian tên “$1”',
 'allpages-hide-redirects' => 'Ẩn trang đổi hướng',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Bạn đang xem phiên bản vùng nhớ đệm của trang này có thể lỗi thời cho tới $1.',
+'cachedspecial-viewing-cached-ts' => 'Bạn đang xem phiên bản vùng nhớ đệm của trang này có thể không đúng thời hoàn toàn.',
+'cachedspecial-refresh-now' => 'Xem phiên bản mới nhất.',
+
 # Special:Categories
 'categories' => 'Thể loại',
 'categoriespagetext' => '{{PLURAL:$1|Thể loại|Các thể loại}} dưới đây có trang hoặc tập tin phương tiện.
@@ -2579,8 +2590,8 @@ $1',
 'ipb-confirm' => 'Xác nhận cấm',
 'badipaddress' => 'Địa chỉ IP không hợp lệ',
 'blockipsuccesssub' => 'Cấm thành công',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] đã bị cấm.
-<br />Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] đã bị cấm.<br />
+Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'ipb-blockingself' => 'Bạn sẽ tự bỏ cấm cho mình! Bạn có chắc chắn muốn làm vậy không?',
 'ipb-confirmhideuser' => 'Bạn sẽ cấm người dùng với tùy chọn “ẩn người dùng”. Bạn có chắc chắn muốn dời tên người dùng khỏi tất cả mọi danh sách và nhật trình?',
 'ipb-edit-dropdown' => 'Sửa đổi lý do cấm',
@@ -3831,6 +3842,9 @@ hoặc [//www.gnu.org/licenses/old-licenses/gpl-2.0.html đọc nó trực tuy
 'version-software' => 'Phần mềm được cài đặt',
 'version-software-product' => 'Phần mềm',
 'version-software-version' => 'Phiên bản',
+'version-entrypoints' => 'Các URL lối vào',
+'version-entrypoints-header-entrypoint' => 'Lối vào',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Đường dẫn tập tin',
@@ -4019,4 +4033,15 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'api-error-uploaddisabled' => 'Chức năng tải lên đã bị tắt trên wiki này.',
 'api-error-verification-error' => 'Tập tin này có thể bị hỏng hoặc có phần mở rộng sai.',
 
+# Durations
+'duration-seconds' => '$1 giây',
+'duration-minutes' => '$1 phút',
+'duration-hours' => '$1 giờ',
+'duration-days' => '$1 ngày',
+'duration-weeks' => '$1 tuần',
+'duration-years' => '$1 năm',
+'duration-decades' => '$1 thập niên',
+'duration-centuries' => '$1 thế kỷ',
+'duration-millennia' => '$1 thiên niên kỷ',
+
 );
index dce62a5..db79ffc 100644 (file)
@@ -685,6 +685,7 @@ Memolös, das pads: .css e .js mutons labön tiädi minudik: {{ns:user}}:Foo/vec
 Redakam perefudon ad vitön dädükami padavödema.
 Atos jenon ömna ven geboy düni pladulöma nennemik bevüresodik säkädik.'''",
 'editing' => 'Redakam pada: $1',
+'creating' => 'Jafäd pada: $1',
 'editingsection' => 'Redakam pada: $1 (diläd)',
 'editingcomment' => 'Redakam pada: $1 (diläd nulik)',
 'editconflict' => 'Redakamakonflit: $1',
index f3a7e35..d3befa9 100644 (file)
@@ -568,6 +568,8 @@ $2',
 'ns-specialprotected' => 'מען קען נישט רעדאגירן ספעציעלע בלעטער.',
 'titleprotected' => 'דער טיטל איז געשיצט פון ווערן געשאפֿן דורך  [[User:$1|$1]].
 די אורזאך איז  \'\'$2".',
+'filereadonlyerror' => 'נישט מעגלעך צו ענדערן די טעקע "$1" ווייל די טעקע רעפאזיטאריום  "$2" איז אין נאר־ליינען מצב.
+דער סיסאפ וואס האט זי פארשפארט האט געגעבן דעם הסבר:  "$3"',
 
 # Virus scanner
 'virus-badscanner' => "שלעכטע קאנפֿיגוראציע: אומבאוואוסטער ווירוס איבערקוקער: ''$1''",
@@ -598,8 +600,8 @@ $2',
 'nologin' => "איר האט נישט קיין קאנטע? '''$1'''.",
 'nologinlink' => 'באשאפֿט א קאנטע',
 'createaccount' => 'באשאפֿט א נייע קאנטע',
-'gotaccount' => "האסט שוין א קאנטע? '''$1'''.",
-'gotaccountlink' => 'אריינלאגירן',
+'gotaccount' => "האסטו שוין א קאנטע? '''$1'''.",
+'gotaccountlink' => 'אַרײַנלאגירן',
 'userlogin-resetlink' => 'פארגעסן אײַערע אַרײַנלאָגירן פרטים?',
 'createaccountmail' => 'דורך ע-פאסט',
 'createaccountreason' => 'אורזאַך:',
@@ -661,6 +663,7 @@ $2',
 'invalidemailaddress' => 'דער ע-פאסט אדרעס קען נישט אקצעפטירט ווערן ווייל ער שיינט צו האבן אן אומגילטיגן פֿארמאט.
 ביטע אריינלייגן א גוט-פארמאטירטן אדרעס אדער ליידיגט אויס דאס פֿעלד.',
 'cannotchangeemail' => "מ'קען נישט ענדערן קאנטע ע־פאסט אדרעסן אין דער וויקי.",
+'emaildisabled' => 'דאס וועבזייטל קען נישט שיקן ע־בריוון.',
 'accountcreated' => 'די קאָנטע איז באַשאַפֿן',
 'accountcreatedtext' => 'די באניצער קאנטע פאר $1 איז באַשאַפֿן געווארן.',
 'createaccount-title' => 'קאנטע באשאפֿן אין {{SITENAME}}',
@@ -864,7 +867,8 @@ $2
 'userinvalidcssjstitle' => "'''ווארענונג:''' סאיז נישטא קיין סקין \"\$1\". גדענקט אז קאסטעם .css און .js בלעטער נוצען לאוער קעיס טיטול, e.g. {{ns:user}}:Foo/vector.css ווי אנדערשט צו {{ns:user}}:Foo/Vector.css.",
 'updated' => '(דערהיינטיגט)',
 'note' => "'''באמערקונג:'''",
-'previewnote' => "'''דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג, דער אַרטיקל איז דערווייל נאָך נישט געהיט!'''",
+'previewnote' => "'''געדענקט אז דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג.'''
+אייערע ענדערונגען זענען נאָך נישט געהיט!",
 'previewconflict' => 'די פֿאראויסיגע ווייזונג רעפלעקטירט דעם טעקסט און דער אויבערשטע טעקסט ענדערונג אָפטיילונג וויאזוי דאס וועט אויסזען אויב וועט איר דאס אָפהיטן.',
 'session_fail_preview' => "'''אנטשולדיגט! מען האט נישט געקענט פראצעסירן אייער ענדערונג צוליב א פארלוסט פון סעסיע דאטע. ביטע פרובירט נאכאמאל. אויב ס'ארבעט נאך אלס ניט, פרובירט [[Special:UserLogout|ארויסלאגירן]] און זיך צוריק אריינלאגירן.",
 'session_fail_preview_html' => "''''''אַנטשולדיקט! מיר קענען נישט פּראָצעסירן אײַער ענדערונג צוליב א פֿאַרלוסט פֿון סעסיע דאַטע.''''''
@@ -876,6 +880,7 @@ $2
 די ענדערונג איז געווארן אפגעווארפן כדי נישט צו אנמאכן א חורבן אין די טעקסט פונעם בלאט.
 דאס געשענט מייסטענס ווען איר נוצט אן אנאניאמער פראקסי סערווער.",
 'editing' => 'ענדערן $1',
+'creating' => 'שאפֿן $1',
 'editingsection' => 'ענדערט $1 (אפטיילונג)',
 'editingcomment' => 'רעדאַקטירן $1 (נײַע אפטיילונג)',
 'editconflict' => 'ענדערן קאנפליקט: $1',
@@ -941,6 +946,7 @@ $2
 'edit-no-change' => "מ'האט איגנארירט אײַער רעדאַקטירונג, ווײַל קיין שום ענדערונג איז נישט געמאַכט צום טעקסט.",
 'edit-already-exists' => 'נישט מעגליך צו שאַפֿן נייע בלאט.
 ער עקזיסטירט שוין.',
+'defaultmessagetext' => 'גרונטלעכער מעלדונג טעקסט',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.
@@ -958,7 +964,7 @@ $2
 
 # "Undo" feature
 'undo-success' => 'די ענדערונג קען ווערן מבוטל. ביטע נאכקוקן די פארגלייך פון אונטן צו זיין זיכער אז דאס איז וואס איר ווילט טאן, און דערנאך היט-אפ די ענדערונגן פון אונטן צו ענדיגן דאס בטל מאכן די ענדערונג.',
-'undo-failure' => '×\93×\99 ×¢× ×\93ער×\95× ×\92 ×§×¢×\9f × ×\99ש×\98 ×\95×\95ער×\9f ×\90×\95×\9e\92×¢×\98×\90×\9f ×¦×\95×\9c×\99×\91 ×§×\90נפ×\9c×\99ק×\98×\99× ×\92 ×\90×\99× ×\98ער×\9e×\99×\93×\99×¢×\98 ×¢× ×\93ער×\95× ×\92ן.',
+'undo-failure' => '×\93×\99 ×¢× ×\93ער×\95× ×\92 ×§×¢×\9f × ×\99ש×\98 ×\9e×\91×\95×\98×\9c ×\95×\95ער×\9f ×¦×\95×\9c×\99×\91 ×¡×ª×\99ר×\95ת ×\9e×\99×\98 ×¦×\95×\95×\99שנצ×\99×\99×\98×\9c×¢×\9b×¢ ×¢× ×\93ער×\95× ×\92×¢ן.',
 'undo-norev' => "ס'איז נישט מעגלעך צוריקקערן די רעדאַקטירונג ווײַל זי עקסיסטירט נישט אדער איז אויסגעמעקט.",
 'undo-summary' => 'זיי מבטל רי-ווערסיע $1 פון [[Special:Contributions/$2|$2]] ([[User talk:$2|רעדן]])',
 
@@ -1652,6 +1658,7 @@ $1",
 
 # HTTP errors
 'http-invalid-url' => 'אומגילטיג URL: $1',
+'http-request-error' => 'HTTP בקשה דורכגעפאלן צוליב אומבאוואוסטער פעלער.',
 'http-read-error' => 'HTTP לייענען גרײַז.',
 'http-timed-out' => 'HTTP בקשה אויסגעגאַנגען.',
 'http-curl-error' => 'גרײַז בײַם ברענגען URL: $1',
@@ -2345,14 +2352,17 @@ $1',
 'blockipsuccesstext' => 'באַניצער [[Special:Contributions/$1|$1]] <br />איז פֿאַרשפאַרט.
 זעט די [[Special:BlockList|ליסטע פון בלאקירטע באַניצער]] כדי צו זען די בלאקירונגען.',
 'ipb-blockingself' => 'איר האַלט בײַ בלאקירן זיך אַליין! איר ווילט דאָס טאַקע טון?',
+'ipb-confirmhideuser' => 'איר האלט ביי בלאקירן א באניצער וואס האט "באהאלטן באניצער" סטאטוס. דאס וועט פארשטעקן דעם באניצערס נאמען אין אלע ליסטעס און לאגביכער. צי זענט איר זיכער אז איר ווילט דאס טאקע טון?',
 'ipb-edit-dropdown' => 'רעדאקטיר בלאקירונג סיבות',
 'ipb-unblock-addr' => 'אויפֿבלאקירן $1',
 'ipb-unblock' => 'אויפֿבלאקירן א באַניצער נאמען אדער IP אדרעס',
 'ipb-blocklist' => 'זעט עקזיסטירנדע בלאקירונגען',
 'ipb-blocklist-contribs' => 'בײַשטײַערונגען פֿון $1',
 'unblockip' => 'אויפֿבלאקירן באניצער',
+'unblockiptext' => 'מיט דעם פארמולאר קענט איר צוריקשטעלן שרייבן ערלויבניש צו אן IP אדרעס אדער באניצער נאמען וואס איז געווען בלאקירט.',
 'ipusubmit' => 'אוועקנעמען דעם בלאק',
 'unblocked' => '[[User:$1|$1]] איז געווארן באַפֿרייט פון זײַן בלאק',
+'unblocked-range' => '$1 איז באפרייט פון בלאקירן',
 'unblocked-id' => 'בלאק $1 איז געווארן אַראָפגענומען.',
 'blocklist' => 'בלאקירטע באַניצער',
 'ipblocklist' => 'בלאקירטע באַניצער',
@@ -2391,8 +2401,9 @@ $1',
 דער פֿאַרשטיקונג לאג איז צוגעשטעלט אונטן:',
 'blocklogentry' => 'בלאקירט "[[$1]]" אויף אַ תקופה פון $2 $3',
 'reblock-logentry' => 'גענדערט די בלאקירונג דעפיניציעס פון [[$1]] מיטן צייט אפלויף פון $2 $3',
-'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצערס. איי פי אדרעסן וואס זענען בלאקירט אויטאמאטיש ווערן נישט אויסגערעכענט דא.
-זעט די איצטיגע [[Special:BlockList|ליסטע פון בלאקירטע באניצערס]].',
+'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצער. 
+איי פי אדרעסן וואס זענען בלאקירט אויטאמאטיש ווערן נישט אויסגערעכענט דא.
+זעט די איצטיקע [[Special:BlockList|ליסטע פון בלאקירטע באניצער]].',
 'unblocklogentry' => 'אומבלאקירט $1',
 'block-log-flags-anononly' => 'בלויז אַנאנימע באַניצער',
 'block-log-flags-nocreate' => 'קאָנטע שאַפֿן איז פֿאַרשפּאַרט',
@@ -2431,6 +2442,7 @@ $1',
 'unlockbtn' => 'אויפֿשליסן די דאַטנבאַזע',
 'locknoconfirm' => 'איר האט נישט אָנגעצייכנט דאָס באַשטעטיקונג קעסטל.',
 'lockdbsuccesssub' => 'דאַטנבאַזע פֿאַרשפאַרט מיט הצלחה',
+'unlockdbsuccesssub' => 'דאטנבאזע שלאס אראפגענומען',
 'unlockdbsuccesstext' => 'די דאַטנבאַזע איז געווארן אויפֿגעשלאסן',
 'databasenotlocked' => 'די דאַטנבאַזע איז נישט פֿאַרשלאסן.',
 'lockedbyandtime' => '(דורך $1 אום $2 בײַ $3)',
@@ -2469,6 +2481,7 @@ $1',
 
 אין די פֿעלער, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
 'movearticle' => 'באוועג בלאט:',
+'moveuserpage-warning' => "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
 'movenologin' => 'איר זענט נישט אַריינלאָגירט',
 'movenologintext' => 'איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.',
 'movenotallowed' => 'איר זענט נישט דערלויבט צו באוועגן בלעטער.',
@@ -2572,6 +2585,7 @@ $1',
 'thumbnail_invalid_params' => 'אומגילטיגע קליינבילד פאראמעטערס',
 'thumbnail_dest_directory' => "מ'קען נישט שאפֿן דעם ציל קארטאטעק",
 'thumbnail_image-type' => 'בילד טיפ נישט געשטיצט',
+'thumbnail_gd-library' => 'אומפולשטענדיקע קאנפיגוראציע פאר דער GD-ביבליאטעק: פונקציע $1 פעלט',
 'thumbnail_image-missing' => 'טעקע פֿעלט אייגנטלעך: $1',
 
 # Special:Import
@@ -2598,7 +2612,7 @@ $1',
 'importbadinterwiki' => 'שלעכטע אינטערוויקי לינק',
 'importnotext' => 'ליידיג אדער נישט קיין טעקסט',
 'importsuccess' => '!אימפארט אדורכגעפירט מיט דערפאלג!',
-'importhistoryconflict' => 'ק×\90נפ×\9c×\99ק×\98×\99× ×\92 ×\94×\99ס×\98×\90ר×\99×¢ ×¨×¢×\95×\95×\99×\96×\99×¢ ×¢×§×\96עס×\98×\99ר×\98 (×\9e×¢×\92×\9c×\99×\9a ×\90×\96 ×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ×©×\95×\99×\9f ×¤×\95ן פריער)',
+'importhistoryconflict' => 'פ×\90ר×\90×\9f ×\90 ×§×\90נפ×\9c×\99ק×\98 ×\9e×\99×\98 ×\93ער ×¢×§×\96×\99ס×\98×\99רנ×\93×¢ ×\94×\99ס×\98×\90ר×\99×¢ ×¨×¢×\95×\95×\99×\96×\99×¢ (×\9e×¢×\92×\9c×\99×\9a ×\90×\96 ×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ×©×\95×\99ן פריער)',
 'importnosources' => 'קיין מקורות פֿאַר צווישן־וויקי אימפארט, און דירעקט היסטאריע אַרויפֿלאָדן איז נישט דערמעגלעכט אַצינד.',
 'importnofile' => 'קיין אימפארט טעקע איז נישט ארויפֿגעלאדן.',
 'importuploaderrorsize' => 'אַרויפֿלאָדן פֿון אימפארט טעקע דורכגעפֿאלן.
@@ -2615,15 +2629,26 @@ $1',
 'import-token-mismatch' => 'אָנווער פון סעסיע דאַטן. 
  ביטע פרובירט נאכאמאל.',
 'import-invalid-interwiki' => 'נישט מעגלעך צו אימפארטירן פון ספעציפֿירטער וויקי.',
+'import-error-edit' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל איר האט נישט די רעכט אים צו רעדאקטירן.',
+'import-error-create' => 'דעם  בלאט "$1" קען מען נישט אימפארטירן ווייל איר האט נישט די רעכט צו שאפן אים.',
+'import-error-interwiki' => 'דעם בלאט "$1"  קען מען נישט אימפארטירן ווייל זיין נאמען איז רעזערווירט פאר דרויסנדיקער פארבינדונג (אינטערוויקי).',
+'import-error-special' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל ער געהערט צו א באזונדערן נאמענטייל וואס אנטהאלט נישט קיין בלעטער.',
+'import-error-invalid' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל זיין נאמען איז אומגילטיק.',
 
 # Import log
-'importlogpage' => 'אימפארט לאג',
+'importlogpage' => 'אימפארט לאגבוך',
 'importlogpagetext' => 'אַדמיניסטראַטיווער אימפארט פון בלעטער מיט רעדאַגירן היסטאריע פֿון ​​אַנדערע וויקיס.',
 'import-logentry-upload' => 'האט אימפארטירט [[$1]] דורך טעקע אַרויפֿלאָדן',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}',
 'import-logentry-interwiki' => 'אריבערגעוויקיט $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} פֿון $2',
 
+# JavaScriptTest
+'javascripttest' => 'JavaScript טעסט',
+'javascripttest-disabled' => 'די  פֿונקציע איז אומאַקטיווירט אין דער דאזיקער וויקי.',
+'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
+'javascripttest-pagetext-skins' => 'קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'אייער באניצער בלאט',
 'tooltip-pt-anonuserpage' => 'באַניצער בלאַט פון דעם IP אַדרעס',
@@ -2684,6 +2709,8 @@ $1',
 'tooltip-diff' => 'ווײַזן אייערע ענדערונגען צום טעקסט',
 'tooltip-compareselectedversions' => 'פארגלײַכם די צוויי ווערסיעס פון דעם בלאט',
 'tooltip-watch' => 'לייגט צו דעם בלאט צו אייער אויפֿפאסונג ליסטע',
+'tooltip-watchlistedit-normal-submit' => 'אַראָפנעמען בלעטער',
+'tooltip-watchlistedit-raw-submit' => 'דערהיינטיגן אויפפאסונג ליסטע',
 'tooltip-recreate' => 'ווידערשאַפֿן דעם בלאַט כאטש ער איז אַמאל אויסגעמעקט',
 'tooltip-upload' => 'הייב אן אויפלאדן',
 'tooltip-rollback' => '"צוריקדרייען" דרײט צוריק רעדאַקטירונג(ען) צו דעם בלאַט פֿונעם לעצטן בײַשטײַערער מיט אײן קװעטש',
@@ -2712,6 +2739,7 @@ $1',
 'siteusers' => '{{PLURAL:$2|באַניצער| באַניצערס}} {{SITENAME}} $1',
 'anonusers' => '{{SITENAME}} {{PLURAL:$2| אַנאנימער באַניצער|אַנאנימע באַניצער}} $1',
 'creditspage' => 'בלאט קרעדיטס',
+'nocredits' => 'נישט פאראן קיין אינפארמאציע פאר דעם בלאט.',
 
 # Spam protection
 'spamprotectiontitle' => 'ספעם באשיצונג פילטער',
@@ -2763,12 +2791,16 @@ $1',
 'nextdiff' => 'קומענדיקע ווערסיע ←',
 
 # Media information
+'thumbsize' => 'קליינבילד גרייס:',
 'widthheightpage' => '$1 × $2, {{PLURAL:$3|איין בלאט|$3 בלעטער}}',
 'file-info' => 'טעקע גרייס: $1, MIME טיפ: $2',
 'file-info-size' => '$1 × $2 פיקסעל, טעקע גרייס: $3, טיפ MIME: $4',
-'file-nohires' => 'נישטא מיט א העכערע רעזאלוציע.',
+'file-info-size-pages' => '$1 × $2 פיקסעלן, טעקע גרייס: $3, MIME טיפ: $4,  $5 {{PLURAL:$5|בלאט|בלעטער}}',
+'file-nohires' => 'נישטא מיט א העכערער רעזאלוציע.',
 'svg-long-desc' => 'טעקע SVG, נאמינעל: $1 × $2 פיקסעלן, טעקע גרייס: $3',
 'show-big-image' => 'בילד מיט דער גרעסטער רעזאלוציע',
+'show-big-image-preview' => 'גרייס פון דעם פארויסקוק: $1.',
+'show-big-image-other' => '{{PLURAL:$2|אנדער רעזאלוציע|אנדערע רעזאלוציעס}}: $1.',
 'show-big-image-size' => '$1 × $2 פיקצעלן',
 'file-info-gif-looped' => 'אין א פעטליע',
 'file-info-gif-frames' => '$1 {{PLURAL:$1| ראַם | ראָמען}}',
@@ -2920,11 +2952,18 @@ $1',
 'exif-languagecode' => 'שפראַך',
 'exif-iimversion' => 'IIM ווערסיע',
 'exif-iimcategory' => 'קאַטעגאָריע',
+'exif-iimsupplementalcategory' => 'אונטער־קאטעגאריעס',
 'exif-datetimeexpires' => 'נישט צו ניצן נאָך',
 'exif-datetimereleased' => 'באַפֿרייט אום',
+'exif-originaltransmissionref' => 'ארגינעלער טראנסמיסיע פלאצירונג קאד',
+'exif-identifier' => 'אידענטיפֿיצירער',
+'exif-lens' => 'געניצטער לינז',
+'exif-serialnumber' => 'סעריע־נומער פון קאמערע',
 'exif-cameraownername' => 'אייגנטימער פון קאמערע',
+'exif-label' => 'צעטל',
 'exif-datetimemetadata' => 'דאטע ווען מעטאדאטן זענען געווען לעצט געענדערט',
 'exif-rating' => 'שאצונג (פֿון 5)',
+'exif-rightscertificate' => 'רעכטן פארוואלטונג צערטיפיקאט',
 'exif-copyrighted' => 'קאפירעכט סטאַטוס',
 'exif-copyrightowner' => 'קאפירעכטן האלטער',
 'exif-usageterms' => 'ניץ באַדינגונג',
@@ -2932,6 +2971,7 @@ $1',
 'exif-morepermissionsurl' => 'אלטערנאטיווע ליצענצירן אינפארמאציע',
 'exif-pngfilecomment' => 'PNG טעקע הערה',
 'exif-giffilecomment' => 'GIF טעקע הערה',
+'exif-intellectualgenre' => 'ארט  איינהייט',
 'exif-subjectnewscode' => 'טעמע קאד',
 
 # EXIF attributes
@@ -3164,6 +3204,12 @@ $5
 'confirm_purge_button' => 'אויספֿירן',
 'confirm-purge-top' => 'אויסקלארן די קאשעי פון דעם בלאט?',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'יאָ',
+'confirm-watch-top' => 'צולייגן דעם בלאט צו אייער אויפֿפאסונג ליסטע?',
+'confirm-unwatch-button' => 'יאָ',
+'confirm-unwatch-top' => 'אראפנעמען דעם בלאט פון אייער אויפפאסונג ליסטע?',
+
 # Multipage image navigation
 'imgmultipageprev' => '→ פֿריערדיגער בלאַט',
 'imgmultipagenext' => 'צום קומענדיגן בלאט ←',
@@ -3198,6 +3244,7 @@ $5
 'watchlistedit-normal-title' => 'רעדאַקטירן די אויפֿפאַסונג ליסטע',
 'watchlistedit-normal-legend' => 'אַראָפנעמען בלעטער פון דער אויפֿפאסן ליסטע',
 'watchlistedit-normal-submit' => 'אַראָפנעמען בלעטער',
+'watchlistedit-normal-done' => '{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווארן אראפגענומען פון אייער אויפפאסונג־ליסטע:',
 'watchlistedit-raw-title' => 'רעדאַקטירן די רויע אויפֿפאַסונג ליסטע',
 'watchlistedit-raw-legend' => 'רעדאַקטירן די רויע אויפֿפאַסונג ליסטע',
 'watchlistedit-raw-titles' => 'טיטלען:',
@@ -3434,4 +3481,14 @@ $5
 'api-error-uploaddisabled' => 'ארויפֿלאָדן איז אומאַקטיווירט אויף דער וויקי',
 'api-error-verification-error' => 'די טעקע איז מעגלעך פֿארדארבן, אדער האט א פֿאַלשע ענדונג.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|סעקונדע|סעקונדעס}}',
+'duration-minutes' => '$1 {{PLURAL:$1|מינוט|מינוט}}',
+'duration-hours' => "$1 {{PLURAL:$1|שעה|שעה'ן}}",
+'duration-days' => '$1 {{PLURAL:$1|טאג|טעג}}',
+'duration-weeks' => '$1 {{PLURAL:$1|וואך|וואכן}}',
+'duration-years' => '$1 {{PLURAL:$1|יאר|יאר}}',
+'duration-decades' => '$1 {{PLURAL:$1|צענדליקער|צענדליקערס}}',
+'duration-centuries' => '$1 {{PLURAL:$1|יארהונדערט|יארהונדערטער}}',
+
 );
index 5caf171..3497c72 100644 (file)
@@ -975,7 +975,7 @@ Kò ṣe é bòmọ́lẹ̀.',
 # Suppression log
 'suppressionlog' => 'Àkọọ́lẹ̀ ìfisílẹ̀',
 'suppressionlogtext' => 'Nísàlẹ̀ ni àtòjọ àwọn ìparẹ́ àti ìdínà tó ní àwọn àkóónú àbòmọ́lẹ̀ sí àwọn olùmójútó.
-Ẹ wo [[Special:BlockList|àtòjọ ìdínà IP]] fún àtòjọ àwọn ìdénà àti ìdínà ìgbàyí.',
+Ẹ wo [[Special:BlockList|àtòjọ ìdínà]] fún àtòjọ àwọn ìdénà àti ìdínà ìgbàyí.',
 
 # History merging
 'mergehistory' => 'Ìdàpọ̀ àwọn ìtàn ojúewé',
@@ -1390,9 +1390,11 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 '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ẹ́ (JavaScript pọndandan)',
 'rc-enhanced-hide' => 'Ìfipamọ́ ẹ̀kúnrẹ́rẹ́',
+'rc-old-title' => 'dídá tẹ́lẹ̀tẹ́lẹ̀ bíi "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Àtúnṣe tó báramu',
@@ -1456,7 +1458,7 @@ Láti fí fáìlì pọ̀mọ́ sínú ojúewé kan, ẹ lo àjápọ̀ bíi ìk
 'filetype-missing' => 'Fáìlì yìí kò ní ìfàgùn (fún àpẹrẹ ".jpg").',
 'empty-file' => 'Fáílì tí ẹ fúnsílẹ̀ jẹ́ òfo nínú.',
 'file-too-large' => 'Fáílì tí ẹ fúnsílẹ̀ jẹ́ títóbijù',
-'filename-tooshort' => 'Orúkọ fáílì jẹ́ kíkéréjú.',
+'filename-tooshort' => 'Orúkọ fáílì kéréjú bó ṣe yẹ lọ.',
 'filetype-banned' => 'Irú fáílì yìí ti jẹ́ dídí lọ́nà.',
 'verification-error' => 'Fáìlì yìí kò kọjá ìfidájú fáìlì.',
 'illegal-filename' => 'Orúkọ fáílì yìí kò jẹ́ gbígbàláàyè.',
@@ -2299,7 +2301,7 @@ $1',
 'badipaddress' => 'Àdírẹ́ẹ̀sì IP tíkòtọ́',
 'blockipsuccesssub' => 'Ìdínà yọrí sí rere',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ti jẹ́ dídílọ́nà.<br />
-Ẹ wo [[Special:BlockList|IP àkójọ ìdínà]] láti ṣàtúnyẹ̀wò àwọn ìdínà.',
+Ẹ wo [[Special:BlockList|àtòjọ ìdínà]] láti ṣàtúnyẹ̀wò àwọn ìdínà.',
 'ipb-blockingself' => 'Ẹ ti fẹ́ dínà ara yín! Ṣé èyí dáa yín lójú?',
 'ipb-edit-dropdown' => 'Àtúnṣe àwọn ìdí ìdínà',
 'ipb-unblock-addr' => 'Ìmúkúrò ìdínà $1',
@@ -2464,6 +2466,7 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
 
 # Export
 'export' => 'Ìkójáde àwọn ojúewé',
+'exportall' => 'Ìkójáde gbogbo àwọn ojúewé',
 'export-submit' => 'Kósíta',
 'export-addcattext' => 'Àfikún àwọn ojúewé láti inú ẹ̀ka:',
 'export-addcat' => 'Ìròpọ̀',
@@ -2756,10 +2759,22 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 
 'exif-subjectdistancerange-0' => 'Aláìmọ̀',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|meter|meters}} ló fiwà lókè omi-òkun',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|meter|meters}} ló fiwà lábẹ́ omi-òkun',
+
 'exif-gpsmeasuremode-2' => 'Ìwọ̀n ẹlẹ́gbẹ̀ẹ́ 2',
 'exif-gpsmeasuremode-3' => 'Ìwọ̀n ẹlẹ́gbẹ̀ẹ́ 3',
 
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'Kilometers láàrin wákàtí kan',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Kilometers',
+
 'exif-dc-date' => 'Ọjọ́ọdún',
+'exif-dc-publisher' => 'Olùtẹ̀jáde',
+'exif-dc-type' => 'Irú amóhùnmáwòrán',
 
 'exif-iimcategory-ace' => 'Ìṣẹ́ọnà, àṣà àti fàájì',
 'exif-iimcategory-edu' => 'Ẹ̀kọ́',
@@ -2768,6 +2783,8 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'exif-iimcategory-lab' => 'Ìsẹ́',
 'exif-iimcategory-pol' => 'Ìṣèlú',
 'exif-iimcategory-rel' => 'Ẹ̀sìn àti ìgbàgbọ́',
+'exif-iimcategory-sci' => 'Sáyẹ̀nsì àti ọ̀rọ̀iṣẹ́ọnà',
+'exif-iimcategory-spo' => 'Àwọn eréìdárayá',
 'exif-iimcategory-wea' => 'Ojúọjọ́',
 
 'exif-urgency-low' => 'Kúkúrú ($1)',
@@ -2959,4 +2976,9 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'feedback-error3' => 'Àsìṣe: Kò sí ìdáhùn látọ̀dọ̀ API',
 'feedback-close' => 'Ṣetán',
 
+# API errors
+'api-error-filename-tooshort' => 'Orúkọ fáílì kéréjú bó ṣe yẹ lọ.',
+'api-error-unknown-code' => 'Àsìṣe aláìlójúùtú: "$1".',
+'api-error-unknownerror' => 'Àsìṣe aláìlójúùtú: "$1".',
+
 );
index 77efaac..8a07a72 100644 (file)
@@ -11,6 +11,7 @@
  * @author Kaganer
  * @author KaiesTse
  * @author Mark85296341
+ * @author Simon Shek
  * @author Waihorace
  * @author William915
  * @author Wong128hk
@@ -638,6 +639,7 @@ $1',
 'createaccount' => '開戶口',
 'gotaccount' => '已經有戶口? $1。',
 'gotaccountlink' => '登入',
+'userlogin-resetlink' => '唔記得簽到資料?',
 'createaccountmail' => '用電郵',
 'createaccountreason' => '原因:',
 'badretype' => '你入嘅密碼唔一致。',
@@ -1698,7 +1700,7 @@ $1',
 'filehist-filesize' => '檔案大細',
 'filehist-comment' => '註解',
 'filehist-missing' => '檔案遺失',
-'imagelinks' => '檔案連結',
+'imagelinks' => '檔案用途',
 'linkstoimage' => '以下嘅$1個頁面連結到呢個檔案:',
 'linkstoimage-more' => '多過$1版連過去呢個檔案。
 下面嘅表只係列示咗連去呢個檔案嘅最頭$1版。
index 99b6f0e..c1e0fbe 100644 (file)
@@ -42,6 +42,8 @@
  * @author PhiLiP
  * @author Shinjiman
  * @author Shizhao
+ * @author Simon Shek
+ * @author Supaiku
  * @author Tommyang
  * @author Waihorace
  * @author Wilsonmess
@@ -455,7 +457,7 @@ $messages = array(
 'protectthispage' => '保护本页',
 'unprotect' => '更改保护',
 'unprotectthispage' => '更改本页面的保护',
-'newpage' => 'æ\9c\80æ\96°é¡µé\9d¢',
+'newpage' => '新页面',
 'talkpage' => '讨论本页',
 'talkpagelinktext' => '讨论',
 'specialpage' => '特殊页面',
@@ -634,9 +636,9 @@ $2',
 'customjsprotected' => '您没有权限编辑此JavaScript页面,因为它包含另一位用户的个人设置。',
 'ns-specialprotected' => '您不能编辑特殊页面。',
 'titleprotected' => '此标题已被[[User:$1|$1]]保护以防止创建。理由是“$2”。',
-'filereadonlyerror' => '无法修改文件“$1”,因为文件库“$2”处于只读模式。
+'filereadonlyerror' => '无法修改文件“$1”,因为文件库“$2”处于只读模式。 
 
»\99å\87ºç\9a\84ç\90\86ç\94±æ\98¯“$3”。',
®¡ç\90\86å\91\98对é\94\81å®\9aå®\83ç»\99å\87ºç\9a\84解é\87\8aæ\98¯ï¼\9a“$3”。',
 
 # Virus scanner
 'virus-badscanner' => "错误的配置:未知的病毒扫描程序:''$1''",
@@ -887,7 +889,8 @@ $2
 'userinvalidcssjstitle' => "'''警告:''' 不存在皮肤\"\$1\"。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
-'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存![[#editform|→ 继续编辑]]",
+'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存!",
+'continue-editing' => '继续编辑',
 'previewconflict' => '这个预览显示了上面文字编辑区中的内容。它将在你选择保存后出现。',
 'session_fail_preview' => "'''抱歉!由于会话数据丢失,我们不能处理你的编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|退出]]后重新登录。",
 'session_fail_preview_html' => "'''抱歉!我们不能处理你在进程数据丢失时的编辑。'''
@@ -1101,7 +1104,7 @@ $1",
 
 # Suppression log
 'suppressionlog' => '监督日志',
-'suppressionlogtext' => '该列表列出对管理员隐藏的删除与封禁。另参见[[Special:BlockList|IP封锁名单]]以查询当前的封禁列表。',
+'suppressionlogtext' => '该列表列出了管理员隐藏的删除与封禁。另参见[[Special:BlockList|封禁列表]]查询当前的封禁列表。',
 
 # History merging
 'mergehistory' => '合并页面历史',
@@ -1156,8 +1159,8 @@ $1",
 'notextmatches' => '没有页面内容匹配',
 'prevn' => '前$1个',
 'nextn' => '后$1个',
-'prevn-title' => '前$1结果',
-'nextn-title' => '后$1结果',
+'prevn-title' => '前$1结果',
+'nextn-title' => '后$1结果',
 'shown-title' => '每页显示$1项结果',
 'viewprevnext' => '查看($1{{int:pipe-separator}}$2)($3)',
 'searchmenu-legend' => '搜索选项',
@@ -1233,7 +1236,7 @@ $1",
 'prefs-rc' => '最近更改',
 'prefs-watchlist' => '监视列表',
 'prefs-watchlist-days' => '监视列表中显示的天数:',
-'prefs-watchlist-days-max' => '最多$1{{PLURAL:$1|天}}',
+'prefs-watchlist-days-max' => '最多$1',
 'prefs-watchlist-edits' => '扩展监视列表中显示的最大更改数:',
 'prefs-watchlist-edits-max' => '最大数量:1000',
 'prefs-watchlist-token' => '监视列表权标:',
@@ -1424,7 +1427,7 @@ $1",
 'right-editusercss' => '编辑其他用户的CSS文件',
 'right-edituserjs' => '编辑其他用户的JavaScript文件',
 'right-rollback' => '快速回退最后对特定页面作出的编辑的用户的所有编辑',
-'right-markbotedits' => '标示复原编辑作机械人编辑',
+'right-markbotedits' => '将回退编辑标记为机器人编辑动作',
 'right-noratelimit' => '没有使用频率限制',
 'right-import' => '由其它wiki中导入页面',
 'right-importupload' => '由文件上传中导入页面',
@@ -1656,7 +1659,7 @@ $1',
 'upload-too-many-redirects' => '在网址中有太多重新定向',
 'upload-unknown-size' => '未知大小',
 'upload-http-error' => '发生HTTP错误:$1',
-'upload-copy-upload-invalid-domain' => 'ä¸\8dè\83½ä»\8e该å\9f\9få\90\8dä¸\8bè½½æ\96\87件。',
+'upload-copy-upload-invalid-domain' => 'ä¸\8dè\83½ä»\8e该å\9f\9få\90\8dä¸\8aè½½æ\96\87件å\89¯æ\9c¬。',
 
 # File backend
 'backend-fail-stream' => '无法流传送文件$1。',
@@ -1800,6 +1803,9 @@ $1',
 请参阅在[$2 文件描述页面]以了解其相关信息。',
 'sharedupload-desc-here' => '该文件来自于$1,它可能在其它计划项目中被应用。
 它在[$2 文件描述页面]那边上的描述于下面显示。',
+'sharedupload-desc-edit' => '该文件来自$1,它可能在其它计划项目中被使用。
+或许您可以在其[$2 文件描述页面]上编辑说明。',
+'sharedupload-desc-create' => '此文件是从 $1 和可能由其他维基项目使用。 !N !也许您想在其[ $2 文件描述页面]编辑说明。',
 'filepage-nofile' => '不存在此名称的文件。',
 'filepage-nofile-link' => '不存在此名称的文件,但您可以[$1 上传它]。',
 'uploadnewversion-linktext' => '上传该文件的新版本',
@@ -2010,6 +2016,10 @@ $1',
 'allpages-bad-ns' => '在{{SITENAME}}中没有一个叫做"$1"的名字空间。',
 'allpages-hide-redirects' => '隐藏重定向页',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => '你正在浏览本页的缓存版本,至多可能存在 $1 的延迟。',
+'cachedspecial-refresh-now' => '查看最新的。',
+
 # Special:Categories
 'categories' => '分类',
 'categoriespagetext' => '以下的{{PLURAL:$1|分类}}中包含了页面或媒体。
@@ -3590,6 +3600,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'version-software' => '已安装的软件',
 'version-software-product' => '产品',
 'version-software-version' => '版本',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => '文件路径',
@@ -3777,4 +3788,15 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'api-error-uploaddisabled' => '这个维基不接受上传。',
 'api-error-verification-error' => '此文件可能已损坏,或有错误的扩展名。',
 
+# Durations
+'duration-seconds' => '$1{{PLURAL:$1|秒|秒}}',
+'duration-minutes' => '$1{{PLURAL:$1|分钟|分钟}}',
+'duration-hours' => '$1{{PLURAL:$1|小时|小时}}',
+'duration-days' => '$1{{PLURAL:$1|天|天}}',
+'duration-weeks' => '$1{{PLURAL:$1|星期|星期}}',
+'duration-years' => '$1{{PLURAL:$1|年|年}}',
+'duration-decades' => '$1{{PLURAL:$1|0年|0年}}',
+'duration-centuries' => '$1{{PLURAL:$1|00年|00年}}',
+'duration-millennia' => '$1{{PLURAL:$1|千年|千年}}',
+
 );
index 5c80296..bdf3bea 100644 (file)
@@ -21,6 +21,7 @@
  * @author Hzy980512
  * @author Jidanni
  * @author Jimmy xu wrk
+ * @author Justincheng12345
  * @author Kaganer
  * @author KaiesTse
  * @author Kuailong
@@ -33,6 +34,7 @@
  * @author Philip
  * @author Shinjiman
  * @author Shizhao
+ * @author Simon Shek
  * @author Skjackey tse
  * @author Waihorace
  * @author Wmr89502270
@@ -590,6 +592,8 @@ $2',
 'customjsprotected' => '你並無權限去編輯此JavaScript頁面,因為他包含了另一位用戶的個人設定。',
 'ns-specialprotected' => '特殊頁面是不可以編輯的。',
 'titleprotected' => "這個標題已經被[[User:$1|$1]]保護以防止建立。理由是''$2''。",
+'filereadonlyerror' => '無法修改文件" $1 "因為文件庫" $2 "處於唯讀模式。 !
+管理員鎖定它的解釋是:" $3 "。',
 
 # Virus scanner
 'virus-badscanner' => "損壞設定: 未知的病毒掃瞄器: ''$1''",
@@ -674,6 +678,7 @@ $2',
 'emailconfirmlink' => '確認您的郵箱地址',
 'invalidemailaddress' => '郵箱地址格式不正確,請輸入正確的郵箱位址或清空該輸入框。',
 'cannotchangeemail' => '本wiki不允許對賬戶的電郵地址進行更改。',
+'emaildisabled' => '此網站不能發送電子郵件。',
 'accountcreated' => '已建立賬戶',
 'accountcreatedtext' => '$1的賬戶已經被建立。',
 'createaccount-title' => '在{{SITENAME}}中建立新賬戶',
@@ -864,6 +869,7 @@ $2
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
 'previewnote' => "'''請記住這只是預覽,內容尚未儲存!'''",
+'continue-editing' => '繼續編輯',
 'previewconflict' => '這個預覽顯示了上面文字編輯區中的內容。它將在{{GENDER:|你|妳|你}}選擇保存後出現。',
 'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
 請再試一次。
@@ -877,6 +883,7 @@ $2
 這種情況通常出現於使用含有很多臭蟲、以網絡為主的匿名代理服務的時候。",
 'edit_form_incomplete' => '編輯表單的某些部分沒有到達伺服器 ;請檢查您的編輯內容是否完整並再試一次。',
 'editing' => '編輯“$1”',
+'creating' => '創建$1',
 'editingsection' => '編輯“$1”(段落)',
 'editingcomment' => '編輯“$1”(新段落)',
 'editconflict' => '編輯衝突:$1',
@@ -942,6 +949,7 @@ $2
 'edit-no-change' => '您的編輯已經略過,因為文字無任何改動。',
 'edit-already-exists' => '不可以建立一個新頁面。
 它已經存在。',
+'defaultmessagetext' => '預設訊息文字',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告: 這個頁面有太多耗費的語法功能呼叫。
@@ -957,6 +965,10 @@ $2
 'parser-template-loop-warning' => '已偵測迴歸模板: [[$1]]',
 'parser-template-recursion-depth-warning' => '已超過迴歸模板深度限制 ($1)',
 'language-converter-depth-warning' => '已超過字詞轉換器深度限制($1)',
+'node-count-exceeded-category' => '頁面的節點數超出限制',
+'node-count-exceeded-warning' => '頁面超出節點數',
+'expansion-depth-exceeded-category' => '頁面的擴展深度超出限制',
+'expansion-depth-exceeded-warning' => '頁面超出擴展深度',
 
 # "Undo" feature
 'undo-success' => '該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。',
@@ -1083,7 +1095,7 @@ $1",
 
 # Suppression log
 'suppressionlog' => '監督日誌',
-'suppressionlogtext' => '該列表列出對管理員隱藏的刪除與封禁。另參見[[Special:BlockList|IP封鎖名單]]以查詢當前的封禁列表。',
+'suppressionlogtext' => '該列表列出對管理員隱藏的刪除與封禁。另參見[[Special:BlockList|封鎖名單]]以查詢當前的封禁列表。',
 
 # History merging
 'mergehistory' => '合併頁面歷史',
@@ -1502,6 +1514,7 @@ $1",
 'newsectionsummary' => '/* $1 */ 新段落',
 'rc-enhanced-expand' => '顯示細節 (需要 JavaScript)',
 'rc-enhanced-hide' => '隱藏細節',
+'rc-old-title' => '最初創建為"$1"',
 
 # Recent changes linked
 'recentchangeslinked' => '相關更改',
@@ -1638,6 +1651,7 @@ $1',
 'upload-too-many-redirects' => '在網址中有太多重新定向',
 'upload-unknown-size' => '未知的大小',
 'upload-http-error' => '已發生一個HTTP錯誤:$1',
+'upload-copy-upload-invalid-domain' => '不能從該域名上載檔𣗈副本。',
 
 # File backend
 'backend-fail-stream' => '無法流傳送文件$1。',
@@ -1656,12 +1670,17 @@ $1',
 'backend-fail-closetemp' => '無法創建臨時文件。',
 'backend-fail-read' => '找不到文件“$1”。',
 'backend-fail-create' => '找不到「$1」檔案。',
+'backend-fail-maxsize' => '無法創建檔𣗈$1​​,因為它大於$2字節。',
 'backend-fail-readonly' => '「$1」儲存後端目前是唯讀模式,因為:「$2」',
-'backend-fail-synced' => '文件"$1"在內部後端是不一致的區域。',
-'backend-fail-connect' => '無法連結至檔案後方“$1”。',
-'backend-fail-internal' => '檔案後方“$1”發生了一個未知錯誤。',
+'backend-fail-synced' => 'æ\96\87件"$1"å\9c¨å\85§é\83¨å­\98å\84²å¾\8c端æ\98¯ä¸\8dä¸\80è\87´ç\9a\84å\8d\80å\9f\9fã\80\82',
+'backend-fail-connect' => '無法連結至存儲後方“$1”。',
+'backend-fail-internal' => '存儲後方“$1”發生了一個未知錯誤。',
 'backend-fail-contenttype' => '無法確定檔案的內容類型以存儲於“$1”。',
-'backend-fail-batchsize' => '鑒於一批後端 $1 檔 {{PLURAL:$1| operation|operations}} ;限制是 $2   {{PLURAL:$2| operation|operations}}。',
+'backend-fail-batchsize' => '存儲後端被給予了$1次檔𣗈 {{PLURAL:$1|操作|操作}} ;限制是$2次{{PLURAL:$2|操作|操作}}。',
+
+# File journal errors
+'filejournal-fail-dbconnect' => '無法連接到後端存儲的日誌資料庫" $1 "。',
+'filejournal-fail-dbquery' => '無法更新後端存儲的日誌資料庫" $1 "。',
 
 # Lock manager
 'lockmanager-notlocked' => '無法解鎖「$1」;它沒有被鎖定。',
@@ -1694,7 +1713,10 @@ $1',
 
 # img_auth script messages
 'img-auth-accessdenied' => '拒絕存取',
-'img-auth-nopathinfo' => 'PATH_INFO缺失。您的服務器尚未設置傳送該信息。它可能是基於CGI的,因而不支持img_auth。[https://www.mediawiki.org/wiki/Manual:Image_Authorization 參見圖片認證。]',
+'img-auth-nopathinfo' => 'PATH_INFO缺失。
+您的服務器尚未設置傳送該信息。
+它可能是基於CGI的,因而不支持img_auth。
+請參見 https://www.mediawiki.org/wiki/Manual:Image_Authorization',
 'img-auth-notindir' => '所請求的路徑不在已經設定的上載目錄。',
 'img-auth-badtitle' => '不能夠由"$1"建立一個有效標題。',
 'img-auth-nologinnWL' => '您而家並未登入,"$1"不在白名單上。',
@@ -1776,6 +1798,10 @@ $1',
 請參閱在[$2 檔案描述頁面]以了解其相關資訊。',
 'sharedupload-desc-here' => '該檔案來自於$1,它可能在其它計劃項目中被應用。
 它在[$2 檔案描述頁面]那邊上的描述於下面顯示。',
+'sharedupload-desc-edit' => '該檔案來自$1,它可能在其它計劃項目中被使用。
+或許您可以在其[$2 檔𣗈描述頁面]上編輯說明。',
+'sharedupload-desc-create' => '該檔案來自$1,它可能在其它計劃項目中被使用。
+或許您可以在那邊的[$2 檔𣗈描述頁面]上編輯其說明。',
 'filepage-nofile' => '不存在此名稱的檔案。',
 'filepage-nofile-link' => '不存在此名稱的檔案,但您可以[$1 上傳它]。',
 'uploadnewversion-linktext' => '上傳該檔案的新版本',
@@ -1990,6 +2016,12 @@ Template:消除歧義',
 'allpagesprefix' => '顯示具有此前綴(名字空間)的頁面:',
 'allpagesbadtitle' => '給定的頁面標題是非法的,或者具有一個內部語言或內部 wiki 的前綴。它可能包含一個或更多的不能用於標題的字元。',
 'allpages-bad-ns' => '在{{SITENAME}}中沒有一個叫做"$1"的名字空間。',
+'allpages-hide-redirects' => '隱藏重定向頁',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => '你正在瀏覽本頁的緩存版本,至多可能存在$1的延遲。',
+'cachedspecial-viewing-cached-ts' => '您正在閱讀此頁的緩存版本,這可能不是完整的版本。',
+'cachedspecial-refresh-now' => '查看最新。',
 
 # Special:Categories
 'categories' => '頁面分類',
@@ -2426,8 +2458,8 @@ $1',
 'ipb-confirm' => '確認封禁',
 'badipaddress' => '無效IP地址',
 'blockipsuccesssub' => '查封成功',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被查封。
-<br />參看[[Special:BlockList|被封IP地址列表]]以覆審查封。',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被查封。<br />
+參看[[Special:BlockList|被封IP地址列表]]以覆審查封。',
 'ipb-blockingself' => '你要封禁自己!確認要這樣做嗎?',
 'ipb-confirmhideuser' => '你要封禁用戶並隱藏其用戶名,這會隱藏在所有列表及日誌中涉及此用戶之用戶名。你確定要這樣做嗎?',
 'ipb-edit-dropdown' => '編輯查封原因',
@@ -2739,7 +2771,7 @@ $1被封禁的理由是“$2”',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript測試',
-'javascripttest-disabled' => 'æ­¤å\8a\9fè\83½å·²ç¦\81用。',
+'javascripttest-disabled' => 'æ­¤å\8a\9fè\83½å\9c¨æ­¤Wikiä¸\8aæ\9cªè¢«ä½¿用。',
 'javascripttest-title' => '運行$1測試。',
 'javascripttest-pagetext-noframework' => '這個頁面預留了作JavaScript測試。',
 'javascripttest-pagetext-unknownframework' => '未知框架"$1"',
@@ -2830,6 +2862,11 @@ $1被封禁的理由是“$2”',
 'vector.css' => '/* 此處的 CSS 將影響使用 Vector 面板的用戶 */',
 'print.css' => '/* 此處的 CSS 將影響打印輸出 */',
 'handheld.css' => '/* 此處的 CSS 將影響在 $wgHandheldStyle 設定手提裝置面板 */',
+'noscript.css' => '/* 此處的 CSS 將影響沒有啓用 JavaScript 的用戶 */',
+'group-autoconfirmed.css' => '/* 此處的 CSS 將只會影響自動確認用戶 */',
+'group-bot.css' => '/* 此處的 CSS 將只會影響機器人 */',
+'group-sysop.css' => '/* 此處的 CSS 將只會影響管理員 */',
+'group-bureaucrat.css' => '/* 此處的 CSS 將只會影響行政員 */',
 
 # Scripts
 'common.js' => '/* 此處的JavaScript將載入於所有用戶每一個頁面。 */',
@@ -2971,14 +3008,20 @@ To disable showing a particular link, set it to 'disable', e.g.
 'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
-'variantname-zh-hans' => '簡體',
-'variantname-zh-hant' => '繁體',
+'variantname-zh-hans' => '‪中文(简体)',
+'variantname-zh-hant' => '‪中文(繁體)',
 'variantname-zh-cn' => '大陸簡體',
 'variantname-zh-tw' => '台灣正體',
 'variantname-zh-hk' => '香港繁體',
+'variantname-zh-mo' => '澳門繁體',
 'variantname-zh-sg' => '新加坡簡體',
+'variantname-zh-my' => '马来西亚简体',
 'variantname-zh' => '不轉換',
 
+# Variants for Gan language
+'variantname-gan-hans' => '‪中文(简体)',
+'variantname-gan-hant' => '‪中文(繁體)',
+
 # Metadata
 'metadata' => '元數據',
 'metadata-help' => '此檔案中包含有擴展的訊息。這些訊息可能是由數位相機或掃描儀在創建或數字化過程中所添加的。
@@ -3587,6 +3630,9 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'version-software' => '已經安裝的軟件',
 'version-software-product' => '產品',
 'version-software-version' => '版本',
+'version-entrypoints' => '入口點URL',
+'version-entrypoints-header-entrypoint' => '入口點',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => '檔案路徑',
@@ -3774,4 +3820,15 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'api-error-uploaddisabled' => '本wiki的上傳檔案功能已停用。',
 'api-error-verification-error' => '本檔案可能已損壞,或副檔名錯誤。',
 
+# Durations
+'duration-seconds' => '$1秒',
+'duration-minutes' => '$1分',
+'duration-hours' => '$1小時',
+'duration-days' => '$1天',
+'duration-weeks' => '$1週',
+'duration-years' => '$1年',
+'duration-decades' => '$1十年',
+'duration-centuries' => '$1世紀',
+'duration-millennia' => '$1千年',
+
 );
index 6e82971..2fa637a 100644 (file)
--- a/load.php
+++ b/load.php
@@ -24,7 +24,7 @@
  */
 
 // Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'load.php' );
 }
index 5d76cdf..cec1270 100644 (file)
@@ -32,7 +32,7 @@ define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 $maintClass = false;
 
 // Make sure we're on PHP5 or better
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
        require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
        wfPHPVersionError( 'cli' );
 }
@@ -320,11 +320,7 @@ abstract class Maintenance {
                }
                if ( $channel === null ) {
                        $this->cleanupChanneled();
-                       if( php_sapi_name() == 'cli' ) {
-                               fwrite( STDOUT, $out );
-                       } else {
-                               print( $out );
-                       }
+                       print( $out );
                } else {
                        $out = preg_replace( '/\n\z/', '', $out );
                        $this->outputChanneled( $out, $channel );
@@ -358,11 +354,7 @@ abstract class Maintenance {
         */
        public function cleanupChanneled() {
                if ( !$this->atLineStart ) {
-                       if( php_sapi_name() == 'cli' ) {
-                               fwrite( STDOUT, "\n" );
-                       } else {
-                               print "\n";
-                       }
+                       print "\n";
                        $this->atLineStart = true;
                }
        }
@@ -381,31 +373,17 @@ abstract class Maintenance {
                        return;
                }
 
-               $cli = php_sapi_name() == 'cli';
-
                // End the current line if necessary
                if ( !$this->atLineStart && $channel !== $this->lastChannel ) {
-                       if( $cli ) {
-                               fwrite( STDOUT, "\n" );
-                       } else {
-                               print "\n";
-                       }
+                       print "\n";
                }
 
-               if( $cli ) {
-                       fwrite( STDOUT, $msg );
-               } else {
-                       print $msg;
-               }
+               print $msg;
 
                $this->atLineStart = false;
                if ( $channel === null ) {
                        // For unchanneled messages, output trailing newline immediately
-                       if( $cli ) {
-                               fwrite( STDOUT, "\n" );
-                       } else {
-                               print "\n";
-                       }
+                       print "\n";
                        $this->atLineStart = true;
                }
                $this->lastChannel = $channel;
diff --git a/maintenance/archives/patch-ipb-parent-block-id-index.sql b/maintenance/archives/patch-ipb-parent-block-id-index.sql
new file mode 100644 (file)
index 0000000..1f413f3
--- /dev/null
@@ -0,0 +1,2 @@
+-- index for ipblocks.ipb_parent_block_id
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
diff --git a/maintenance/archives/patch-ipb-parent-block-id.sql b/maintenance/archives/patch-ipb-parent-block-id.sql
new file mode 100644 (file)
index 0000000..8ebcf78
--- /dev/null
@@ -0,0 +1,3 @@
+-- Adding ipb_parent_block_id to track the block that caused an autoblock
+ALTER TABLE /*$wgDBprefix*/ipblocks
+  ADD ipb_parent_block_id int DEFAULT NULL;
index 6752166..3846ef5 100644 (file)
@@ -24,6 +24,7 @@
  * @ingroup Maintenance
  */
 
+require_once( dirname( __FILE__ ) . '/backup.inc' );
 
 /**
  * @ingroup Maintenance
@@ -430,7 +431,8 @@ class TextPassDumper extends BackupDumper {
                                if ( $text === false && isset( $this->prefetch ) && $prefetchNotTried ) {
                                        $prefetchNotTried = false;
                                        $tryIsPrefetch = true;
-                                       $text = $this->prefetch->prefetch( $this->thisPage, $this->thisRev );
+                                       $text = $this->prefetch->prefetch( intval( $this->thisPage ),
+                                               intval( $this->thisRev ) );
                                        if ( $text === null ) {
                                                $text = false;
                                        }
@@ -444,6 +446,13 @@ class TextPassDumper extends BackupDumper {
                                        } else {
                                                $text = $this->getTextDb( $id );
                                        }
+
+                                       // No more checks for texts from DB for now.
+                                       // If we received something that is not false,
+                                       // We treat it as good text, regardless of whether it actually is or is not
+                                       if ( $text !== false ) {
+                                               return $text;
+                                       }
                                }
 
                                if ( $text === false ) {
@@ -480,20 +489,22 @@ class TextPassDumper extends BackupDumper {
                        // Something went wrong; we did not a text that was plausible :(
                        $failures++;
 
-
-                       // After backing off for some time, we try to reboot the whole process as
-                       // much as possible to not carry over failures from one part to the other
-                       // parts
-                       sleep( $this->failureTimeout );
-                       try {
-                               $this->rotateDb();
-                               if ( $this->spawn ) {
-                                       $this->closeSpawn();
-                                       $this->openSpawn();
+                       // A failure in a prefetch hit does not warrant resetting db connection etc.
+                       if ( ! $tryIsPrefetch ) {
+                               // After backing off for some time, we try to reboot the whole process as
+                               // much as possible to not carry over failures from one part to the other
+                               // parts
+                               sleep( $this->failureTimeout );
+                               try {
+                                       $this->rotateDb();
+                                       if ( $this->spawn ) {
+                                               $this->closeSpawn();
+                                               $this->openSpawn();
+                                       }
+                               } catch ( Exception $e ) {
+                                       $this->progress( "Rebooting getText infrastructure failed (" . $e->getMessage() . ")" .
+                                               " Trying to continue anyways" );
                                }
-                       } catch ( Exception $e ) {
-                               $this->progress( "Rebooting getText infrastructure failed (" . $e->getMessage() . ")" .
-                                       " Trying to continue anyways" );
                        }
                }
 
index 6a6a446..687a95c 100644 (file)
@@ -192,9 +192,8 @@ class ImageCleanup extends TableCleanup {
        }
 
        private function buildSafeTitle( $name ) {
-               global $wgLegalTitleChars;
                $x = preg_replace_callback(
-                       "/([^$wgLegalTitleChars]|~)/",
+                       '/([^' . Title::legalChars() . ']|~)/',
                        array( $this, 'hexChar' ),
                        $name );
 
diff --git a/maintenance/copyFileBackend.php b/maintenance/copyFileBackend.php
new file mode 100644 (file)
index 0000000..314318f
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Copy all files in one container of one backend to another.
+ *
+ * This can also be used to re-shard the files for one backend using the
+ * config of second backend. The second backend should have the same config
+ * as the first, except for it having a different name and different sharding
+ * configuration. The backend should be made read-only while this runs.
+ * After this script finishes, the old files in the containers can be deleted.
+ *
+ * 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
+ *
+ * @ingroup Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class CopyFileBackend extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Copy all the files in one backend to another.";
+               $this->addOption( 'src', 'Backend containing the source files', true, true );
+               $this->addOption( 'dst', 'Backend where files should be copied to', true, true );
+               $this->addOption( 'containers', 'Pipe separated list of containers', true, true );
+               $this->addOption( 'fast', 'Skip SHA-1 checks on pre-existing files' );
+       }
+
+       public function execute() {
+               $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
+               $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
+
+               $containers = explode( '|', $this->getOption( 'containers' ) );
+               foreach ( $containers as $container ) {
+                       $this->output( "Doing container $container...\n" );
+
+                       $srcPathsRel = $src->getFileList(
+                               array( 'dir' => $src->getRootStoragePath() . "/$container" ) );
+                       if ( $srcPathsRel === null ) {
+                               $this->error( "Could not list files in $container.", 1 ); // die
+                       }
+                       foreach ( $srcPathsRel as $srcPathRel ) {
+                               $srcPath = $src->getRootStoragePath() . "/$container/$srcPathRel";
+                               $dstPath = $dst->getRootStoragePath() . "/$container/$srcPathRel";
+
+                               if ( $dst->fileExists( array( 'src' => $dstPath, 'latest' => 1 ) ) ) {
+                                       if ( $this->hasOption( 'fast' ) ) {
+                                               $this->output( "Already have $dstPath.\n" );
+                                               continue; // assume already copied...
+                                       }
+                                       $srcSha1 = $src->getFileSha1Base36( array( 'src' => $srcPath ) );
+                                       $dstSha1 = $dst->getFileSha1Base36( array( 'src' => $dstPath ) );
+                                       if ( $srcSha1 && $srcSha1 === $dstSha1 ) {
+                                               $this->output( "Already have $dstPath.\n" );
+                                               continue; // already copied...
+                                       }
+                               }
+
+                               $fsFile = $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
+                               if ( !$fsFile ) {
+                                       $this->error( "Could not get local copy of $srcPath.", 1 ); // die
+                               }
+
+                               $status = $dst->prepare( array( 'dir' => dirname( $dstPath ) ) );
+                               $status->merge( $dst->store(
+                                       array( 'src' => $fsFile->getPath(), 'dst' => $dstPath ),
+                                       array( 'nonLocking' => 1, 'nonJournaled' => 1 )
+                               ) );
+                               if ( !$status->isOK() ) {
+                                       print_r( $status->getErrorsArray() );
+                                       $this->error( "Could not copy $srcPath to $dstPath.", 1 ); // die
+                               }
+
+                               $this->output( "Copied $srcPath to $dstPath.\n" );
+                       }
+               }
+       }
+}
+
+$maintClass = 'CopyFileBackend';
+require_once( RUN_MAINTENANCE_IF_MAIN );
index e05f43c..4638468 100644 (file)
@@ -30,7 +30,7 @@ $originalDir = getcwd();
 $optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend');
 
 require_once( dirname( __FILE__ ) . '/commandLine.inc' );
-require_once( 'backup.inc' );
+require_once( dirname( __FILE__ ) . '/backup.inc' );
 
 $dumper = new BackupDumper( $argv );
 
index 7a5a5f6..41a7a68 100644 (file)
@@ -27,8 +27,7 @@
 $originalDir = getcwd();
 
 require_once( dirname( __FILE__ ) . '/commandLine.inc' );
-require_once( 'backup.inc' );
-require_once( 'backupTextPass.inc' );
+require_once( dirname( __FILE__ ) . '/backupTextPass.inc' );
 
 
 $dumper = new TextPassDumper( $argv );
index 66fc656..f5162c9 100644 (file)
@@ -371,7 +371,9 @@ CREATE TABLE ipblocks (
   ipb_range_end         VARCHAR(1024),
   ipb_deleted           SMALLINT NOT NULL DEFAULT 0,
   ipb_block_email       SMALLINT NOT NULL DEFAULT 0,
-  ipb_allow_usertalk    SMALLINT NOT NULL DEFAULT 0
+  ipb_allow_usertalk    SMALLINT NOT NULL DEFAULT 0,
+  ipb_parent_block_id             INTEGER DEFAULT NULL
+  -- REFERENCES ipblocks(ipb_id) ON DELETE SET NULL
 
 );
 CREATE INDEX ipb_address
index 9a408aa..96a65fc 100644 (file)
@@ -20,8 +20,8 @@
  * @see wfWaitForSlaves()
  */
 
-if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.2.3' ) < 0 ) ) {
-       echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.2.3 or higher. ABORTING.\n" .
+if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
+       echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.3.2 or higher. ABORTING.\n" .
        "Check if you have a newer php executable with a different name, such as php5.\n";
        die( 1 );
 }
index c61ae39..6a99554 100644 (file)
@@ -237,6 +237,9 @@ $wgIgnoredMessages = array(
        'version-summary',
        'tags-summary',
        'comparepages-summary',
+       'version-entrypoints-index-php',
+       'version-entrypoints-api-php',
+       'version-entrypoints-load-php',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
@@ -464,6 +467,8 @@ $wgOptionalMessages = array(
        'metadata-langitem',
        'metadata-langitem-default',
        'nocookiesforlogin',
+       'version-entrypoints-articlepath',
+       'version-entrypoints-scriptpath',
 );
 
 /** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
index 4984495..0c3b39c 100644 (file)
@@ -408,7 +408,9 @@ $wgMessageStructure = array(
                'customjsprotected',
                'ns-specialprotected',
                'titleprotected',
-               'filereadonlyerror'
+               'filereadonlyerror',
+               'invalidtitle-knownnamespace',
+               'invalidtitle-unknownnamespace',
        ),
        'virus' => array(
                'virus-badscanner',
@@ -623,6 +625,7 @@ $wgMessageStructure = array(
                'updated',
                'note',
                'previewnote',
+               'continue-editing',
                'previewconflict',
                'session_fail_preview',
                'session_fail_preview_html',
@@ -687,6 +690,12 @@ $wgMessageStructure = array(
                'parser-template-loop-warning',
                'parser-template-recursion-depth-warning',
                'language-converter-depth-warning',
+               'node-count-exceeded-category',
+               'node-count-exceeded-warning',
+               'expansion-depth-exceeded-category',
+               'expansion-depth-exceeded-warning',
+               'parser-unstrip-loop-warning',
+               'parser-unstrip-recursion-limit',
        ),
        'undo' => array(
                'undo-success',
@@ -1440,6 +1449,7 @@ $wgMessageStructure = array(
                'http-curl-error',
                'http-host-unreachable',
                'http-bad-status',
+               'http-truncated-body',
        ),
 
        'upload-curl-errors' => array(
@@ -1755,6 +1765,11 @@ $wgMessageStructure = array(
                'allpages-bad-ns',
                'allpages-hide-redirects',
        ),
+       'cachedspecial' => array(
+               'cachedspecial-viewing-cached-ttl',
+               'cachedspecial-viewing-cached-ts',
+               'cachedspecial-refresh-now',
+       ),
        'categories' => array(
                'categories',
                'categories-summary',
@@ -3483,6 +3498,14 @@ $wgMessageStructure = array(
                'version-software',
                'version-software-product',
                'version-software-version',
+               'version-entrypoints',
+               'version-entrypoints-header-entrypoint',
+               'version-entrypoints-header-url',
+               'version-entrypoints-articlepath',
+               'version-entrypoints-scriptpath',
+               'version-entrypoints-index-php',
+               'version-entrypoints-api-php',
+               'version-entrypoints-load-php',
        ),
        'filepath' => array(
                'filepath',
@@ -3693,6 +3716,17 @@ $wgMessageStructure = array(
                'api-error-uploaddisabled',
                'api-error-verification-error',
        ),
+       'duration' => array(
+               'duration-seconds',
+               'duration-minutes',
+               'duration-hours',
+               'duration-days',
+               'duration-weeks',
+               'duration-years',
+               'duration-decades',
+               'duration-centuries',
+               'duration-millennia'
+       ),
 );
 
 /** Comments for each block */
@@ -3931,4 +3965,6 @@ Variants for Chinese language",
        'logging-irc'           => 'For IRC, see bug 34508. Do not change',
        'feedback'              => 'Feedback',
        'apierrors'             => 'API errors',
+       'duration'              => 'Durations',
+       'cachedspecial'         => 'SpecialCachedPage',
 );
index 643fc5f..ed2dae7 100644 (file)
@@ -36,14 +36,15 @@ require_once( 'writeMessagesArray.inc' );
  * @param bool $removeUnknown Remove the unknown messages?
  * @param bool $removeDupes Remove the duplicated messages?
  * @param $dupeMsgSource string The source file intended to remove from the array.
+ * @param $messagesFolder String: path to a folder to store the MediaWiki messages.
  */
-function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource ) {
+function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource, $messagesFolder ) {
        $messages = $languages->getMessages( $code );
        $messages = $messages['all'];
        if ( $removeDupes ) {
                $messages = removeDupes( $messages, $dupeMsgSource );
        }
-       MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown );
+       MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder );
 }
 
 /**
@@ -85,6 +86,7 @@ Options:
        * no-unknown: Do not list the unknown messages.
        * remove-unknown: Remove unknown messages.
        * remove-duplicates: Remove duplicated messages based on a PHP source file.
+       * messages-folder: An alternative folder with MediaWiki messages.
 
 TEXT;
        exit( 1 );
@@ -109,6 +111,7 @@ $wgWriteToFile = !isset( $options['dry-run'] );
 $wgListUnknownMessages = !isset( $options['no-unknown'] );
 $wgRemoveUnknownMessages = isset( $options['remove-unknown'] );
 $wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] );
+$messagesFolder = isset( $options['messages-folder'] ) ? $options['messages-folder'] : false;
 
 # Get language objects
 $languages = new languages();
@@ -116,8 +119,8 @@ $languages = new languages();
 # Write all the language
 if ( $wgCode == 'all' ) {
        foreach ( $languages->getLanguages() as $languageCode ) {
-               rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
+               rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder );
        }
 } else {
-       rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
+       rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder );
 }
index c5d13c9..cd36847 100644 (file)
@@ -41,16 +41,28 @@ class MessageWriter {
         * @param $write Boolean: write to the messages file?
         * @param $listUnknown Boolean: list the unknown messages?
         * @param $removeUnknown Boolean: whether to remove unkown messages
+        * @param $messagesFolder String: path to a folder to store the MediaWiki messages. Defaults to the current install.
         */
-       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown ) {
+       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder = false ) {
                # Rewrite the messages array
                $messages = self::writeMessagesArray( $messages, $code == 'en', false, $removeUnknown );
                $messagesText = $messages[0];
                $sortedMessages = $messages[1];
 
                # Write to the file
-               $filename = Language::getMessagesFileName( $code );
-               $contents = file_get_contents( $filename );
+               if ( $messagesFolder )
+                       $filename = Language::getFileName( "$messagesFolder/Messages", $code );
+               else
+                       $filename = Language::getMessagesFileName( $code );
+
+               if ( file_exists( $filename ) )
+                       $contents = file_get_contents( $filename );
+               else
+                       $contents = '<?php
+$messages = array(
+);
+';
+
                if( strpos( $contents, '$messages' ) !== false ) {
                        $contents = explode( '$messages', $contents );
                        if( $messagesText == '$messages' . $contents[1] ) {
index 359cd24..088eaa3 100644 (file)
@@ -33,7 +33,7 @@ class mcTest extends Maintenance {
        }
 
        public function execute() {
-               global $wgMemCachedServers;
+               global $wgMemCachedServers, $wgMemCachedTimeout;
 
                $iterations = $this->getOption( 'i', 100 );
                if ( $this->hasArg() ) {
@@ -42,7 +42,10 @@ class mcTest extends Maintenance {
 
                foreach ( $wgMemCachedServers as $server ) {
                        $this->output( $server . " ", $server );
-                       $mcc = new MemCachedClientforWiki( array( 'persistant' => true ) );
+                       $mcc = new MemCachedClientforWiki( array(
+                               'persistant' => true,
+                               'timeout' => $wgMemCachedTimeout
+                       ) );
                        $mcc->set_servers( array( $server ) );
                        $set = 0;
                        $incr = 0;
index 8c4d500..a0c3d17 100644 (file)
@@ -396,6 +396,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
        ipb_deleted BIT NOT NULL DEFAULT 0,
        ipb_block_email BIT NOT NULL DEFAULT 0,
        ipb_allow_usertalk BIT NOT NULL DEFAULT 0,
+       ipb_parent_block_id   INT DEFAULT NULL,
 );
 -- Unique index to support "user already blocked" messages
 -- Any new options which prevent collisions should be included
index 9f875ae..3722120 100644 (file)
@@ -272,7 +272,8 @@ CREATE TABLE &mw_prefix.ipblocks (
   ipb_range_end         VARCHAR2(255),
   ipb_deleted           CHAR(1)      DEFAULT '0' NOT NULL,
   ipb_block_email       CHAR(1)      DEFAULT '0' NOT NULL,
-  ipb_allow_usertalk    CHAR(1)      DEFAULT '0' NOT NULL
+  ipb_allow_usertalk    CHAR(1)      DEFAULT '0' NOT NULL,
+  ipb_parent_block_id             NUMBER       DEFAULT NULL
 );
 ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_pk PRIMARY KEY (ipb_id);
 ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk1 FOREIGN KEY (ipb_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
index 14f158c..b6d2067 100644 (file)
@@ -61,7 +61,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                        $cond = "rev_id BETWEEN $blockStart AND $blockEnd";
                        $res = $db->select( 'revision',
                                array( 'rev_id', 'rev_page', 'rev_timestamp', 'rev_parent_id' ),
-                               $cond, __METHOD__ );
+                               array( $cond, 'rev_parent_id' => null ), __METHOD__ );
                        # Go through and update rev_parent_id from these rows.
                        # Assume that the previous revision of the title was
                        # the original previous revision of the title when the
index b0cdb84..1e3eecb 100644 (file)
@@ -277,12 +277,14 @@ CREATE TABLE ipblocks (
   ipb_range_end         TEXT,
   ipb_deleted           SMALLINT     NOT NULL  DEFAULT 0,
   ipb_block_email       SMALLINT     NOT NULL  DEFAULT 0,
-  ipb_allow_usertalk    SMALLINT     NOT NULL  DEFAULT 0
+  ipb_allow_usertalk    SMALLINT     NOT NULL  DEFAULT 0,
+  ipb_parent_block_id             INTEGER          NULL  REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED
 
 );
 CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only);
 CREATE INDEX ipb_user    ON ipblocks (ipb_user);
 CREATE INDEX ipb_range   ON ipblocks (ipb_range_start,ipb_range_end);
+CREATE INDEX ipb_parent_block_id   ON ipblocks (ipb_parent_block_id);
 
 
 CREATE TABLE image (
index 7abbc90..26d7e29 100644 (file)
@@ -174,10 +174,10 @@ class RefreshLinks extends Maintenance {
         * @param $id int The page_id of the redirect
         */
        private function fixRedirect( $id ) {
-               $title = Title::newFromID( $id );
+               $page = WikiPage::newFromID( $id );
                $dbw = wfGetDB( DB_MASTER );
 
-               if ( is_null( $title ) ) {
+               if ( $page === null ) {
                        // This page doesn't exist (any more)
                        // Delete any redirect table entry for it
                        $dbw->delete( 'redirect', array( 'rd_from' => $id ),
@@ -185,11 +185,10 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               $page = WikiPage::factory( $title );
                $rt = $page->getRedirectTarget();
 
                if ( $rt === null ) {
-                       // $title is not a redirect
+                       // The page is not a redirect
                        // Delete any redirect table entry for it
                        $dbw->delete( 'redirect', array( 'rd_from' => $id ),
                                __METHOD__ );
@@ -201,28 +200,29 @@ class RefreshLinks extends Maintenance {
         * @param $id int The page_id
         */
        public static function fixLinksFromArticle( $id ) {
-               global $wgParser;
+               global $wgParser, $wgContLang;
 
-               $title = Title::newFromID( $id );
-               $dbw = wfGetDB( DB_MASTER );
+               $page = WikiPage::newFromID( $id );
 
                LinkCache::singleton()->clear();
 
-               if ( is_null( $title ) ) {
+               if ( $page === null ) {
                        return;
                }
 
-               $revision = Revision::newFromTitle( $title );
-               if ( !$revision ) {
+               $text = $page->getRawText();
+               if ( $text === false ) {
                        return;
                }
 
+               $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
 
-               $options = new ParserOptions;
-               $parserOutput = $wgParser->parse( $revision->getText(), $title, $options, true, true, $revision->getId() );
-               $update = new LinksUpdate( $title, $parserOutput, false );
+               $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+               $parserOutput = $wgParser->parse( $text, $page->getTitle(), $options, true, true, $page->getLatest() );
+               $update = new LinksUpdate( $page->getTitle(), $parserOutput, false );
                $update->doUpdate();
+
                $dbw->commit( __METHOD__ );
        }
 
index a848bf5..0a5b2fb 100644 (file)
@@ -772,7 +772,13 @@ CREATE TABLE /*_*/ipblocks (
   ipb_block_email bool NOT NULL default 0,
 
   -- Block allows user to edit their own talk page
-  ipb_allow_usertalk bool NOT NULL default 0
+  ipb_allow_usertalk bool NOT NULL default 0,
+
+  -- ID of the block that caused this block to exist
+  -- Autoblocks set this to the original block
+  -- so that the original block being deleted also
+  -- deletes the autoblocks
+  ipb_parent_block_id int default NULL
 
 ) /*$wgDBTableOptions*/;
 
@@ -784,6 +790,7 @@ CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
 CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
 CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
 CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
 
 
 --
index c4bf3b2..741ec90 100644 (file)
@@ -25,8 +25,8 @@
  * @ingroup Maintenance
  */
 
-if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.2.3' ) < 0 ) ) {
-       echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.2.3 or higher. ABORTING.\n" .
+if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
+       echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.3.2 or higher. ABORTING.\n" .
        "Check if you have a newer php executable with a different name, such as php5.\n";
        die( 1 );
 }
index 2855f9a..31d24d1 100644 (file)
@@ -70,11 +70,13 @@ return array(
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
        'skins.vector' => array(
+               // Keep in sync with WebInstallerOutput::getCSS()
                'styles' => array(
                        'common/commonElements.css' => array( 'media' => 'screen' ),
                        'common/commonContent.css' => array( 'media' => 'screen' ),
                        'common/commonInterface.css' => array( 'media' => 'screen' ),
                        'vector/screen.css' => array( 'media' => 'screen' ),
+                       'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 900px)' ),
                ),
                'scripts' => 'vector/vector.js',
                'remoteBasePath' => $GLOBALS['wgStylePath'],
index 861bbfa..c28503b 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Blind 1.8.18
+/*!
+ * jQuery UI Effects Blind 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index dc21f31..5666312 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Bounce 1.8.18
+/*!
+ * jQuery UI Effects Bounce 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 1ac61bb..9244a15 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Clip 1.8.18
+/*!
+ * jQuery UI Effects Clip 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 19e2f70..c49bdaa 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects 1.8.18
+/*!
+ * jQuery UI Effects 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -236,7 +236,7 @@ $.effects.animateClass = function(value, duration, easing, callback) {
                        originalStyleAttr = that.attr('style') || ' ',
                        originalStyle = filterStyles(getElementStyles.call(this)),
                        newStyle,
-                       className = that.attr('class');
+                       className = that.attr('class') || "";
 
                $.each(classAnimationActions, function(i, action) {
                        if (value[action]) {
@@ -306,7 +306,7 @@ $.fn.extend({
 /******************************************************************************/
 
 $.extend($.effects, {
-       version: "1.8.18",
+       version: "1.8.20",
 
        // Saves a set of properties in a data storage
        save: function(element, set) {
@@ -419,7 +419,7 @@ $.extend($.effects, {
        setTransition: function(element, list, factor, value) {
                value = value || {};
                $.each(list, function(i, x){
-                       unit = element.cssUnit(x);
+                       var unit = element.cssUnit(x);
                        if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
                });
                return value;
index c674cca..4fdb521 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Drop 1.8.18
+/*!
+ * jQuery UI Effects Drop 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index b2af6da..1a9d32e 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Explode 1.8.18
+/*!
+ * jQuery UI Effects Explode 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index beb5cb4..c976ce4 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Fade 1.8.18
+/*!
+ * jQuery UI Effects Fade 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 762ec6c..017f70c 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Fold 1.8.18
+/*!
+ * jQuery UI Effects Fold 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index f2d2333..71462fb 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Highlight 1.8.18
+/*!
+ * jQuery UI Effects Highlight 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 418df4e..4d8e90e 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Pulsate 1.8.18
+/*!
+ * jQuery UI Effects Pulsate 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -15,8 +15,8 @@
 $.effects.pulsate = function(o) {
        return this.queue(function() {
                var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'show');
-                       times = ((o.options.times || 5) * 2) - 1;
+                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
+                       times = ((o.options.times || 5) * 2) - 1,
                        duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
                        isVisible = elem.is(':visible'),
                        animateTo = 0;
index e2d6482..a4941f9 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Scale 1.8.18
+/*!
+ * jQuery UI Effects Scale 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -140,7 +140,7 @@ $.effects.size = function(o) {
                        hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
                        props2 = props.concat(vProps).concat(hProps); // Concat
                        el.find("*[width]").each(function(){
-                               child = $(this);
+                               var child = $(this);
                                if (restore) $.effects.save(child, props2);
                                var c_original = {height: child.height(), width: child.width()}; // Save original
                                child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
index 91388ab..b40c783 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Shake 1.8.18
+/*!
+ * jQuery UI Effects Shake 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index d481a2a..49059cf 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Slide 1.8.18
+/*!
+ * jQuery UI Effects Slide 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 776fe46..565ad28 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Transfer 1.8.18
+/*!
+ * jQuery UI Effects Transfer 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 166f537..f3ef9e8 100644 (file)
@@ -13,7 +13,7 @@ jQuery(function($){
                dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
                dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
                dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
-               weekHeader: 'Wo',
+               weekHeader: 'KW',
                dateFormat: 'dd.mm.yy',
                firstDay: 1,
                isRTL: false,
index 92f81f6..32702b2 100644 (file)
@@ -13,7 +13,7 @@ jQuery(function($){
                dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
                dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
                dayNamesMin: ['P','E','T','K','N','R','L'],
-               weekHeader: 'Sm',
+               weekHeader: 'näd',
                dateFormat: 'dd.mm.yy',
                firstDay: 1,
                isRTL: false,
index 81de4da..be8acd2 100644 (file)
@@ -4,15 +4,51 @@
 jQuery(function($) {
        $.datepicker.regional['fa'] = {
                closeText: 'بستن',
-               prevText: '&#x3c;قبلي',
-               nextText: 'بعدي&#x3e;',
+               prevText: '&#x3C;قبلی',
+               nextText: 'بعدی&#x3E;',
                currentText: 'امروز',
-               monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
-               'مهر','آبان','آذر','دي','بهمن','اسفند'],
+               monthNames: [
+                       'فروردين',
+                       'ارديبهشت',
+                       'خرداد',
+                       'تير',
+                       'مرداد',
+                       'شهريور',
+                       'مهر',
+                       'آبان',
+                       'آذر',
+                       'دی',
+                       'بهمن',
+                       'اسفند'
+               ],
                monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
-               dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
-               dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
-               dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+               dayNames: [
+                       'يکشنبه',
+                       'دوشنبه',
+                       'سه‌شنبه',
+                       'چهارشنبه',
+                       'پنجشنبه',
+                       'جمعه',
+                       'شنبه'
+               ],
+               dayNamesShort: [
+                       'ی',
+                       'د',
+                       'س',
+                       'چ',
+                       'پ',
+                       'ج', 
+                       'ش'
+               ],
+               dayNamesMin: [
+                       'ی',
+                       'د',
+                       'س',
+                       'چ',
+                       'پ',
+                       'ج', 
+                       'ش'
+               ],
                weekHeader: 'هف',
                dateFormat: 'yy/mm/dd',
                firstDay: 6,
index e1f25fd..4c5adda 100644 (file)
@@ -1,23 +1,23 @@
 /* Finnish initialisation for the jQuery UI date picker plugin. */
-/* Written by Harri Kilpi (harrikilpio@gmail.com). */
+/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
 jQuery(function($){
-    $.datepicker.regional['fi'] = {
+       $.datepicker.regional['fi'] = {
                closeText: 'Sulje',
-               prevText: '&laquo;Edellinen',
-               nextText: 'Seuraava&raquo;',
-               currentText: 'T&auml;n&auml;&auml;n',
-        monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu',
-        'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
-        monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;',
-        'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'],
-               dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+               prevText: '&#xAB;Edellinen',
+               nextText: 'Seuraava&#xBB;',
+               currentText: 'T&#xE4;n&#xE4;&#xE4;n',
+               monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&#xE4;kuu',
+               'Hein&#xE4;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+               monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&#xE4;',
+               'Hein&#xE4;','Elo','Syys','Loka','Marras','Joulu'],
+               dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
                dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
                dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
                weekHeader: 'Vk',
-        dateFormat: 'dd.mm.yy',
+               dateFormat: 'dd.mm.yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['fi']);
+       $.datepicker.setDefaults($.datepicker.regional['fi']);
 });
index d75e98e..6c563b9 100644 (file)
@@ -2,19 +2,19 @@
 /* Written by Michael Dawart. */
 jQuery(function($){
        $.datepicker.regional['hi'] = {
-               closeText: 'हà¥\8bà¤\95र',
-               prevText: 'à¤\85à¤\97ला',
-               nextText: 'नà¥\87à¤\95à¥\8dसà¥\8dà¤\9f',
+               closeText: 'बà¤\82द',
+               prevText: 'पिà¤\9bला',
+               nextText: 'à¤\85à¤\97ला',
                currentText: 'आज',
-               monthNames: ['à¤\9cनवरà¥\80 ','फरवरà¥\80','मारà¥\8dà¤\9a','à¤\85पà¥\8dरà¥\87ल','मà¥\88','à¤\9cà¥\82न',
-               'à¤\9cà¥\82लाà¤\88','à¤\85à¤\97सà¥\8dत ','सितमà¥\8dबर','à¤\86à¤\95à¥\8dà¤\9fà¥\8bबर','नवम्बर','दिसम्बर'],
-               monthNamesShort: ['à¤\9cन', 'फर', 'मारà¥\8dà¤\9a', 'à¤\85पà¥\8dरà¥\87ल', 'मà¥\88', 'à¤\9cà¥\82न',
-               'à¤\9cà¥\82लाà¤\88', 'à¤\85à¤\97', 'सित', 'à¤\86à¤\95à¥\8dà¤\9f', 'नव', 'िद'],
-               dayNames: ['रविवासर', 'सà¥\8bमवासर', 'मà¤\82à¤\97लवासर', 'बà¥\81धवासर', 'à¤\97à¥\81रà¥\81वासर', 'शà¥\81à¤\95à¥\8dरवासर', 'शनिवासर'],
+               monthNames: ['à¤\9cनवरà¥\80 ','फरवरà¥\80','मारà¥\8dà¤\9a','à¤\85पà¥\8dरà¥\87ल','मà¤\88','à¤\9cà¥\82न',
+               'à¤\9cà¥\82लाà¤\88','à¤\85à¤\97सà¥\8dत ','सितमà¥\8dबर','à¤\85à¤\95à¥\8dà¤\9fà¥\82बर','नवम्बर','दिसम्बर'],
+               monthNamesShort: ['à¤\9cन', 'फर', 'मारà¥\8dà¤\9a', 'à¤\85पà¥\8dरà¥\87ल', 'मà¤\88', 'à¤\9cà¥\82न',
+               'à¤\9cà¥\82लाà¤\88', 'à¤\85à¤\97', 'सित', 'à¤\85à¤\95à¥\8dà¤\9f', 'नव', 'दि'],
+               dayNames: ['रविवार', 'सà¥\8bमवार', 'मà¤\82à¤\97लवार', 'बà¥\81धवार', 'à¤\97à¥\81रà¥\81वार', 'शà¥\81à¤\95à¥\8dरवार', 'शनिवार'],
                dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
                dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
                weekHeader: 'हफ्ता',
-               dateFormat: 'mm/dd/yy',
+               dateFormat: 'dd/mm/yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
index 1e60242..0285325 100644 (file)
@@ -6,9 +6,9 @@ jQuery(function($){
                prevText: '&#x3C;',
                nextText: '&#x3E;',
                currentText: 'Денес',
-               monthNames: ['Ð\88анÑ\83аÑ\80и','Фебруари','Март','Април','Мај','Јуни',
+               monthNames: ['Ð\88анÑ\83аÑ\80и','Февруари','Март','Април','Мај','Јуни',
                'Јули','Август','Септември','Октомври','Ноември','Декември'],
-               monthNamesShort: ['Ð\88ан','Феб','Мар','Апр','Мај','Јун',
+               monthNamesShort: ['Ð\88ан','Фев','Мар','Апр','Мај','Јун',
                'Јул','Авг','Сеп','Окт','Ное','Дек'],
                dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
                dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'],
index 77afe55..f086f81 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Accordion 1.8.18
+/*!
+ * jQuery UI Accordion 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -518,7 +518,7 @@ $.widget( "ui.accordion", {
 });
 
 $.extend( $.ui.accordion, {
-       version: "1.8.18",
+       version: "1.8.20",
        animations: {
                slide: function( options, additions ) {
                        options = $.extend({
index 8889ca9..f95b78f 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Autocomplete 1.8.18
+/*!
+ * jQuery UI Autocomplete 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -37,6 +37,7 @@ $.widget( "ui.autocomplete", {
                var self = this,
                        doc = this.element[ 0 ].ownerDocument,
                        suppressKeyPress;
+               this.isMultiLine = this.element.is( "textarea" );
 
                this.element
                        .addClass( "ui-autocomplete-input" )
@@ -62,14 +63,10 @@ $.widget( "ui.autocomplete", {
                                        self._move( "nextPage", event );
                                        break;
                                case keyCode.UP:
-                                       self._move( "previous", event );
-                                       // prevent moving cursor to beginning of text field in some browsers
-                                       event.preventDefault();
+                                       self._keyEvent( "previous", event );
                                        break;
                                case keyCode.DOWN:
-                                       self._move( "next", event );
-                                       // prevent moving cursor to end of text field in some browsers
-                                       event.preventDefault();
+                                       self._keyEvent( "next", event );
                                        break;
                                case keyCode.ENTER:
                                case keyCode.NUMPAD_ENTER:
@@ -131,9 +128,6 @@ $.widget( "ui.autocomplete", {
                                }, 150 );
                        });
                this._initSource();
-               this.response = function() {
-                       return self._response.apply( self, arguments );
-               };
                this.menu = $( "<ul></ul>" )
                        .addClass( "ui-autocomplete" )
                        .appendTo( $( this.options.appendTo || "body", doc )[0] )
@@ -268,18 +262,11 @@ $.widget( "ui.autocomplete", {
                                        url: url,
                                        data: request,
                                        dataType: "json",
-                                       context: {
-                                               autocompleteRequest: ++requestIndex
-                                       },
                                        success: function( data, status ) {
-                                               if ( this.autocompleteRequest === requestIndex ) {
-                                                       response( data );
-                                               }
+                                               response( data );
                                        },
                                        error: function() {
-                                               if ( this.autocompleteRequest === requestIndex ) {
-                                                       response( [] );
-                                               }
+                                               response( [] );
                                        }
                                });
                        };
@@ -310,10 +297,26 @@ $.widget( "ui.autocomplete", {
                this.pending++;
                this.element.addClass( "ui-autocomplete-loading" );
 
-               this.source( { term: value }, this.response );
+               this.source( { term: value }, this._response() );
        },
 
-       _response: function( content ) {
+       _response: function() {
+               var that = this,
+                       index = ++requestIndex;
+
+               return function( content ) {
+                       if ( index === requestIndex ) {
+                               that.__response( content );
+                       }
+
+                       that.pending--;
+                       if ( !that.pending ) {
+                               that.element.removeClass( "ui-autocomplete-loading" );
+                       }
+               };
+       },
+
+       __response: function( content ) {
                if ( !this.options.disabled && content && content.length ) {
                        content = this._normalize( content );
                        this._suggest( content );
@@ -321,10 +324,6 @@ $.widget( "ui.autocomplete", {
                } else {
                        this.close();
                }
-               this.pending--;
-               if ( !this.pending ) {
-                       this.element.removeClass( "ui-autocomplete-loading" );
-               }
        },
 
        close: function( event ) {
@@ -422,6 +421,14 @@ $.widget( "ui.autocomplete", {
 
        widget: function() {
                return this.menu.element;
+       },
+       _keyEvent: function( keyEvent, event ) {
+               if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+                       this._move( keyEvent, event );
+
+                       // prevents moving cursor to beginning/end of the text field in some browsers
+                       event.preventDefault();
+               }
        }
 });
 
@@ -594,7 +601,7 @@ $.widget("ui.menu", {
                        }
 
                        var base = this.active.offset().top,
-                               height = this.element.height();
+                               height = this.element.height(),
                                result = this.element.children(".ui-menu-item").filter(function() {
                                        var close = $(this).offset().top - base + height - $(this).height();
                                        // TODO improve approximation
index 1ff2f7f..cbec505 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Button 1.8.18
+/*!
+ * jQuery UI Button 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 98b4f9b..6e2b3be 100644 (file)
@@ -1,7 +1,7 @@
 /*!
- * jQuery UI 1.8.18
+ * jQuery UI 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -18,7 +18,7 @@ if ( $.ui.version ) {
 }
 
 $.extend( $.ui, {
-       version: "1.8.18",
+       version: "1.8.20",
 
        keyCode: {
                ALT: 18,
index c3b08be..951c1a9 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Datepicker 1.8.18
+/*!
+ * jQuery UI Datepicker 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -12,7 +12,7 @@
  */
 (function( $, undefined ) {
 
-$.extend($.ui, { datepicker: { version: "1.8.18" } });
+$.extend($.ui, { datepicker: { version: "1.8.20" } });
 
 var PROP_NAME = 'datepicker';
 var dpuuid = new Date().getTime();
@@ -620,8 +620,8 @@ $.extend(Datepicker.prototype, {
                                        $.datepicker._updateDatepicker(inst);
                                }
                        }
-                       catch (event) {
-                               $.datepicker.log(event);
+                       catch (err) {
+                               $.datepicker.log(err);
                        }
                }
                return true;
@@ -800,10 +800,8 @@ $.extend(Datepicker.prototype, {
                if (this._datepickerShowing) {
                        var showAnim = this._get(inst, 'showAnim');
                        var duration = this._get(inst, 'duration');
-                       var self = this;
                        var postProcess = function() {
                                $.datepicker._tidyDialog(inst);
-                               self._curInst = null;
                        };
                        if ($.effects && $.effects[showAnim])
                                inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
@@ -1817,7 +1815,7 @@ $.fn.datepicker = function(options){
 $.datepicker = new Datepicker(); // singleton instance
 $.datepicker.initialized = false;
 $.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.18";
+$.datepicker.version = "1.8.20";
 
 // Workaround for #4055
 // Add another global to avoid noConflict issues with inline event handlers
index 4340b45..d28be0c 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Dialog 1.8.18
+/*!
+ * jQuery UI Dialog 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -702,7 +702,7 @@ $.widget("ui.dialog", {
 });
 
 $.extend($.ui.dialog, {
-       version: "1.8.18",
+       version: "1.8.20",
 
        uuid: 0,
        maxZ: 0,
index 4141ff7..dee9777 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Draggable 1.8.18
+/*!
+ * jQuery UI Draggable 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -208,8 +208,14 @@ $.widget("ui.draggable", $.ui.mouse, {
                        this.dropped = false;
                }
                
-               //if the original element is removed, don't bother to continue if helper is set to "original"
-               if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
+               //if the original element is no longer in the DOM don't bother to continue (see #8269)
+               var element = this.element[0], elementInDom = false;
+               while ( element && (element = element.parentNode) ) {
+                       if (element == document ) {
+                               elementInDom = true;
+                       }
+               }
+               if ( !elementInDom && this.options.helper === "original" )
                        return false;
 
                if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
@@ -505,7 +511,7 @@ $.widget("ui.draggable", $.ui.mouse, {
 });
 
 $.extend($.ui.draggable, {
-       version: "1.8.18"
+       version: "1.8.20"
 });
 
 $.ui.plugin.add("draggable", "connectToSortable", {
index afd421f..8cb2bb7 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Droppable 1.8.18
+/*!
+ * jQuery UI Droppable 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -147,7 +147,7 @@ $.widget("ui.droppable", {
 });
 
 $.extend($.ui.droppable, {
-       version: "1.8.18"
+       version: "1.8.20"
 });
 
 $.ui.intersect = function(draggable, droppable, toleranceMode) {
index 669d563..63f8570 100644 (file)
@@ -1,7 +1,7 @@
 /*!
- * jQuery UI Mouse 1.8.18
+ * jQuery UI Mouse 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -45,6 +45,9 @@ $.widget("ui.mouse", {
        // other instances of mouse
        _mouseDestroy: function() {
                this.element.unbind('.'+this.widgetName);
+               $(document)
+                       .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                       .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
        },
 
        _mouseDown: function(event) {
index 1b90ea1..1989896 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Position 1.8.18
+/*!
+ * jQuery UI Position 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index c042b40..b1c05de 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Progressbar 1.8.18
+/*!
+ * jQuery UI Progressbar 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -103,7 +103,7 @@ $.widget( "ui.progressbar", {
 });
 
 $.extend( $.ui.progressbar, {
-       version: "1.8.18"
+       version: "1.8.20"
 });
 
 })( jQuery );
index b441435..a2a7ad5 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Resizable 1.8.18
+/*!
+ * jQuery UI Resizable 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -98,9 +98,8 @@ $.widget("ui.resizable", $.ui.mouse, {
                                var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
                                var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
 
-                               // increase zIndex of sw, se, ne, nw axis
-                               //TODO : this modifies original option
-                               if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+                               // Apply zIndex to all handles - see #7960
+                               axis.css({ zIndex: o.zIndex });
 
                                //TODO : What's going on here?
                                if ('se' == handle) {
@@ -541,7 +540,7 @@ $.widget("ui.resizable", $.ui.mouse, {
 });
 
 $.extend($.ui.resizable, {
-       version: "1.8.18"
+       version: "1.8.20"
 });
 
 /*
@@ -691,13 +690,13 @@ $.ui.plugin.add("resizable", "containment", {
 
                if (cp.left < (self._helper ? co.left : 0)) {
                        self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
-                       if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
                        self.position.left = o.helper ? co.left : 0;
                }
 
                if (cp.top < (self._helper ? co.top : 0)) {
                        self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
-                       if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
                        self.position.top = self._helper ? co.top : 0;
                }
 
index 275021d..b68ea95 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Selectable 1.8.18
+/*!
+ * jQuery UI Selectable 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -261,7 +261,7 @@ $.widget("ui.selectable", $.ui.mouse, {
 });
 
 $.extend($.ui.selectable, {
-       version: "1.8.18"
+       version: "1.8.20"
 });
 
 })(jQuery);
index 23a56cc..3e6178e 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Slider 1.8.18
+/*!
+ * jQuery UI Slider 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -656,7 +656,7 @@ $.widget( "ui.slider", $.ui.mouse, {
 });
 
 $.extend( $.ui.slider, {
-       version: "1.8.18"
+       version: "1.8.20"
 });
 
 }(jQuery));
index c3fb719..3438f59 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Sortable 1.8.18
+/*!
+ * jQuery UI Sortable 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -468,8 +468,8 @@ $.widget("ui.sortable", $.ui.mouse, {
 
        _intersectsWithPointer: function(item) {
 
-               var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
-                       isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+               var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+                       isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
                        isOverElement = isOverElementHeight && isOverElementWidth,
                        verticalDirection = this._getDragVerticalDirection(),
                        horizontalDirection = this._getDragHorizontalDirection();
@@ -1075,7 +1075,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 });
 
 $.extend($.ui.sortable, {
-       version: "1.8.18"
+       version: "1.8.20"
 });
 
 })(jQuery);
index bd30ad5..7cc19f0 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Tabs 1.8.18
+/*!
+ * jQuery UI Tabs 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -427,7 +427,7 @@ $.widget( "ui.tabs", {
                // meta-function to give users option to provide a href string instead of a numerical index.
                // also sanitizes numerical indexes to valid values.
                if ( typeof index == "string" ) {
-                       index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+                       index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
                }
 
                return index;
@@ -698,7 +698,7 @@ $.widget( "ui.tabs", {
 });
 
 $.extend( $.ui.tabs, {
-       version: "1.8.18"
+       version: "1.8.20"
 });
 
 /*
@@ -733,7 +733,6 @@ $.extend( $.ui.tabs.prototype, {
                                }
                        }
                        : function( e ) {
-                               t = o.selected;
                                rotate();
                        });
 
index 0c6f53f..5a71348 100644 (file)
@@ -1,7 +1,7 @@
 /*!
- * jQuery UI Widget 1.8.18
+ * jQuery UI Widget 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 3e5df6c..cd207b9 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Accordion 1.8.18
+/*!
+ * jQuery UI Accordion 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 955f121..535f1e6 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Autocomplete 1.8.18
+/*!
+ * jQuery UI Autocomplete 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -13,7 +13,7 @@
 * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
 
 /*
- * jQuery UI Menu 1.8.18
+ * jQuery UI Menu 1.8.20
  *
  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 0074880..1e2b1ff 100644 (file)
@@ -1,13 +1,13 @@
-/*
- * jQuery UI Button 1.8.18
+/*!
+ * jQuery UI Button 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Button#theming
  */
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: hidden; *overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
 .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
 button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
 .ui-button-icons-only { width: 3.4em; } 
index 42fc9e7..c42f9ba 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI CSS Framework 1.8.18
+/*!
+ * jQuery UI CSS Framework 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index bf61459..fefb016 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Datepicker 1.8.18
+/*!
+ * jQuery UI Datepicker 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index ba14475..2319611 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Dialog 1.8.18
+/*!
+ * jQuery UI Dialog 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 3850631..7c099ad 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Progressbar 1.8.18
+/*!
+ * jQuery UI Progressbar 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index ecfa0d1..b6b90de 100644 (file)
@@ -1,20 +1,26 @@
-/*
- * jQuery UI Resizable 1.8.18
+/*!
+ * jQuery UI Resizable 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Resizable#theming
  */
 .ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
 .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
 .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
 .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+/* @noflip */
 .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+/* @noflip */
 .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+/* @noflip */
 .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+/* @noflip */
 .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+/* @noflip */
 .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
+/* @noflip */
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
index f06d70c..279effc 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Selectable 1.8.18
+/*!
+ * jQuery UI Selectable 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index df19d6f..6acaeaa 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Slider 1.8.18
+/*!
+ * jQuery UI Slider 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 2e98e2e..42a3692 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Tabs 1.8.18
+/*!
+ * jQuery UI Tabs 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 0e2a746..b705ff6 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI CSS Framework 1.8.18
+/*!
+ * jQuery UI CSS Framework 1.8.20
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 2b19fcd..cd85f14 100644 (file)
@@ -8,7 +8,7 @@
 .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
 .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
 .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane button { float: right; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
 .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
 .ui-draggable .ui-dialog-titlebar { cursor: move; }
 /* Customizations */
index 366643b..f1bd7c5 100644 (file)
@@ -5,9 +5,15 @@
 .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
 .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
 .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+/* @noflip */
 .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+/* @noflip */
 .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+/* @noflip */
 .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+/* @noflip */
 .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+/* @noflip */
 .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+/* @noflip */
 .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
index 55c3001..466c551 100644 (file)
@@ -103,7 +103,7 @@ $.suggestions = {
                        // Wait for the browser to update the value
                        setTimeout( function() {
                                // Render special
-                               $special = context.data.$container.find( '.suggestions-special' );
+                               var $special = context.data.$container.find( '.suggestions-special' );
                                context.config.special.render.call( $special, context.data.$textbox.val() );
                        }, 1 );
                }
@@ -311,7 +311,7 @@ $.suggestions = {
                        case 13:
                                context.data.$container.hide();
                                preventDefault = wasVisible;
-                               selected = context.data.$container.find( '.suggestions-result-current' );
+                               var selected = context.data.$container.find( '.suggestions-result-current' );
                                if ( selected.length === 0 || context.data.selectedWithMouse ) {
                                        // if nothing is selected OR if something was selected with the mouse,
                                        // cancel any current requests and submit the form
index 85b3f3f..f7a4b1f 100644 (file)
@@ -156,17 +156,33 @@ jQuery( function( $ ) {
         */
        function fetchPreview( file, callback, callbackBinary ) {
                var reader = new FileReader();
-               if ( callbackBinary ) {
+               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 );
+                               fetchPreview( file, callback );
                        };
                        reader.readAsBinaryString( file );
-               } else if ('URL' in window && 'createObjectURL' in window.URL) {
+               } 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 buffer = new Uint8Array( reader.result ),
+                                       string = '';
+                               for ( var 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. ;)
                        //
@@ -176,7 +192,7 @@ jQuery( function( $ ) {
                        //
                        // 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));
+                       callback( window.URL.createObjectURL( file ) );
                } else {
                        // This ends up decoding the file to base-64 and back again, which
                        // feels horribly inefficient.
index eebbab2..4f345ab 100644 (file)
@@ -138,7 +138,7 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Simple message parser, does $N replacement and nothing else.
                 * This may be overridden to provide a more complex message parser.
-                * 
+                *
                 * This function will not be called for nonexistent messages.
                 */
                parser: function() {
@@ -148,7 +148,7 @@ var mw = ( function ( $, undefined ) {
                                return parameters[index] !== undefined ? parameters[index] : '$' + match;
                        } );
                },
-               
+
                /**
                 * Appends (does not replace) parameters for replacement to the .parameters property.
                 *
@@ -192,7 +192,7 @@ var mw = ( function ( $, undefined ) {
                                text = this.parser();
                                text = mw.html.escape( text );
                        }
-                       
+
                        if ( this.format === 'parse' ) {
                                text = this.parser();
                        }
@@ -248,7 +248,7 @@ var mw = ( function ( $, undefined ) {
                 * emulates console.log in console-less environments.
                 */
                log: function() { },
-       
+
                /**
                 * @var constructor Make the Map constructor publicly available.
                 */
@@ -258,7 +258,7 @@ var mw = ( function ( $, undefined ) {
                 * @var constructor Make the Message constructor publicly available.
                 */
                Message: Message,
-       
+
                /**
                 * List of configuration values
                 *
@@ -267,25 +267,25 @@ var mw = ( function ( $, undefined ) {
                 * in the global window object.
                 */
                config: null,
-       
+
                /**
                 * @var object
                 *
                 * Empty object that plugins can be installed in.
                 */
                libs: {},
-       
+
                /* Extension points */
-       
+
                legacy: {},
-       
+
                /**
                 * Localization system
                 */
                messages: new Map(),
-       
+
                /* Public Methods */
-       
+
                /**
                 * Gets a message object, similar to wfMessage()
                 *
@@ -305,7 +305,7 @@ var mw = ( function ( $, undefined ) {
                        }
                        return new Message( mw.messages, key, parameters );
                },
-       
+
                /**
                 * Gets a message string, similar to wfMsg()
                 *
@@ -317,14 +317,14 @@ var mw = ( function ( $, undefined ) {
                msg: function ( /* key, parameter_1, parameter_2, .. */ ) {
                        return mw.message.apply( mw.message, arguments ).toString();
                },
-       
+
                /**
                 * Client-side module loader which integrates with the MediaWiki ResourceLoader
                 */
                loader: ( function () {
-       
+
                        /* Private Members */
-       
+
                        /**
                         * Mapping of registered modules
                         *
@@ -372,15 +372,15 @@ var mw = ( function ( $, undefined ) {
                                ready = false,
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
                                $marker = null;
-       
+
                        /* Cache document ready status */
-       
+
                        $(document).ready( function () {
                                ready = true;
                        } );
-       
+
                        /* Private methods */
-       
+
                        function getMarker() {
                                // Cached ?
                                if ( $marker ) {
@@ -431,7 +431,8 @@ var mw = ( function ( $, undefined ) {
                        function addInlineCSS( css ) {
                                var $style, style, $newStyle;
                                $style = getMarker().prev();
-                               if ( $style.is( 'style' ) && $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+                               // Disable <style> tag recycling/concatenation because of bug 34669
+                               if ( false && $style.is( 'style' ) && $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
                                        // There's already a dynamic <style> tag present, append to it. This recycling of
                                        // <style> tags is for bug 31676 (can't have more than 32 <style> tags in IE)
                                        style = $style.get( 0 );
@@ -463,7 +464,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                return true;
                        }
-       
+
                        /**
                         * Generates an ISO8601 "basic" string from a UNIX timestamp
                         */
@@ -478,13 +479,13 @@ var mw = ( function ( $, undefined ) {
                                        pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
                                ].join( '' );
                        }
-       
+
                        /**
                         * Recursively resolves dependencies and detects circular references
                         */
                        function recurse( module, resolved, unresolved ) {
                                var n, deps, len;
-       
+
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Unknown dependency: ' + module );
                                }
@@ -517,7 +518,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                resolved[resolved.length] = module;
                        }
-       
+
                        /**
                         * Gets a list of module names that a module depends on in their proper dependency order
                         *
@@ -527,7 +528,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function resolve( module ) {
                                var modules, m, deps, n, resolved;
-       
+
                                // Allow calling with an array of module names
                                if ( $.isArray( module ) ) {
                                        modules = [];
@@ -548,7 +549,7 @@ var mw = ( function ( $, undefined ) {
 
                                throw new Error( 'Invalid module argument: ' + module );
                        }
-       
+
                        /**
                         * Narrows a list of module names down to those matching a specific
                         * state (see comment on top of this scope for a list of valid states).
@@ -562,7 +563,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function filter( states, modules ) {
                                var list, module, s, m;
-       
+
                                // Allow states to be given as a string
                                if ( typeof states === 'string' ) {
                                        states = [states];
@@ -595,7 +596,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                return list;
                        }
-       
+
                        /**
                         * Automatically executes jobs and modules which are pending with satistifed dependencies.
                         *
@@ -603,7 +604,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function handlePending( module ) {
                                var j, r;
-       
+
                                try {
                                        // Run jobs whose dependencies have just been met
                                        for ( j = 0; j < jobs.length; j += 1 ) {
@@ -644,7 +645,7 @@ var mw = ( function ( $, undefined ) {
                                        throw e;
                                }
                        }
-       
+
                        /**
                         * Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
                         * depending on whether document-ready has occured yet and whether we are in async mode.
@@ -664,7 +665,7 @@ var mw = ( function ( $, undefined ) {
                                        if ( $.isFunction( callback ) ) {
                                                // Attach handlers for all browsers (based on jQuery.ajax)
                                                script.onload = script.onreadystatechange = function() {
-       
+
                                                        if (
                                                                !done
                                                                && (
@@ -672,11 +673,11 @@ var mw = ( function ( $, undefined ) {
                                                                        || /loaded|complete/.test( script.readyState )
                                                                )
                                                        ) {
-       
+
                                                                done = true;
-       
+
                                                                callback();
-       
+
                                                                // Handle memory leak in IE. This seems to fail in
                                                                // IE7 sometimes (Permission Denied error when
                                                                // accessing script.parentNode) so wrap it in
@@ -686,14 +687,14 @@ var mw = ( function ( $, undefined ) {
                                                                        if ( script.parentNode ) {
                                                                                script.parentNode.removeChild( script );
                                                                        }
-               
+
                                                                        // Dereference the script
                                                                        script = undefined;
                                                                } catch ( e ) { }
                                                        }
                                                };
                                        }
-                                       
+
                                        if ( window.opera ) {
                                                // Appending to the <head> blocks rendering completely in Opera,
                                                // so append to the <body> after document ready. This means the
@@ -718,7 +719,7 @@ var mw = ( function ( $, undefined ) {
                                        }
                                }
                        }
-       
+
                        /**
                         * Executes a loaded module, making it ready to use
                         *
@@ -726,7 +727,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function execute( module, callback ) {
                                var style, media, i, script, markModuleReady, nestedAddScript;
-       
+
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Module has not been registered yet: ' + module );
                                } else if ( registry[module].state === 'registered' ) {
@@ -736,7 +737,7 @@ var mw = ( function ( $, undefined ) {
                                } else if ( registry[module].state === 'ready' ) {
                                        throw new Error( 'Module has already been loaded: ' + module );
                                }
-       
+
                                // Add styles
                                if ( $.isPlainObject( registry[module].style ) ) {
                                        // 'media' type ignored, see documentation of mw.loader.implement
@@ -777,17 +778,17 @@ var mw = ( function ( $, undefined ) {
                                                        callback();
                                                        return;
                                                }
-       
+
                                                addScript( arr[i], function() {
                                                        nestedAddScript( arr, callback, async, i + 1 );
                                                }, async );
                                        };
-       
+
                                        if ( $.isArray( script ) ) {
                                                registry[module].state = 'loading';
                                                nestedAddScript( script, markModuleReady, registry[module].async, 0 );
                                        } else if ( $.isFunction( script ) ) {
-                                               script();
+                                               script( $ );
                                                markModuleReady();
                                        }
                                } catch ( e ) {
@@ -800,7 +801,7 @@ var mw = ( function ( $, undefined ) {
                                        registry[module].state = 'error';
                                }
                        }
-       
+
                        /**
                         * Adds a dependencies to the queue with optional callbacks to be run
                         * when the dependencies are ready or fail
@@ -813,7 +814,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function request( dependencies, ready, error, async ) {
                                var regItemDeps, regItemDepLen, n;
-       
+
                                // Allow calling by single module name
                                if ( typeof dependencies === 'string' ) {
                                        dependencies = [dependencies];
@@ -855,7 +856,7 @@ var mw = ( function ( $, undefined ) {
                                // Work the queue
                                mw.loader.work();
                        }
-       
+
                        function sortQuery(o) {
                                var sorted = {}, key, a = [];
                                for ( key in o ) {
@@ -869,7 +870,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                return sorted;
                        }
-       
+
                        /**
                         * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
                         * to a query string of the form foo.bar,baz|bar.baz,quux
@@ -882,7 +883,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                return arr.join( '|' );
                        }
-       
+
                        /**
                         * Asynchronously append a script tag to the end of the body
                         * that invokes load.php
@@ -901,7 +902,7 @@ var mw = ( function ( $, undefined ) {
                                // Append &* to avoid triggering the IE6 extension check
                                addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async );
                        }
-       
+
                        /* Public Methods */
                        return {
                                addStyleTag: addStyleTag,
@@ -914,7 +915,7 @@ var mw = ( function ( $, undefined ) {
                                                source, group, g, i, modules, maxVersion, sourceLoadScript,
                                                currReqBase, currReqBaseLength, moduleMap, l,
                                                lastDotIndex, prefix, suffix, bytesAdded, async;
-               
+
                                        // Build a list of request parameters common to all requests.
                                        reqBase = {
                                                skin: mw.config.get( 'skin' ),
@@ -924,7 +925,7 @@ var mw = ( function ( $, undefined ) {
                                        // Split module batch by source and by group.
                                        splits = {};
                                        maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', -1 );
-               
+
                                        // Appends a list of modules from the queue to the batch
                                        for ( q = 0; q < queue.length; q += 1 ) {
                                                // Only request modules which are registered
@@ -941,14 +942,14 @@ var mw = ( function ( $, undefined ) {
                                        if ( !batch.length ) {
                                                return;
                                        }
-               
+
                                        // The queue has been processed into the batch, clear up the queue.
                                        queue = [];
-               
+
                                        // Always order modules alphabetically to help reduce cache
                                        // misses for otherwise identical content.
                                        batch.sort();
-               
+
                                        // Split batch by source and by group.
                                        for ( b = 0; b < batch.length; b += 1 ) {
                                                bSource = registry[batch[b]].source;
@@ -962,24 +963,24 @@ var mw = ( function ( $, undefined ) {
                                                bSourceGroup = splits[bSource][bGroup];
                                                bSourceGroup[bSourceGroup.length] = batch[b];
                                        }
-               
+
                                        // Clear the batch - this MUST happen before we append any
                                        // script elements to the body or it's possible that a script
                                        // will be locally cached, instantly load, and work the batch
                                        // again, all before we've cleared it causing each request to
                                        // include modules which are already loaded.
                                        batch = [];
-               
+
                                        for ( source in splits ) {
-               
+
                                                sourceLoadScript = sources[source].loadScript;
-               
+
                                                for ( group in splits[source] ) {
-               
+
                                                        // Cache access to currently selected list of
                                                        // modules for this group from this source.
                                                        modules = splits[source][group];
-               
+
                                                        // Calculate the highest timestamp
                                                        maxVersion = 0;
                                                        for ( g = 0; g < modules.length; g += 1 ) {
@@ -987,16 +988,16 @@ var mw = ( function ( $, undefined ) {
                                                                        maxVersion = registry[modules[g]].version;
                                                                }
                                                        }
-               
+
                                                        currReqBase = $.extend( { 'version': formatVersionNumber( maxVersion ) }, reqBase );
                                                        currReqBaseLength = $.param( currReqBase ).length;
                                                        async = true;
                                                        // We may need to split up the request to honor the query string length limit,
                                                        // so build it piece by piece.
                                                        l = currReqBaseLength + 9; // '&modules='.length == 9
-               
+
                                                        moduleMap = {}; // { prefix: [ suffixes ] }
-               
+
                                                        for ( i = 0; i < modules.length; i += 1 ) {
                                                                // Determine how many bytes this module would add to the query string
                                                                lastDotIndex = modules[i].lastIndexOf( '.' );
@@ -1006,7 +1007,7 @@ var mw = ( function ( $, undefined ) {
                                                                bytesAdded = moduleMap[prefix] !== undefined
                                                                        ? suffix.length + 3 // '%2C'.length == 3
                                                                        : modules[i].length + 3; // '%7C'.length == 3
-               
+
                                                                // If the request would become too long, create a new one,
                                                                // but don't create empty requests
                                                                if ( maxQueryLength > 0 && !$.isEmptyObject( moduleMap ) && l + bytesAdded > maxQueryLength ) {
@@ -1036,7 +1037,7 @@ var mw = ( function ( $, undefined ) {
                                                }
                                        }
                                },
-               
+
                                /**
                                 * Register a source.
                                 *
@@ -1054,16 +1055,16 @@ var mw = ( function ( $, undefined ) {
                                                }
                                                return true;
                                        }
-               
+
                                        if ( sources[id] !== undefined ) {
                                                throw new Error( 'source already registered: ' + id );
                                        }
-               
+
                                        sources[id] = props;
-               
+
                                        return true;
                                },
-               
+
                                /**
                                 * Registers a module, letting the system know about it and its
                                 * properties. Startup modules contain calls to this function.
@@ -1114,7 +1115,7 @@ var mw = ( function ( $, undefined ) {
                                                registry[module].dependencies = dependencies;
                                        }
                                },
-               
+
                                /**
                                 * Implements a module, giving the system a course of action to take
                                 * upon loading. Results of a request for one or more modules contain
@@ -1170,7 +1171,7 @@ var mw = ( function ( $, undefined ) {
                                                execute( module );
                                        }
                                },
-               
+
                                /**
                                 * Executes a function as soon as one or more required modules are ready
                                 *
@@ -1209,7 +1210,7 @@ var mw = ( function ( $, undefined ) {
                                                request( dependencies, ready, error );
                                        }
                                },
-               
+
                                /**
                                 * Loads an external script or one or more modules for future use
                                 *
@@ -1282,7 +1283,7 @@ var mw = ( function ( $, undefined ) {
                                        request( filtered, null, null, async );
                                        return;
                                },
-               
+
                                /**
                                 * Changes the state of a module
                                 *
@@ -1291,6 +1292,7 @@ var mw = ( function ( $, undefined ) {
                                 */
                                state: function ( module, state ) {
                                        var m;
+
                                        if ( typeof module === 'object' ) {
                                                for ( m in module ) {
                                                        mw.loader.state( m, module[m] );
@@ -1300,9 +1302,16 @@ var mw = ( function ( $, undefined ) {
                                        if ( registry[module] === undefined ) {
                                                mw.loader.register( module );
                                        }
-                                       registry[module].state = state;
+                                       if ( state === 'ready' && registry[module].state !== state) {
+                                               // Make sure pending modules depending on this one get executed if their
+                                               // dependencies are now fulfilled!
+                                               registry[module].state = state;
+                                               handlePending( module );
+                                       } else {
+                                               registry[module].state = state;
+                                       }
                                },
-               
+
                                /**
                                 * Gets the version of a module
                                 *
@@ -1314,14 +1323,14 @@ var mw = ( function ( $, undefined ) {
                                        }
                                        return null;
                                },
-               
+
                                /**
                                 * @deprecated since 1.18 use mw.loader.getVersion() instead
                                 */
                                version: function () {
                                        return mw.loader.getVersion.apply( mw.loader, arguments );
                                },
-               
+
                                /**
                                 * Gets the state of a module
                                 *
@@ -1333,7 +1342,7 @@ var mw = ( function ( $, undefined ) {
                                        }
                                        return null;
                                },
-               
+
                                /**
                                 * Get names of all registered modules.
                                 *
@@ -1344,7 +1353,7 @@ var mw = ( function ( $, undefined ) {
                                                return key;
                                        } );
                                },
-               
+
                                /**
                                 * For backwards-compatibility with Squid-cached pages. Loads mw.user
                                 */
@@ -1353,7 +1362,7 @@ var mw = ( function ( $, undefined ) {
                                }
                        };
                }() ),
-       
+
                /** HTML construction helper functions */
                html: ( function () {
                        function escapeCallback( s ) {
@@ -1379,7 +1388,7 @@ var mw = ( function ( $, undefined ) {
                                escape: function ( s ) {
                                        return s.replace( /['"<>&]/g, escapeCallback );
                                },
-               
+
                                /**
                                 * Wrapper object for raw HTML passed to mw.html.element().
                                 * @constructor
@@ -1387,7 +1396,7 @@ var mw = ( function ( $, undefined ) {
                                Raw: function ( value ) {
                                        this.value = value;
                                },
-               
+
                                /**
                                 * Wrapper object for CDATA element contents passed to mw.html.element()
                                 * @constructor
@@ -1395,7 +1404,7 @@ var mw = ( function ( $, undefined ) {
                                Cdata: function ( value ) {
                                        this.value = value;
                                },
-               
+
                                /**
                                 * Create an HTML element string, with safe escaping.
                                 *
@@ -1417,7 +1426,7 @@ var mw = ( function ( $, undefined ) {
                                 */
                                element: function ( name, attrs, contents ) {
                                        var v, attrName, s = '<' + name;
-               
+
                                        for ( attrName in attrs ) {
                                                v = attrs[attrName];
                                                // Convert name=true, to name=name
@@ -1472,7 +1481,7 @@ var mw = ( function ( $, undefined ) {
                        tokens: new Map()
                }
        };
-       
+
 }( jQuery ) );
 
 // Alias $j to jQuery for backwards compatibility
index d1b51a6..404bbe7 100644 (file)
@@ -134,9 +134,7 @@ class VectorTemplate extends BaseTemplate {
                        <!-- /sitenotice -->
                        <?php endif; ?>
                        <!-- firstHeading -->
-                       <h1 id="firstHeading" class="firstHeading">
-                               <span dir="auto"><?php $this->html( 'title' ) ?></span>
-                       </h1>
+                       <h1 id="firstHeading" class="firstHeading"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
                        <!-- /firstHeading -->
                        <!-- bodyContent -->
                        <div id="bodyContent">
index 091fef1..02fd29f 100644 (file)
@@ -79,7 +79,6 @@ h6 {
        padding-top: .5em;
        padding-bottom: .17em;
        border-bottom: 1px solid #aaa;
-       width: auto;
 }
 h1 {
        font-size: 188%;
diff --git a/skins/vector/screen-hd.css b/skins/vector/screen-hd.css
new file mode 100644 (file)
index 0000000..b90fd63
--- /dev/null
@@ -0,0 +1,28 @@
+/* Vector screen styles for high definition displays */
+
+div#content {
+       margin-left: 11em;
+       padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+       left: 0.5em;
+}
+div#footer {
+       margin-left: 11em;
+       padding: 1.25em;
+}
+#mw-panel {
+       padding-left: 0.5em;
+}
+#p-search {
+       margin-right: 1em;
+}
+#left-navigation {
+       left: 11em;
+}
+#p-personal {
+       right: 1em;
+}
+#mw-head-base {
+       margin-left: 11em;
+}
index ef77e61..ef266e9 100644 (file)
@@ -72,7 +72,7 @@ div.emptyPortlet {
 /* Personal */
 #p-personal {
        position: absolute;
-       top: 0;
+       top: 0.33em;
        right: 0.75em;
 }
 #p-personal h5 {
@@ -844,3 +844,44 @@ div.vectorTabs ul {
 .tipsy {
        font-size: 0.8em;
 }
+
+/* Animate between standard and high definition layouts */
+
+div#content,
+div#footer {
+       transition: margin-left 250ms, padding 250ms;
+       -moz-transition: margin-left 250ms, padding 250ms;
+       -webkit-transition: margin-left 250ms, padding 250ms;
+       -o-transition: margin-left 250ms, padding 250ms;
+}
+#p-logo,
+#left-navigation {
+       transition: left 250ms;
+       -moz-transition: left 250ms;
+       -webkit-transition: left 250ms;
+       -o-transition: left 250ms;
+}
+#mw-panel {
+       transition: padding-left 250ms;
+       -moz-transition: padding-left 250ms;
+       -webkit-transition: padding-left 250ms;
+       -o-transition: padding-left 250ms;
+}
+#p-search {
+       transition: margin-right 250ms;
+       -moz-transition: margin-right 250ms;
+       -webkit-transition: margin-right 250ms;
+       -o-transition: margin-right 250ms;
+}
+#p-personal {
+       transition: right 250ms;
+       -moz-transition: right 250ms;
+       -webkit-transition: right 250ms;
+       -o-transition: right 250ms;
+}
+#mw-head-base {
+       transition: margin-left 250ms;
+       -moz-transition: margin-left 250ms;
+       -webkit-transition: margin-left 250ms;
+       -o-transition: margin-left 250ms;
+}
index 6af9b0c..63d0fdf 100644 (file)
@@ -1,42 +1,28 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-  "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-  <title>Jasmine Test Runner</title>
-  <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css">
-  <script type="text/javascript" src="lib/jasmine-1.0.1/jasmine.js"></script>
-  <script type="text/javascript" src="lib/jasmine-1.0.1/jasmine-html.js"></script>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+       <head>
+               <title>Jasmine Test Runner</title>
+               <meta charset="UTF-8" />
+               <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css">
+               <script src="lib/jasmine-1.0.1/jasmine.js"></script>
+               <script src="lib/jasmine-1.0.1/jasmine-html.js"></script>
 
-  <!-- include source files here... -->
-  <script type="text/javascript" src="../../load.php?debug=true&lang=en&modules=jquery%7Cmediawiki&only=scripts&skin=vector"></script>
-  
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.js"></script>
+               <!-- include source files here... -->
+               <script src="../../load.php?debug=true&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=vector&amp;*"></script>
+               <script>
+               mw.loader.load( ['mediawiki.jqueryMsg'] );
+               </script>
 
-  <script type="text/javascript" src="../../resources/mediawiki.language/mediawiki.language.js"></script>
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.jqueryMsg.js"></script>
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.Uri.js"></script>
-<!--
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.api.js"></script>
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.api.edit.js"></script>
--->
+               <!-- insert test data files here -->
+               <script src="spec/mediawiki.jqueryMsg.spec.data.js"></script>
 
-  <!-- insert test data files here -->
-  <script type="text/javascript" src="spec/mediawiki.jqueryMsg.spec.data.js"></script>
-
-  <!-- include spec files here... -->
-  <script type="text/javascript" src="spec/mediawiki.Uri.spec.js"></script>
-  <!-- 
-       <script type="text/javascript" src="spec/mw.Api.spec.js"></script>
-    <script type="text/javascript" src="spec/mw.Api.edit.spec.js"></script>
-  -->
-  <script type="text/javascript" src="spec/mediawiki.jqueryMsg.spec.js"></script>
-</head>
+               <!-- include spec files here... -->
+               <script src="spec/mediawiki.jqueryMsg.spec.js"></script>
+       </head>
 <body>
-<script type="text/javascript">
-  jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );
-  jasmine.getEnv().execute();
-</script>
-
+       <script>
+               jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );
+               jasmine.getEnv().execute();
+       </script>
 </body>
 </html>
diff --git a/tests/jasmine/spec/mediawiki.Uri.spec.js b/tests/jasmine/spec/mediawiki.Uri.spec.js
deleted file mode 100644 (file)
index e396ab3..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-( function() {
-
-       // ensure we have a generic URI parser if not running in a browser
-       if ( !mw.Uri ) {
-               mw.Uri = mw.UriRelative( 'http://example.com/' );
-       }
-
-       describe( "mw.Uri", function() {
-
-               describe( "should work well in loose and strict mode", function() {
-
-                       function basicTests( strict ) {
-                       
-                               describe( "should parse a simple HTTP URI correctly", function() { 
-
-                                       var uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
-                                       var uri;
-                                       if ( strict ) {
-                                               uri = new mw.Uri( uriString, strict );
-                                       } else {
-                                               uri = new mw.Uri( uriString );
-                                       }
-
-                                       it( "should have basic object properties", function() {
-                                               expect( uri.protocol ).toEqual( 'http' );
-                                               expect( uri.host ).toEqual( 'www.ietf.org' );
-                                               expect( uri.port ).not.toBeDefined();
-                                               expect( uri.path ).toEqual( '/rfc/rfc2396.txt' );
-                                               expect( uri.query ).toEqual( {} );
-                                               expect( uri.fragment ).not.toBeDefined();
-                                       } );
-
-                                       describe( "should construct composite components of URI on request", function() { 
-                                               it( "should have empty userinfo", function() { 
-                                                       expect( uri.getUserInfo() ).toEqual( '' );
-                                               } );
-
-                                               it( "should have authority equal to host", function() { 
-                                                       expect( uri.getAuthority() ).toEqual( 'www.ietf.org' );
-                                               } );
-
-                                               it( "should have hostport equal to host", function() { 
-                                                       expect( uri.getHostPort() ).toEqual( 'www.ietf.org' );
-                                               } );
-
-                                               it( "should have empty string as query string", function() { 
-                                                       expect( uri.getQueryString() ).toEqual( '' );
-                                               } );
-
-                                               it( "should have path as relative path", function() { 
-                                                       expect( uri.getRelativePath() ).toEqual( '/rfc/rfc2396.txt' );
-                                               } );
-
-                                               it( "should return a uri string equivalent to original", function() { 
-                                                       expect( uri.toString() ).toEqual( uriString );
-                                               } );
-                                       } );
-                               } );
-                       }
-
-                       describe( "should work in loose mode", function() { 
-                               basicTests( false );
-                       } );
-
-                       describe( "should work in strict mode", function() {
-                               basicTests( true );
-                       } );
-
-               } );
-
-               it( "should parse a simple ftp URI correctly with user and password", function() {
-                       var uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
-                       expect( uri.protocol ).toEqual( 'ftp' );
-                       expect( uri.user ).toEqual( 'usr' );
-                       expect( uri.password ).toEqual( 'pwd' );
-                       expect( uri.host ).toEqual( '192.0.2.16' );
-                       expect( uri.port ).not.toBeDefined();
-                       expect( uri.path ).toEqual( '/' );
-                       expect( uri.query ).toEqual( {} );
-                       expect( uri.fragment ).not.toBeDefined();
-               } );
-
-               it( "should parse a simple querystring", function() {
-                       var uri = new mw.Uri( 'http://www.google.com/?q=uri' );
-                       expect( uri.protocol ).toEqual( 'http' );
-                       expect( uri.host ).toEqual( 'www.google.com' );
-                       expect( uri.port ).not.toBeDefined();
-                       expect( uri.path ).toEqual( '/' );
-                       expect( uri.query ).toBeDefined();
-                       expect( uri.query ).toEqual( { q: 'uri' } );
-                       expect( uri.fragment ).not.toBeDefined();
-                       expect( uri.getQueryString() ).toEqual( 'q=uri' );
-               } );
-
-               describe( "should handle multiple value query args (overrideKeys on)", function() {
-                       var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', { overrideKeys: true } );
-                       it ( "should parse with multiple values", function() {
-                               expect( uri.query.m ).toEqual( 'bar' );
-                               expect( uri.query.n ).toEqual( '1' );
-                       } );
-                       it ( "should accept multiple values", function() {
-                               uri.query.n = [ "x", "y", "z" ];
-                               expect( uri.toString() ).toContain( 'm=bar' );
-                               expect( uri.toString() ).toContain( 'n=x&n=y&n=z' );
-                               expect( uri.toString().length ).toEqual( 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length );
-                       } );
-               } );
-
-               describe( "should handle multiple value query args (overrideKeys off)", function() {
-                       var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', { overrideKeys: false } );
-                       it ( "should parse with multiple values", function() {
-                               expect( uri.query.m.length ).toEqual( 2 );
-                               expect( uri.query.m[0] ).toEqual( 'foo' );
-                               expect( uri.query.m[1] ).toEqual( 'bar' );
-                               expect( uri.query.n ).toEqual( '1' );
-                       } );
-                       it ( "should accept multiple values", function() {
-                               uri.query.n = [ "x", "y", "z" ];
-                               expect( uri.toString() ).toContain( 'm=foo&m=bar' );
-                               expect( uri.toString() ).toContain( 'n=x&n=y&n=z' );
-                               expect( uri.toString().length ).toEqual( 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length );
-                       } );
-                       it ( "should be okay with removing values", function() {
-                               uri.query.m.splice( 0, 1 );
-                               delete uri.query.n;
-                               expect( uri.toString() ).toEqual( 'http://www.example.com/dir/?m=bar' );
-                               uri.query.m.splice( 0, 1 );
-                               expect( uri.toString() ).toEqual( 'http://www.example.com/dir/' );
-                       } );
-               } );
-
-               describe( "should deal with an all-dressed URI with everything", function() {
-                       var uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
-
-                       it( "should have basic object properties", function() {
-                               expect( uri.protocol ).toEqual( 'http' );
-                               expect( uri.user ).toEqual( 'auth' );
-                               expect( uri.password ).not.toBeDefined();
-                               expect( uri.host ).toEqual( 'www.example.com' );
-                               expect( uri.port ).toEqual( '81' );
-                               expect( uri.path ).toEqual( '/dir/dir.2/index.htm' );
-                               expect( uri.query ).toEqual( { q1: '0', test1: null, test2: 'value (escaped)' } );
-                               expect( uri.fragment ).toEqual( 'top' );
-                       } );
-
-                       describe( "should construct composite components of URI on request", function() { 
-                               it( "should have userinfo", function() { 
-                                       expect( uri.getUserInfo() ).toEqual( 'auth' );
-                               } );
-
-                               it( "should have authority equal to auth@hostport", function() { 
-                                       expect( uri.getAuthority() ).toEqual( 'auth@www.example.com:81' );
-                               } );
-
-                               it( "should have hostport equal to host:port", function() { 
-                                       expect( uri.getHostPort() ).toEqual( 'www.example.com:81' );
-                               } );
-
-                               it( "should have query string which contains all components", function() { 
-                                       var queryString = uri.getQueryString();
-                                       expect( queryString ).toContain( 'q1=0' );
-                                       expect( queryString ).toContain( 'test1' );
-                                       expect( queryString ).not.toContain( 'test1=' );
-                                       expect( queryString ).toContain( 'test2=value+%28escaped%29' );
-                               } );
-
-                               it( "should have path as relative path", function() { 
-                                       expect( uri.getRelativePath() ).toContain( uri.path );
-                                       expect( uri.getRelativePath() ).toContain( uri.getQueryString() );
-                                       expect( uri.getRelativePath() ).toContain( uri.fragment );
-                               } );
-
-                       } );
-               } );
-
-               describe( "should be able to clone itself", function() {
-                       var original = new mw.Uri( 'http://en.wiki.local/w/api.php?action=query&foo=bar' );                     
-                       var clone = original.clone();
-
-                       it( "should make clones equivalent", function() { 
-                               expect( original ).toEqual( clone );
-                               expect( original.toString() ).toEqual( clone.toString() );
-                       } );
-
-                       it( "should be able to manipulate clones independently", function() { 
-                               // but they are still different objects
-                               expect( original ).not.toBe( clone );
-                               // and can diverge
-                               clone.host = 'fr.wiki.local';
-                               expect( original.host ).not.toEqual( clone.host );
-                               expect( original.toString() ).not.toEqual( clone.toString() );
-                       } );
-               } );
-
-               describe( "should be able to construct URL from object", function() {
-                       it ( "should construct given basic arguments", function() {  
-                               var uri = new mw.Uri( { protocol: 'http', host: 'www.foo.local',  path: '/this' } );
-                               expect( uri.toString() ).toEqual( 'http://www.foo.local/this' );
-                       } );
-               
-                       it ( "should construct given more complex arguments", function() {  
-                               var uri = new mw.Uri( { 
-                                       protocol: 'http', 
-                                       host: 'www.foo.local',  
-                                       path: '/this', 
-                                       query: { hi: 'there' },
-                                       fragment: 'blah'  
-                               } );
-                               expect( uri.toString() ).toEqual( 'http://www.foo.local/this?hi=there#blah' );
-                       } );    
-
-                       it ( "should fail to construct without required properties", function() {  
-                               expect( function() { 
-                                       var uri = new mw.Uri( { protocol: 'http', host: 'www.foo.local' } );
-                               } ).toThrow( "Bad constructor arguments" );
-                       } );
-               } );
-
-               describe( "should be able to manipulate properties", function() { 
-                       var uri;
-
-                       beforeEach( function() { 
-                               uri = new mw.Uri( 'http://en.wiki.local/w/api.php' );                   
-                       } );
-
-                       it( "can add a fragment", function() {
-                               uri.fragment = 'frag';
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php#frag' );
-                       } );
-
-                       it( "can change host and port", function() {
-                               uri.host = 'fr.wiki.local';
-                               uri.port = '8080';
-                               expect( uri.toString() ).toEqual( 'http://fr.wiki.local:8080/w/api.php' );
-                       } );
-
-                       it ( "can add query arguments", function() {
-                               uri.query.foo = 'bar';
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );
-                       } );
-
-                       it ( "can extend query arguments", function() {
-                               uri.query.foo = 'bar';
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );
-                               uri.extend( { foo: 'quux', pif: 'paf' } );
-                               expect( uri.toString() ).toContain( 'foo=quux' );
-                               expect( uri.toString() ).not.toContain( 'foo=bar' );
-                               expect( uri.toString() ).toContain( 'pif=paf' );
-                       } );
-
-                       it ( "can remove query arguments", function() {
-                               uri.query.foo = 'bar';
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );   
-                               delete( uri.query.foo );
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php' );   
-                       } );
-
-               } );
-
-               describe( "should handle protocol-relative URLs", function() { 
-                       var uriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
-
-                       it ( "should create protocol-relative URLs with same protocol as document", function() {
-                               var uri = new uriRel( '//en.wiki.local/w/api.php' );
-                               expect( uri.protocol ).toEqual( 'glork' );
-                       } );
-
-                       it( "should handle absolute paths by supplying protocol and host from document in loose mode", function() {
-                               var uri = new uriRel( '/foo.com' );
-                               expect( uri.toString() ).toEqual( 'glork://en.wiki.local/foo.com' );
-                       } );
-
-                       it( "should handle absolute paths by supplying host from document in loose mode", function() {
-                               var uri = new uriRel( 'http:/foo.com' );
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/foo.com' );
-                       } );
-
-                       it( "should handle absolute paths by supplying protocol and host from document in strict mode", function() {
-                               var uri = new uriRel( '/foo.com', true );
-                               expect( uri.toString() ).toEqual( 'glork://en.wiki.local/foo.com' );
-                       } );
-
-                       it( "should handle absolute paths by supplying host from document in strict mode", function() {
-                               var uri = new uriRel( 'http:/foo.com', true );
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/foo.com' );
-                       } );
-               } );
-
-               it( "should throw error on no arguments to constructor", function() {
-                       expect( function() { 
-                               var uri = new mw.Uri();
-                       } ).toThrow( "Bad constructor arguments" );
-               } );
-
-               it( "should throw error on empty string as argument to constructor", function() {
-                       expect( function() { 
-                               var uri = new mw.Uri( '' );
-                       } ).toThrow( "Bad constructor arguments" );
-               } );
-
-               it( "should throw error on non-URI as argument to constructor", function() {
-                       expect( function() { 
-                               var uri = new mw.Uri( 'glaswegian penguins' );
-                       } ).toThrow( "Bad constructor arguments" );
-               } );
-
-               it( "should throw error on URI without protocol or // or leading / in strict mode", function() {
-                       expect( function() { 
-                               var uri = new mw.Uri( 'foo.com/bar/baz', true );
-                       } ).toThrow( "Bad constructor arguments" );
-               } );
-
-               it( "should normalize URI without protocol or // in loose mode", function() {
-                       var uri = new mw.Uri( 'foo.com/bar/baz', false );
-                       expect( uri.toString() ).toEqual( 'http://foo.com/bar/baz' );
-               } );
-
-       } );
-
-} )();
index 1f0cf87..ddb84c3 100644 (file)
@@ -9290,6 +9290,72 @@ Ignore pipe between table row attributes
 
 !! end
 
+!!test
+Gallery override link with WikiLink (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!!test
+Gallery override link with absolute external link (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!!test
+Gallery override link with malicious javascript (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!!test
+Language parser function
+!! input
+{{#language:ar}}
+!! result
+<p>العربية
+</p>
+!! end
+
 TODO:
 more images
 more tables
index f626459..0791711 100644 (file)
@@ -132,8 +132,18 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        function needsDB() {
+               # if the test says it uses database tables, it needs the database
+               if ( $this->tablesUsed ) {
+                       return true;
+               }
+
+               # if the test says it belongs to the Database group, it needs the database
                $rc = new ReflectionClass( $this );
-               return strpos( $rc->getDocComment(), '@group Database' ) !== false;
+               if ( preg_match( '/@group +Database/im', $rc->getDocComment() ) ) {
+                       return true;
+               }
+
+               return false;
        }
 
        /**
index b023fdc..08eb50f 100644 (file)
@@ -15,11 +15,11 @@ EOF;
 }
 
 // Output a notice when running with older versions of PHPUnit
-if ( !version_compare( PHPUnit_Runner_Version::id(), "3.4.1", ">" ) ) {
+if ( version_compare( PHPUnit_Runner_Version::id(), "3.6.7", "<" ) ) {
   echo <<<EOF
 ********************************************************************************
 
-These tests run best with version PHPUnit 3.4.2 or better. Earlier versions may
+These tests run best with version PHPUnit 3.6.7 or better. Earlier versions may
 show failures because earlier versions of PHPUnit do not properly implement
 dependencies.
 
index 6c3e666..b5418dd 100644 (file)
@@ -8,7 +8,7 @@ class CdbTest extends MediaWikiTestCase {
 
        public function setUp() {
                if ( !CdbReader::haveExtension() ) {
-                       $this->markTestIncomplete( 'This test requires native CDB support to be present.' );
+                       $this->markTestSkipped( 'Native CDB support is not available' );
                }
        }
 
index 89d9e0c..664f04a 100644 (file)
@@ -8,6 +8,7 @@ class PreferencesTest extends MediaWikiTestCase {
 
        function __construct() {
                parent::__construct();
+               global $wgEnableEmail;
 
                $this->users['noemail'] = new User;
 
@@ -23,6 +24,9 @@ class PreferencesTest extends MediaWikiTestCase {
 
                $this->context = new RequestContext;
                $this->context->setTitle( Title::newFromText('PreferencesTest') );
+
+               //some tests depends on email setting
+               $wgEnableEmail = true;
        }
 
        /**
diff --git a/tests/phpunit/includes/RevisionStorageTest.php b/tests/phpunit/includes/RevisionStorageTest.php
new file mode 100644 (file)
index 0000000..20199b2
--- /dev/null
@@ -0,0 +1,308 @@
+<?php
+
+/**
+ * Test class for Revision storage.
+ *
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class RevisionStorageTest extends MediaWikiTestCase {
+
+       var $the_page;
+
+       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge( $this->tablesUsed,
+                                                array( 'page',
+                                                     'revision',
+                                                     'text',
+
+                                                     'recentchanges',
+                                                     'logging',
+
+                                                     'page_props',
+                                                     'pagelinks',
+                                                     'categorylinks',
+                                                     'langlinks',
+                                                     'externallinks',
+                                                     'imagelinks',
+                                                     'templatelinks',
+                                                     'iwlinks' ) );
+       }
+
+       public function setUp() {
+               if ( !$this->the_page ) {
+                       $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page" );
+               }
+       }
+
+       protected function makeRevision( $props = null ) {
+               if ( $props === null ) $props = array();
+
+               if ( !isset( $props['content'] ) && !isset( $props['text'] ) ) $props['text'] = 'Lorem Ipsum';
+               if ( !isset( $props['comment'] ) ) $props['comment'] = 'just a test';
+               if ( !isset( $props['page'] ) ) $props['page'] = $this->the_page->getId();
+
+               $rev = new Revision( $props );
+
+               $dbw = wfgetDB( DB_MASTER );
+               $rev->insertOn( $dbw );
+
+               return $rev;
+       }
+
+       protected function createPage( $page, $text, $model = null ) {
+               if ( is_string( $page ) ) $page = Title::newFromText( $page );
+               if ( $page instanceof Title ) $page = new WikiPage( $page );
+
+               if ( $page->exists() ) {
+                       $page->doDeleteArticle( "done" );
+               }
+
+               $page->doEdit( $text, "testing", EDIT_NEW );
+
+               return $page;
+       }
+
+       protected function assertRevEquals( Revision $orig, Revision $rev = null ) {
+               $this->assertNotNull( $rev, 'missing revision' );
+
+               $this->assertEquals( $orig->getId(), $rev->getId() );
+               $this->assertEquals( $orig->getPage(), $rev->getPage() );
+               $this->assertEquals( $orig->getTimestamp(), $rev->getTimestamp() );
+               $this->assertEquals( $orig->getUser(), $rev->getUser() );
+               $this->assertEquals( $orig->getSha1(), $rev->getSha1() );
+       }
+
+       /**
+        * @covers Revision::__construct
+        */
+       public function testConstructFromRow()
+       {
+               $orig = $this->makeRevision();
+
+               $dbr = wfgetDB( DB_SLAVE );
+               $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
+               $this->assertTrue( is_object( $res ), 'query failed' );
+
+               $row = $res->fetchObject();
+               $res->free();
+
+               $rev = new Revision( $row );
+
+               $this->assertRevEquals( $orig, $rev );
+       }
+
+       /**
+        * @covers Revision::newFromRow
+        */
+       public function testNewFromRow()
+       {
+               $orig = $this->makeRevision();
+
+               $dbr = wfgetDB( DB_SLAVE );
+               $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
+               $this->assertTrue( is_object( $res ), 'query failed' );
+
+               $row = $res->fetchObject();
+               $res->free();
+
+               $rev = Revision::newFromRow( $row );
+
+               $this->assertRevEquals( $orig, $rev );
+       }
+
+
+       /**
+        * @covers Revision::newFromArchiveRow
+        */
+       public function testNewFromArchiveRow()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum' );
+               $orig = $page->getRevision();
+               $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
+
+               $dbr = wfgetDB( DB_SLAVE );
+               $res = $dbr->select( 'archive', '*', array( 'ar_rev_id' => $orig->getId() ) );
+               $this->assertTrue( is_object( $res ), 'query failed' );
+
+               $row = $res->fetchObject();
+               $res->free();
+
+               $rev = Revision::newFromArchiveRow( $row );
+
+               $this->assertRevEquals( $orig, $rev );
+       }
+
+       /**
+        * @covers Revision::newFromId
+        */
+       public function testNewFromId()
+       {
+               $orig = $this->makeRevision();
+
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertRevEquals( $orig, $rev );
+       }
+
+       /**
+        * @covers Revision::fetchRevision
+        */
+       public function testFetchRevision()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one' );
+               $id1 = $page->getRevision()->getId();
+
+               $page->doEdit( 'two', 'second rev' );
+               $id2 = $page->getRevision()->getId();
+
+               $res = Revision::fetchRevision( $page->getTitle() );
+
+               #note: order is unspecified
+               $rows = array();
+               while ( ( $row = $res->fetchObject() ) ) {
+                       $rows[ $row->rev_id ]= $row;
+               }
+
+               $row = $res->fetchObject();
+               $this->assertEquals( 1, count($rows), 'expected exactly one revision' );
+               $this->assertArrayHasKey( $id2, $rows, 'missing revision with id ' . $id2 );
+       }
+
+       /**
+        * @covers Revision::selectFields
+        */
+       public function testSelectFields()
+       {
+               $fields = Revision::selectFields();
+
+               $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
+               $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields');
+               $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields');
+               $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields');
+       }
+
+       /**
+        * @covers Revision::getPage
+        */
+       public function testGetPage()
+       {
+               $page = $this->the_page;
+
+               $orig = $this->makeRevision( array( 'page' => $page->getId() ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( $page->getId(), $rev->getPage() );
+       }
+
+       /**
+        * @covers Revision::getText
+        */
+       public function testGetText()
+       {
+               $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( 'hello hello.', $rev->getText() );
+       }
+
+       /**
+        * @covers Revision::revText
+        */
+       public function testRevText()
+       {
+               $orig = $this->makeRevision( array( 'text' => 'hello hello rev.' ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( 'hello hello rev.', $rev->revText() );
+       }
+
+       /**
+        * @covers Revision::getRawText
+        */
+       public function testGetRawText()
+       {
+               $orig = $this->makeRevision( array( 'text' => 'hello hello raw.' ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( 'hello hello raw.', $rev->getRawText() );
+       }
+       /**
+        * @covers Revision::isCurrent
+        */
+       public function testIsCurrent()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum' );
+               $rev1 = $page->getRevision();
+
+               # @todo: find out if this should be true
+               # $this->assertTrue( $rev1->isCurrent() );
+
+               $rev1x = Revision::newFromId( $rev1->getId() );
+               $this->assertTrue( $rev1x->isCurrent() );
+
+               $page->doEdit( 'Bla bla', 'second rev' );
+               $rev2 = $page->getRevision();
+
+               # @todo: find out if this should be true
+               # $this->assertTrue( $rev2->isCurrent() );
+
+               $rev1x = Revision::newFromId( $rev1->getId() );
+               $this->assertFalse( $rev1x->isCurrent() );
+
+               $rev2x = Revision::newFromId( $rev2->getId() );
+               $this->assertTrue( $rev2x->isCurrent() );
+       }
+
+       /**
+        * @covers Revision::getPrevious
+        */
+       public function testGetPrevious()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious' );
+               $rev1 = $page->getRevision();
+
+               $this->assertNull( $rev1->getPrevious() );
+
+               $page->doEdit( 'Bla bla', 'second rev testGetPrevious' );
+               $rev2 = $page->getRevision();
+
+               $this->assertNotNull( $rev2->getPrevious() );
+               $this->assertEquals( $rev1->getId(), $rev2->getPrevious()->getId() );
+       }
+
+       /**
+        * @covers Revision::getNext
+        */
+       public function testGetNext()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext' );
+               $rev1 = $page->getRevision();
+
+               $this->assertNull( $rev1->getNext() );
+
+               $page->doEdit( 'Bla bla', 'second rev testGetNext' );
+               $rev2 = $page->getRevision();
+
+               $this->assertNotNull( $rev1->getNext() );
+               $this->assertEquals( $rev2->getId(), $rev1->getNext()->getId() );
+       }
+
+       /**
+        * @covers Revision::newNullRevision
+        */
+       public function testNewNullRevision()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text' );
+               $orig = $page->getRevision();
+
+               $dbw = wfGetDB( DB_MASTER );
+               $rev = Revision::newNullRevision( $dbw, $page->getId(), 'a null revision', false );
+
+               $this->assertNotEquals( $orig->getId(), $rev->getId(), 'new null revision shold have a different id from the original revision' );
+               $this->assertEquals( $orig->getTextId(), $rev->getTextId(), 'new null revision shold have the same text id as the original revision' );
+               $this->assertEquals( 'some testing text', $rev->getText() );
+       }
+}
index 2f1103e..aed658b 100644 (file)
@@ -21,8 +21,8 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $titleA = Title::newFromText( $titleA );
                $titleB = Title::newFromText( $titleB );
 
-               $this->assertEquals( $titleA->equals( $titleB ), $expectedBool );
-               $this->assertEquals( $titleB->equals( $titleA ), $expectedBool );
+               $this->assertEquals( $expectedBool, $titleA->equals( $titleB ) );
+               $this->assertEquals( $expectedBool, $titleB->equals( $titleA ) );
        }
 
        public function dataInNamespace() {
@@ -43,7 +43,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
         */
        public function testInNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
-               $this->assertEquals( $title->inNamespace( $ns ), $expectedBool );
+               $this->assertEquals( $expectedBool, $title->inNamespace( $ns ) );
        }
 
        public function testInNamespaces() {
@@ -72,7 +72,130 @@ class TitleMethodsTest extends MediaWikiTestCase {
         */
        public function testHasSubjectNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
-               $this->assertEquals( $title->hasSubjectNamespace( $ns ), $expectedBool );
+               $this->assertEquals( $expectedBool, $title->hasSubjectNamespace( $ns ) );
+       }
+
+       public function dataIsCssOrJsPage() {
+               return array(
+                       array( 'Foo', false ),
+                       array( 'Foo.js', false ),
+                       array( 'Foo/bar.js', false ),
+                       array( 'User:Foo', false ),
+                       array( 'User:Foo.js', false ),
+                       array( 'User:Foo/bar.js', false ),
+                       array( 'User:Foo/bar.css', false ),
+                       array( 'User talk:Foo/bar.css', false ),
+                       array( 'User:Foo/bar.js.xxx', false ),
+                       array( 'User:Foo/bar.xxx', false ),
+                       array( 'MediaWiki:Foo.js', true ),
+                       array( 'MediaWiki:Foo.css', true ),
+                       array( 'MediaWiki:Foo.JS', false ),
+                       array( 'MediaWiki:Foo.CSS', false ),
+                       array( 'MediaWiki:Foo.css.xxx', false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsCssOrJsPage
+        */
+       public function testIsCssOrJsPage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isCssOrJsPage() );
+       }
+
+
+       public function dataIsCssJsSubpage() {
+               return array(
+                       array( 'Foo', false ),
+                       array( 'Foo.js', false ),
+                       array( 'Foo/bar.js', false ),
+                       array( 'User:Foo', false ),
+                       array( 'User:Foo.js', false ),
+                       array( 'User:Foo/bar.js', true ),
+                       array( 'User:Foo/bar.css', true ),
+                       array( 'User talk:Foo/bar.css', false ),
+                       array( 'User:Foo/bar.js.xxx', false ),
+                       array( 'User:Foo/bar.xxx', false ),
+                       array( 'MediaWiki:Foo.js', false ),
+                       array( 'User:Foo/bar.JS', false ),
+                       array( 'User:Foo/bar.CSS', false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsCssJsSubpage
+        */
+       public function testIsCssJsSubpage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isCssJsSubpage() );
+       }
+
+       public function dataIsCssSubpage() {
+               return array(
+                       array( 'Foo', false ),
+                       array( 'Foo.css', false ),
+                       array( 'User:Foo', false ),
+                       array( 'User:Foo.js', false ),
+                       array( 'User:Foo.css', false ),
+                       array( 'User:Foo/bar.js', false ),
+                       array( 'User:Foo/bar.css', true ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsCssSubpage
+        */
+       public function testIsCssSubpage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isCssSubpage() );
+       }
+
+       public function dataIsJsSubpage() {
+               return array(
+                       array( 'Foo', false ),
+                       array( 'Foo.css', false ),
+                       array( 'User:Foo', false ),
+                       array( 'User:Foo.js', false ),
+                       array( 'User:Foo.css', false ),
+                       array( 'User:Foo/bar.js', true ),
+                       array( 'User:Foo/bar.css', false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsJsSubpage
+        */
+       public function testIsJsSubpage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isJsSubpage() );
+       }
+
+       public function dataIsWikitextPage() {
+               return array(
+                       array( 'Foo', true ),
+                       array( 'Foo.js', true ),
+                       array( 'Foo/bar.js', true ),
+                       array( 'User:Foo', true ),
+                       array( 'User:Foo.js', true ),
+                       array( 'User:Foo/bar.js', false ),
+                       array( 'User:Foo/bar.css', false ),
+                       array( 'User talk:Foo/bar.css', true ),
+                       array( 'User:Foo/bar.js.xxx', true ),
+                       array( 'User:Foo/bar.xxx', true ),
+                       array( 'MediaWiki:Foo.js', false ),
+                       array( 'MediaWiki:Foo.css', false ),
+                       array( 'MediaWiki:Foo/bar.css', false ),
+                       array( 'User:Foo/bar.JS', true ),
+                       array( 'User:Foo/bar.CSS', true ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsWikitextPage
+        */
+       public function testIsWikitextPage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isWikitextPage() );
        }
 
 }
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
new file mode 100644 (file)
index 0000000..88c26ef
--- /dev/null
@@ -0,0 +1,765 @@
+<?php
+/**
+* @group Database
+* ^--- important, causes temporary tables to be used instead of the real database
+**/
+
+class WikiPageTest extends MediaWikiTestCase {
+
+       var $pages_to_delete;
+
+       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge ( $this->tablesUsed,
+                                                 array( 'page',
+                                                      'revision',
+                                                      'text',
+
+                                                      'recentchanges',
+                                                      'logging',
+
+                                                      'page_props',
+                                                      'pagelinks',
+                                                      'categorylinks',
+                                                      'langlinks',
+                                                      'externallinks',
+                                                      'imagelinks',
+                                                      'templatelinks',
+                                                      'iwlinks' ) );
+       }
+
+       public function setUp() {
+               $this->pages_to_delete = array();
+       }
+
+       public function tearDown() {
+               foreach ( $this->pages_to_delete as $p ) {
+                       /* @var $p WikiPage */
+
+                       try {
+                               if ( $p->exists() ) {
+                                       $p->doDeleteArticle( "testing done." );
+                               }
+                       } catch ( MWException $ex ) {
+                               // fail silently
+                       }
+               }
+       }
+
+       protected function newPage( $title ) {
+               if ( is_string( $title ) ) $title = Title::newFromText( $title );
+
+               $p = new WikiPage( $title );
+
+               $this->pages_to_delete[] = $p;
+
+               return $p;
+       }
+
+       protected function createPage( $page, $text, $model = null ) {
+               if ( is_string( $page ) ) $page = Title::newFromText( $page );
+               if ( $page instanceof Title ) $page = $this->newPage( $page );
+
+               $page->doEdit( $text, "testing", EDIT_NEW );
+
+               return $page;
+       }
+
+       public function testDoEdit() {
+               $title = Title::newFromText( "WikiPageTest_testDoEdit" );
+
+               $page = $this->newPage( $title );
+
+               $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+                      . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
+
+               $page->doEdit( $text, "testing 1" );
+
+               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
+               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
+
+               $id = $page->getId();
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getText();
+               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+               # ------------------------
+               $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+                      . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
+
+               $page->doEdit( $text, "testing 2" );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getText();
+               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
+       }
+
+       public function testDoQuickEdit() {
+               global $wgUser;
+
+               $page = $this->createPage( "WikiPageTest_testDoQuickEdit", "original text" );
+
+               $text = "quick text";
+               $page->doQuickEdit( $text, $wgUser, "testing q" );
+
+               # ---------------------
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $text, $page->getText() );
+       }
+
+       public function testDoDeleteArticle() {
+               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo" );
+               $id = $page->getId();
+
+               $page->doDeleteArticle( "testing deletion" );
+
+               $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" );
+               $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" );
+
+               $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
+               $this->assertFalse( $t->exists(), "Title::exists should return false after page was deleted" );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+       }
+
+       public function testGetRevision() {
+               $page = $this->newPage( "WikiPageTest_testGetRevision" );
+
+               $rev = $page->getRevision();
+               $this->assertNull( $rev );
+
+               # -----------------
+               $this->createPage( $page, "some text" );
+
+               $rev = $page->getRevision();
+
+               $this->assertEquals( $page->getLatest(), $rev->getId() );
+               $this->assertEquals( "some text", $rev->getText() );
+       }
+
+       public function testGetText() {
+               $page = $this->newPage( "WikiPageTest_testGetText" );
+
+               $text = $page->getText();
+               $this->assertFalse( $text );
+
+               # -----------------
+               $this->createPage( $page, "some text" );
+
+               $text = $page->getText();
+               $this->assertEquals( "some text", $text );
+       }
+
+       public function testGetRawText() {
+               $page = $this->newPage( "WikiPageTest_testGetRawText" );
+
+               $text = $page->getRawText();
+               $this->assertFalse( $text );
+
+               # -----------------
+               $this->createPage( $page, "some text" );
+
+               $text = $page->getRawText();
+               $this->assertEquals( "some text", $text );
+       }
+
+       
+       public function testExists() {
+               $page = $this->newPage( "WikiPageTest_testExists" );
+               $this->assertFalse( $page->exists() );
+
+               # -----------------
+               $this->createPage( $page, "some text" );
+               $this->assertTrue( $page->exists() );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertTrue( $page->exists() );
+
+               # -----------------
+               $page->doDeleteArticle( "done testing" );
+               $this->assertFalse( $page->exists() );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertFalse( $page->exists() );
+       }
+
+       public function dataHasViewableContent() {
+               return array(
+                       array( 'WikiPageTest_testHasViewableContent', false, true ),
+                       array( 'Special:WikiPageTest_testHasViewableContent', false ),
+                       array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
+                       array( 'Special:Userlogin', true ),
+                       array( 'MediaWiki:help', true ),
+               );
+       }
+
+       /**
+        * @dataProvider dataHasViewableContent
+        */
+       public function testHasViewableContent( $title, $viewable, $create = false ) {
+               $page = $this->newPage( $title );
+               $this->assertEquals( $viewable, $page->hasViewableContent() );
+
+               if ( $create ) {
+                       $this->createPage( $page, "some text" );
+                       $this->assertTrue( $page->hasViewableContent() );
+
+                       $page = new WikiPage( $page->getTitle() );
+                       $this->assertTrue( $page->hasViewableContent() );
+               }
+       }
+
+       public function dataGetRedirectTarget() {
+               return array(
+                       array( 'WikiPageTest_testGetRedirectTarget_1', "hello world", null ),
+                       array( 'WikiPageTest_testGetRedirectTarget_2', "#REDIRECT [[hello world]]", "Hello world" ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetRedirectTarget
+        */
+       public function testGetRedirectTarget( $title, $text, $target ) {
+               $page = $this->createPage( $title, $text );
+
+               # now, test the actual redirect
+               $t = $page->getRedirectTarget();
+               $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
+       }
+
+       /**
+        * @dataProvider dataGetRedirectTarget
+        */
+       public function testIsRedirect( $title, $text, $target ) {
+               $page = $this->createPage( $title, $text );
+               $this->assertEquals( !is_null( $target ), $page->isRedirect() );
+       }
+
+       public function dataIsCountable() {
+               return array(
+
+                       // any
+                       array( 'WikiPageTest_testIsCountable',
+                              '',
+                              'any',
+                              true
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo',
+                              'any',
+                              true
+                       ),
+
+                       // comma
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo',
+                              'comma',
+                              false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo, bar',
+                              'comma',
+                              true
+                       ),
+
+                       // link
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo',
+                              'link',
+                              false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo [[bar]]',
+                              'link',
+                              true
+                       ),
+
+                       // redirects
+                       array( 'WikiPageTest_testIsCountable',
+                              '#REDIRECT [[bar]]',
+                              'any',
+                              false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              '#REDIRECT [[bar]]',
+                              'comma',
+                              false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              '#REDIRECT [[bar]]',
+                              'link',
+                              false
+                       ),
+
+                       // not a content namespace
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                              'Foo',
+                              'any',
+                              false
+                       ),
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                              'Foo, bar',
+                              'comma',
+                              false
+                       ),
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                              'Foo [[bar]]',
+                              'link',
+                              false
+                       ),
+
+                       // not a content namespace, different model
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                              'Foo',
+                              'any',
+                              false
+                       ),
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                              'Foo, bar',
+                              'comma',
+                              false
+                       ),
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                              'Foo [[bar]]',
+                              'link',
+                              false
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider dataIsCountable
+        */
+       public function testIsCountable( $title, $text, $mode, $expected ) {
+               global $wgArticleCountMethod;
+
+               $old = $wgArticleCountMethod;
+               $wgArticleCountMethod = $mode;
+
+               $page = $this->createPage( $title, $text );
+               $editInfo = $page->prepareTextForEdit( $page->getText() );
+
+               $v = $page->isCountable();
+               $w = $page->isCountable( $editInfo );
+               $wgArticleCountMethod = $old;
+
+               $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
+                                                   . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+
+               $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
+                                                   . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+       }
+
+       public function dataGetParserOutput() {
+               return array(
+                       array("hello ''world''\n", "<p>hello <i>world</i></p>"),
+                       // @todo: more...?
+               );
+       }
+
+       /**
+        * @dataProvider dataGetParserOutput
+        */
+       public function testGetParserOutput( $text, $expectedHtml ) {
+               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text );
+
+               $opt = new ParserOptions();
+               $po = $page->getParserOutput( $opt );
+               $text = $po->getText();
+
+               $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
+               $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
+
+               $this->assertEquals( $expectedHtml, $text );
+               return $po;
+       }
+
+       static $sections =
+
+               "Intro
+
+== stuff ==
+hello world
+
+== test ==
+just a test
+
+== foo ==
+more stuff
+";
+
+
+       public function dataReplaceSection() {
+               return array(
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "0",
+                              "No more",
+                              null,
+                              trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
+                       ),
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "",
+                              "No more",
+                              null,
+                              "No more"
+                       ),
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "2",
+                              "== TEST ==\nmore fun",
+                              null,
+                              trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikiPageTest::$sections ) )
+                       ),
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "8",
+                              "No more",
+                              null,
+                              trim( WikiPageTest::$sections )
+                       ),
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "new",
+                              "No more",
+                              "New",
+                              trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        */
+       public function testReplaceSection( $title, $text, $section, $with, $sectionTitle, $expected ) {
+               $page = $this->createPage( $title, $text );
+               $text = $page->replaceSection( $section, $with, $sectionTitle );
+               $text = trim( $text );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+       /* @FIXME: fix this!
+       public function testGetUndoText() {
+               global $wgDiff3;
+
+               wfSuppressWarnings();
+               $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
+               wfRestoreWarnings();
+
+               if( !$haveDiff3 ) {
+                       $this->markTestSkipped( "diff3 not installed or not found" );
+                       return;
+               }
+
+               $text = "one";
+               $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
+               $rev1 = $page->getRevision();
+
+               $text .= "\n\ntwo";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two");
+               $rev2 = $page->getRevision();
+
+               $text .= "\n\nthree";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three");
+               $rev3 = $page->getRevision();
+
+               $text .= "\n\nfour";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four");
+               $rev4 = $page->getRevision();
+
+               $text .= "\n\nfive";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five");
+               $rev5 = $page->getRevision();
+
+               $text .= "\n\nsix";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
+               $rev6 = $page->getRevision();
+
+               $undo6 = $page->getUndoText( $rev6 );
+               if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
+               $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
+
+               $undo3 = $page->getUndoText( $rev4, $rev2 );
+               if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
+               $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
+
+               $undo2 = $page->getUndoText( $rev2 );
+               if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
+               $this->assertEquals( "one\n\nfive", $undo2 );
+       }
+       */
+
+       /**
+        * @todo FIXME: this is a better rollback test than the one below, but it keeps failing in jenkins for some reason.
+        */
+       public function broken_testDoRollback() {
+               $admin = new User();
+               $admin->setName("Admin");
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEdit( $text, "adding section two", 0, false, $user1 );
+
+               $user2 = new User();
+               $user2->setName( "127.0.2.13" );
+               $text .= "\n\nthree";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEdit( $text, "adding section three", 0, false, $user2 );
+
+               # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing
+               # or not committed under some circumstances. so, make sure the last revision has the right user name.
+               $dbr = wfGetDB( DB_SLAVE );
+               $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
+
+               $page = new WikiPage( $page->getTitle() );
+               $rev3 = $page->getRevision();
+               $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
+
+               $rev2 = $rev3->getPrevious();
+               $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
+
+               $rev1 = $rev2->getPrevious();
+               $this->assertEquals( 'Admin', $rev1->getUserText() );
+
+               # now, try the actual rollback
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null );
+               $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin );
+
+               if ( $errors ) {
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+               }
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one\n\ntwo", $page->getText() );
+       }
+
+       /**
+        * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
+        */
+       public function testDoRollback() {
+               $admin = new User();
+               $admin->setName("Admin");
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
+               $rev1 = $page->getRevision();
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEdit( $text, "adding section two", 0, false, $user1 );
+
+               # now, try the rollback
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
+               $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin );
+
+               if ( $errors ) {
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+               }
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one", $page->getText() );
+       }
+
+       public function dataGetAutosummary( ) {
+               return array(
+                       array(
+                               'Hello there, world!',
+                               '#REDIRECT [[Foo]]',
+                               0,
+                               '/^Redirected page .*Foo/'
+                       ),
+
+                       array(
+                               null,
+                               'Hello world!',
+                               EDIT_NEW,
+                               '/^Created page .*Hello/'
+                       ),
+
+                       array(
+                               'Hello there, world!',
+                               '',
+                               0,
+                               '/^Blanked/'
+                       ),
+
+                       array(
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
+                               labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
+                               ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Hello world!',
+                               0,
+                               '/^Replaced .*Hello/'
+                       ),
+
+                       array(
+                               'foo',
+                               'bar',
+                               0,
+                               '/^$/'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetAutoSummary
+        */
+       public function testGetAutosummary( $old, $new, $flags, $expected ) {
+               $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
+
+               $summary = $page->getAutosummary( $old, $new, $flags );
+
+               $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
+       }
+
+       public function dataGetAutoDeleteReason( ) {
+               return array(
+                       array(
+                               array(),
+                               false,
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", null ),
+                               ),
+                               "/first edit.*only contributor/",
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", null ),
+                                       array( "second edit", null ),
+                               ),
+                               "/second edit.*only contributor/",
+                               true
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", "127.0.2.22" ),
+                                       array( "second edit", "127.0.3.33" ),
+                               ),
+                               "/second edit/",
+                               true
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit: "
+                                            . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+                                            . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
+                                            . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
+                                            . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
+                               ),
+                               '/first edit:.*\.\.\."/',
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", "127.0.2.22" ),
+                                       array( "", "127.0.3.33" ),
+                               ),
+                               "/before blanking.*first edit/",
+                               true
+                       ),
+
+               );
+       }
+
+       /**
+        * @dataProvider dataGetAutoDeleteReason
+        */
+       public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
+               global $wgUser;
+
+               $page = $this->newPage( "WikiPageTest_testGetAutoDeleteReason" );
+
+               $c = 1;
+
+               foreach ( $edits as $edit ) {
+                       $user = new User();
+
+                       if ( !empty( $edit[1] ) ) $user->setName( $edit[1] );
+                       else $user = $wgUser;
+
+                       $page->doEdit( $edit[0], "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
+
+                       $c += 1;
+               }
+
+               $reason = $page->getAutoDeleteReason( $hasHistory );
+
+               if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) $this->assertEquals( $expectedResult, $reason );
+               else $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), "Autosummary didn't match expected pattern $expectedResult: $reason" );
+
+               $this->assertEquals( $expectedHistory, $hasHistory, "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
+
+               $page->doDeleteArticle( "done" );
+       }
+
+       public function dataPreSaveTransform() {
+               return array(
+                       array( 'hello this is ~~~',
+                              "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
+                       ),
+                       array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                              'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataPreSaveTransform
+        */
+       public function testPreSaveTransform( $text, $expected ) {
+               $user = new User();
+               $user->setName("127.0.0.1");
+
+               $page = $this->newPage( "WikiPageTest_testPreloadTransform" );
+               $text = $page->preSaveTransform( $text, $user );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+}
+
diff --git a/tests/phpunit/includes/api/ApiOptionsTest.php b/tests/phpunit/includes/api/ApiOptionsTest.php
new file mode 100644 (file)
index 0000000..8acdc1c
--- /dev/null
@@ -0,0 +1,223 @@
+<?php
+
+/**
+ * @group API
+ */
+class ApiOptionsTest extends MediaWikiLangTestCase {
+
+       private $mTested, $mApiMainMock, $mUserMock, $mContext, $mSession;
+
+       private static $Success = array( 'options' => 'success' );
+
+       function setUp() {
+               parent::setUp();
+
+               $this->mUserMock = $this->getMockBuilder( 'User' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $this->mApiMainMock = $this->getMockBuilder( 'ApiBase' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               // Create a new context
+               $this->mContext = new DerivativeContext( new RequestContext() );
+               $this->mContext->setUser( $this->mUserMock );
+
+               $this->mApiMainMock->expects( $this->any() )
+                       ->method( 'getContext' )
+                       ->will( $this->returnValue( $this->mContext ) );
+
+               $this->mApiMainMock->expects( $this->any() )
+                       ->method( 'getResult' )
+                       ->will( $this->returnValue( new ApiResult( $this->mApiMainMock ) ) );
+
+
+               // Empty session
+               $this->mSession = array();
+
+               $this->mTested = new ApiOptions( $this->mApiMainMock, 'options' );
+       }
+
+       private function getSampleRequest( $custom = array() ) {
+               $request = array(
+                       'token' => '123ABC',
+                       'change' => null,
+                       'optionname' => null,
+                       'optionvalue' => null,
+               );
+               return array_merge( $request, $custom );
+       }
+
+       private function executeQuery( $request ) {
+               $this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
+               $this->mTested->execute();
+               return $this->mTested->getResult()->getData();
+       }
+
+       /**
+        * @expectedException UsageException
+        */
+       public function testNoToken() {
+               $request = $this->getSampleRequest( array( 'token' => null ) );
+
+               $this->executeQuery( $request );
+       }
+
+       public function testAnon() {
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'isAnon' )
+                       ->will( $this->returnValue( true ) );
+
+               try {
+                       $request = $this->getSampleRequest();
+
+                       $this->executeQuery( $request );
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( 'notloggedin', $e->getCodeString() );
+                       $this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
+                       return;
+               }
+               $this->fail( "UsageException was not thrown" );
+       }
+
+       public function testNoOptionname() {
+               try {
+                       $request = $this->getSampleRequest( array( 'optionvalue' => '1' ) );
+
+                       $this->executeQuery( $request );
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( 'nooptionname', $e->getCodeString() );
+                       $this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
+                       return;
+               }
+               $this->fail( "UsageException was not thrown" );
+       }
+
+       public function testNoChanges() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'setOption' );
+
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'saveSettings' );
+
+               try {
+                       $request = $this->getSampleRequest();
+
+                       $this->executeQuery( $request );
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( 'nochanges', $e->getCodeString() );
+                       $this->assertEquals( 'No changes were requested', $e->getMessage() );
+                       return;
+               }
+               $this->fail( "UsageException was not thrown" );
+       }
+
+       public function testReset() {
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'setOption' );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'reset' => '' ) );
+
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
+       public function testOptionWithValue() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'optionname' => 'name', 'optionvalue' => 'value' ) );
+
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
+       public function testOptionResetValue() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'name' ), $this->equalTo( null ) );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'optionname' => 'name' ) );
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
+       public function testChange() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->at( 1 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'willBeNull' ), $this->equalTo( null ) );
+
+               $this->mUserMock->expects( $this->at( 2 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) );
+
+               $this->mUserMock->expects( $this->at( 3 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy' ) );
+
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
+       public function testResetChangeOption() {
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->at( 2 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
+
+               $this->mUserMock->expects( $this->at( 3 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $args = array(
+                       'reset' => '',
+                       'change' => 'willBeHappy=Happy',
+                       'optionname' => 'name',
+                       'optionvalue' => 'value'
+               );
+
+               $response = $this->executeQuery( $this->getSampleRequest( $args ) );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+}
diff --git a/tests/phpunit/includes/cache/GenderCacheTest.php b/tests/phpunit/includes/cache/GenderCacheTest.php
new file mode 100644 (file)
index 0000000..a8b987e
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ */
+class GenderCacheTest extends MediaWikiLangTestCase {
+
+       function setUp() {
+               global $wgDefaultUserOptions;
+               parent::setUp();
+               //ensure the correct default gender
+               $wgDefaultUserOptions['gender'] = 'unknown';
+       }
+
+       function addDBData() {
+               $user = User::newFromName( 'UTMale' );
+               if( $user->getID() == 0 ) {
+                       $user->addToDatabase();
+                       $user->setPassword( 'UTMalePassword' );
+               }
+               //ensure the right gender
+               $user->setOption( 'gender', 'male' );
+               $user->saveSettings();
+
+               $user = User::newFromName( 'UTFemale' );
+               if( $user->getID() == 0 ) {
+                       $user->addToDatabase();
+                       $user->setPassword( 'UTFemalePassword' );
+               }
+               //ensure the right gender
+               $user->setOption( 'gender', 'female' );
+               $user->saveSettings();
+
+               $user = User::newFromName( 'UTDefaultGender' );
+               if( $user->getID() == 0 ) {
+                       $user->addToDatabase();
+                       $user->setPassword( 'UTDefaultGenderPassword' );
+               }
+               //ensure the default gender
+               $user->setOption( 'gender', null );
+               $user->saveSettings();
+       }
+
+       /**
+        * test usernames
+        *
+        * @dataProvider dataUserName
+        */
+       function testUserName( $username, $expectedGender ) {
+               $genderCache = GenderCache::singleton();
+               $gender = $genderCache->getGenderOf( $username );
+               $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
+       }
+
+       /**
+        * genderCache should work with user objects, too
+        *
+        * @dataProvider dataUserName
+        */
+       function testUserObjects( $username, $expectedGender ) {
+               $genderCache = GenderCache::singleton();
+               $user = User::newFromName( $username );
+               $gender = $genderCache->getGenderOf( $user );
+               $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
+       }
+
+       function dataUserName() {
+               return array(
+                       array( 'UTMale', 'male' ),
+                       array( 'UTFemale', 'female' ),
+                       array( 'UTDefaultGender', 'unknown' ),
+                       array( 'UTNotExist', 'unknown' ),
+                       //some not valid user
+                       array( '127.0.0.1', 'unknown' ),
+                       array( 'user@test', 'unknown' ),
+               );
+       }
+
+       /**
+        * test strip of subpages to avoid unnecessary queries
+        * against the never existing username
+        *
+        * @dataProvider dataStripSubpages
+        */
+       function testStripSubpages( $pageWithSubpage, $expectedGender ) {
+               $genderCache = GenderCache::singleton();
+               $gender = $genderCache->getGenderOf( $pageWithSubpage );
+               $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
+       }
+
+       function dataStripSubpages() {
+               return array(
+                       array( 'UTMale/subpage', 'male' ),
+                       array( 'UTFemale/subpage', 'female' ),
+                       array( 'UTDefaultGender/subpage', 'unknown' ),
+                       array( 'UTNotExist/subpage', 'unknown' ),
+                       array( '127.0.0.1/subpage', 'unknown' ),
+               );
+       }
+}
index da44797..9c36a57 100644 (file)
@@ -23,10 +23,11 @@ class FileBackendTest extends MediaWikiTestCase {
                                foreach ( $wgFileBackends as $conf ) {
                                        if ( $conf['name'] == $name ) {
                                                $useConfig = $conf;
+                                               break;
                                        }
                                }
                                $useConfig['name'] = 'localtesting'; // swap name
-                               $class = $conf['class'];
+                               $class = $useConfig['class'];
                                self::$backendToUse = new $class( $useConfig );
                                $this->singleBackend = self::$backendToUse;
                        }
@@ -204,7 +205,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       function doTestStore( $op ) {
+       private function doTestStore( $op ) {
                $backendName = $this->backendClass();
 
                $source = $op['src'];
@@ -286,7 +287,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       function doTestCopy( $op ) {
+       private function doTestCopy( $op ) {
                $backendName = $this->backendClass();
 
                $source = $op['src'];
@@ -667,7 +668,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       public function doTestConcatenate( $params, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
+       private function doTestConcatenate( $params, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
                $backendName = $this->backendClass();
 
                $expContent = '';
@@ -823,7 +824,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $size = $this->backend->getFileSize( array( 'src' => $path ) );
                        $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
                        $stat = $this->backend->getFileStat( array( 'src' => $path ) );
-                       
+
                        $this->assertFalse( $size, "Correct file size of '$path'" );
                        $this->assertFalse( $time, "Correct file timestamp of '$path'" );
                        $this->assertFalse( $stat, "Correct file stat of '$path'" );
@@ -856,7 +857,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       public function doTestGetFileContents( $source, $content ) {
+       private function doTestGetFileContents( $source, $content ) {
                $backendName = $this->backendClass();
 
                $this->prepare( array( 'dir' => dirname( $source ) ) );
@@ -901,7 +902,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       public function doTestGetLocalCopy( $source, $content ) {
+       private function doTestGetLocalCopy( $source, $content ) {
                $backendName = $this->backendClass();
 
                $this->prepare( array( 'dir' => dirname( $source ) ) );
@@ -995,7 +996,7 @@ class FileBackendTest extends MediaWikiTestCase {
                );
        }
 
-       function doTestPrepareAndClean( $path, $isOK ) {
+       private function doTestPrepareAndClean( $path, $isOK ) {
                $backendName = $this->backendClass();
 
                $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
@@ -1021,6 +1022,58 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
+       public function testRecursiveClean() {
+               $this->backend = $this->singleBackend;
+               $this->doTestRecursiveClean();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->doTestRecursiveClean();
+               $this->tearDownFiles();
+       }
+
+       function doTestRecursiveClean() {
+               $backendName = $this->backendClass();
+
+               $base = $this->baseStorePath();
+               $dirs = array(
+                       "$base/unittest-cont1/a",
+                       "$base/unittest-cont1/a/b",
+                       "$base/unittest-cont1/a/b/c",
+                       "$base/unittest-cont1/a/b/c/d0",
+                       "$base/unittest-cont1/a/b/c/d1",
+                       "$base/unittest-cont1/a/b/c/d2",
+                       "$base/unittest-cont1/a/b/c/d0/1",
+                       "$base/unittest-cont1/a/b/c/d0/2",
+                       "$base/unittest-cont1/a/b/c/d1/3",
+                       "$base/unittest-cont1/a/b/c/d1/4",
+                       "$base/unittest-cont1/a/b/c/d2/5",
+                       "$base/unittest-cont1/a/b/c/d2/6"
+               );
+               foreach ( $dirs as $dir ) {
+                       $status = $this->prepare( array( 'dir' => $dir ) );
+                       $this->assertEquals( array(), $status->errors,
+                               "Preparing dir $dir succeeded without warnings ($backendName)." );
+               }
+
+               if ( $this->backend instanceof FSFileBackend ) {
+                       foreach ( $dirs as $dir ) {
+                               $this->assertEquals( true, $this->backend->directoryExists( array( 'dir' => $dir ) ),
+                                       "Dir $dir exists ($backendName)." );
+                       }
+               }
+
+               $status = $this->backend->clean(
+                       array( 'dir' => "$base/unittest-cont1", 'recursive' => 1 ) );
+               $this->assertEquals( array(), $status->errors,
+                       "Recursive cleaning of dir $dir succeeded without warnings ($backendName)." );
+
+               foreach ( $dirs as $dir ) {
+                       $this->assertEquals( false, $this->backend->directoryExists( array( 'dir' => $dir ) ),
+                               "Dir $dir no longer exists ($backendName)." );
+               }
+       }
+
        // @TODO: testSecure
 
        public function testDoOperations() {
@@ -1047,7 +1100,7 @@ class FileBackendTest extends MediaWikiTestCase {
                // @TODO: test some cases where the ops should fail
        }
 
-       function doTestDoOperations() {
+       private function doTestDoOperations() {
                $base = $this->baseStorePath();
 
                $fileA = "$base/unittest-cont1/a/b/fileA.txt";
@@ -1064,6 +1117,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->backend->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
                $this->prepare( array( 'dir' => dirname( $fileC ) ) );
                $this->backend->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
+               $this->prepare( array( 'dir' => dirname( $fileD ) ) );
 
                $status = $this->backend->doOperations( array(
                        array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
@@ -1119,7 +1173,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
-       function doTestDoOperationsFailing() {
+       private function doTestDoOperationsFailing() {
                $base = $this->baseStorePath();
 
                $fileA = "$base/unittest-cont2/a/b/fileA.txt";
@@ -1306,6 +1360,26 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
 
+               // Expected listing (top files only)
+               $expected = array(
+                       "test1.txt",
+                       "test2.txt",
+                       "test3.txt",
+                       "test4.txt",
+                       "test5.txt"
+               );
+               sort( $expected );
+
+               // Actual listing (top files only)
+               $list = array();
+               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
+
                foreach ( $files as $file ) { // clean up
                        $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
                }
@@ -1314,6 +1388,240 @@ class FileBackendTest extends MediaWikiTestCase {
                foreach ( $iter as $iter ) {} // no errors
        }
 
+       public function testGetDirectoryList() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetDirectoryList();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetDirectoryList();
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetDirectoryList() {
+               $backendName = $this->backendClass();
+
+               $base = $this->baseStorePath();
+               $files = array(
+                       "$base/unittest-cont1/test1.txt",
+                       "$base/unittest-cont1/test2.txt",
+                       "$base/unittest-cont1/test3.txt",
+                       "$base/unittest-cont1/subdir1/test1.txt",
+                       "$base/unittest-cont1/subdir1/test2.txt",
+                       "$base/unittest-cont1/subdir2/test3.txt",
+                       "$base/unittest-cont1/subdir2/test4.txt",
+                       "$base/unittest-cont1/subdir2/subdir/test1.txt",
+                       "$base/unittest-cont1/subdir3/subdir/test2.txt",
+                       "$base/unittest-cont1/subdir4/subdir/test3.txt",
+                       "$base/unittest-cont1/subdir4/subdir/test4.txt",
+                       "$base/unittest-cont1/subdir4/subdir/test5.txt",
+                       "$base/unittest-cont1/subdir4/subdir/sub/test0.txt",
+                       "$base/unittest-cont1/subdir4/subdir/sub/120-px-file.txt",
+               );
+
+               // Add the files
+               $ops = array();
+               foreach ( $files as $file ) {
+                       $this->prepare( array( 'dir' => dirname( $file ) ) );
+                       $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
+               }
+               $status = $this->backend->doOperations( $ops );
+               $this->assertEquals( array(), $status->errors,
+                       "Creation of files succeeded ($backendName)." );
+               $this->assertEquals( true, $status->isOK(),
+                       "Creation of files succeeded with OK status ($backendName)." );
+
+               // Expected listing
+               $expected = array(
+                       "subdir1",
+                       "subdir2",
+                       "subdir3",
+                       "subdir4",
+               );
+               sort( $expected );
+
+               $this->assertEquals( true,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir1" ) ),
+                       "Directory exists in ($backendName)." );
+               $this->assertEquals( true,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) ),
+                       "Directory exists in ($backendName)." );
+               $this->assertEquals( false,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir2/test1.txt" ) ),
+                       "Directory does not exists in ($backendName)." );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (with trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Expected listing
+               $expected = array(
+                       "subdir",
+               );
+               sort( $expected );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir2" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (with trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir2/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (using iterator second time)
+               $list = array();
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName), second iteration." );
+
+               // Expected listing (recursive)
+               $expected = array(
+                       "subdir1",
+                       "subdir2",
+                       "subdir3",
+                       "subdir4",
+                       "subdir2/subdir",
+                       "subdir3/subdir",
+                       "subdir4/subdir",
+                       "subdir4/subdir/sub",
+               );
+               sort( $expected );
+
+               // Actual listing (recursive)
+               $list = array();
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               // Expected listing (recursive)
+               $expected = array(
+                       "subdir",
+                       "subdir/sub",
+               );
+               sort( $expected );
+
+               // Actual listing (recursive)
+               $list = array();
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir4" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               // Actual listing (recursive, second time)
+               $list = array();
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               foreach ( $files as $file ) { // clean up
+                       $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
+               }
+
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
+               foreach ( $iter as $iter ) {} // no errors
+       }
+
+       public function testLockCalls() {
+               $this->backend = $this->singleBackend;
+               $this->doTestLockCalls();
+       }
+
+       private function doTestLockCalls() {
+               $backendName = $this->backendClass();
+
+               for ( $i=0; $i<50; $i++ ) {
+                       $paths = array(
+                               "test1.txt",
+                               "test2.txt",
+                               "test3.txt",
+                               "subdir1",
+                               "subdir1", // duplicate
+                               "subdir1/test1.txt",
+                               "subdir1/test2.txt",
+                               "subdir2",
+                               "subdir2", // duplicate
+                               "subdir2/test3.txt",
+                               "subdir2/test4.txt",
+                               "subdir2/subdir",
+                               "subdir2/subdir/test1.txt",
+                               "subdir2/subdir/test2.txt",
+                               "subdir2/subdir/test3.txt",
+                               "subdir2/subdir/test4.txt",
+                               "subdir2/subdir/test5.txt",
+                               "subdir2/subdir/sub",
+                               "subdir2/subdir/sub/test0.txt",
+                               "subdir2/subdir/sub/120-px-file.txt",
+                       );
+
+                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_SH );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_EX );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+               }
+       }
+
        // test helper wrapper for backend prepare() function
        private function prepare( array $params ) {
                $this->dirsToPrune[] = $params['dir'];
@@ -1339,7 +1647,8 @@ class FileBackendTest extends MediaWikiTestCase {
                $iter = $this->backend->getFileList( array( 'dir' => "$base/$container" ) );
                if ( $iter ) {
                        foreach ( $iter as $file ) {
-                               $this->backend->delete( array( 'src' => "$base/$container/$file" ), array( 'force' => 1 ) );
+                               $this->backend->delete( array( 'src' => "$base/$container/$file" ),
+                                       array( 'force' => 1, 'nonLocking' => 1 ) );
                        }
                }
        }
index d1221ca..d9b1671 100644 (file)
@@ -510,7 +510,10 @@ class NewParserTest extends MediaWikiTestCase {
                $this->file = $filename;
        }
 
-       /** @dataProvider parserTestProvider */
+       /**
+        * @group medium
+        * @dataProvider parserTestProvider
+        */
        public function testParserTest( $desc, $input, $result, $opts, $config ) {
                if ( $this->regex != '' && !preg_match( '/' . $this->regex . '/', $desc ) ) {
                        $this->assertTrue( true ); // XXX: don't flood output with "test made no assertions"
index c089c31..4239670 100644 (file)
@@ -654,4 +654,141 @@ class LanguageTest extends MediaWikiTestCase {
                        ),
                );
        }
+
+
+
+       /**
+        * @dataProvider provideFormatDuration
+        */
+       function testFormatDuration( $duration, $expected, $intervals = array() ) {
+               $this->assertEquals(
+                       $expected,
+                       $this->lang->formatDuration( $duration, $intervals ),
+                       "formatDuration('$duration'): $expected"
+               );
+       }
+
+       function provideFormatDuration() {
+               return array(
+                       array(
+                               0,
+                               '0 seconds',
+                       ),
+                       array(
+                               1,
+                               '1 second',
+                       ),
+                       array(
+                               2,
+                               '2 seconds',
+                       ),
+                       array(
+                               60,
+                               '1 minute',
+                       ),
+                       array(
+                               2 * 60,
+                               '2 minutes',
+                       ),
+                       array(
+                               3600,
+                               '1 hour',
+                       ),
+                       array(
+                               2 * 3600,
+                               '2 hours',
+                       ),
+                       array(
+                               24 * 3600,
+                               '1 day',
+                       ),
+                       array(
+                               2 * 86400,
+                               '2 days',
+                       ),
+                       array(
+                               365.25 * 86400, // 365.25 * 86400 = 31557600
+                               '1 year',
+                       ),
+                       array(
+                               2 * 31557600,
+                               '2 years',
+                       ),
+                       array(
+                               10 * 31557600,
+                               '1 decade',
+                       ),
+                       array(
+                               20 * 31557600,
+                               '2 decades',
+                       ),
+                       array(
+                               100 * 31557600,
+                               '1 century',
+                       ),
+                       array(
+                               200 * 31557600,
+                               '2 centuries',
+                       ),
+                       array(
+                               1000 * 31557600,
+                               '1 millennium',
+                       ),
+                       array(
+                               2000 * 31557600,
+                               '2 millennia',
+                       ),
+                       array(
+                               9001,
+                               '2 hours, 30 minutes and 1 second'
+                       ),
+                       array(
+                               3601,
+                               '1 hour and 1 second'
+                       ),
+                       array(
+                               31557600 + 2 * 86400 + 9000,
+                               '1 year, 2 days, 2 hours and 30 minutes'
+                       ),
+                       array(
+                               42 * 1000 * 31557600 + 42,
+                               '42 millennia and 42 seconds'
+                       ),
+                       array(
+                               60,
+                               '60 seconds',
+                               array( 'seconds' ),
+                       ),
+                       array(
+                               61,
+                               '61 seconds',
+                               array( 'seconds' ),
+                       ),
+                       array(
+                               1,
+                               '1 second',
+                               array( 'seconds' ),
+                       ),
+                       array(
+                               31557600 + 2 * 86400 + 9000,
+                               '1 year, 2 days and 150 minutes',
+                               array( 'years', 'days', 'minutes' ),
+                       ),
+                       array(
+                               42,
+                               '0 days',
+                               array( 'years', 'days' ),
+                       ),
+                       array(
+                               31557600 + 2 * 86400 + 9000,
+                               '1 year, 2 days and 150 minutes',
+                               array( 'minutes', 'days', 'years' ),
+                       ),
+                       array(
+                               42,
+                               '0 days',
+                               array( 'days', 'years' ),
+                       ),
+               );
+       }
 }
index 2f8c232..fd39c45 100644 (file)
@@ -74,7 +74,7 @@ abstract class DumpTestCase extends MediaWikiTestCase {
         *
         * Clears $wgUser, and reports errors from addDBData to PHPUnit
         */
-       function setUp() {
+       protected function setUp() {
                global $wgUser;
 
                parent::setUp();
@@ -88,6 +88,30 @@ abstract class DumpTestCase extends MediaWikiTestCase {
                $wgUser = new User();
        }
 
+       /**
+        * Checks for test output consisting only of lines containing ETA announcements
+        */
+       function expectETAOutput() {
+               // Newer PHPUnits require assertion about the output using PHPUnit's own
+               // expectOutput[...] functions. However, the PHPUnit shipped prediactes
+               // do not allow to check /each/ line of the output using /readable/ REs.
+               // So we ...
+               //
+               // 1. ... add a dummy output checking to make PHPUnit not complain
+               //    about unchecked test output
+               $this->expectOutputRegex( '//' );
+
+               // 2. Do the real output checking on our own.
+               $lines = explode( "\n", $this->getActualOutput() );
+               $this->assertGreaterThan( 1, count( $lines ), "Minimal lines of produced output" );
+               $this->assertEquals( '', array_pop( $lines ), "Output ends in LF" );
+               $timestamp_re = "[0-9]{4}-[01][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9]";
+               foreach ( $lines as $line ) {
+                       $this->assertRegExp( "/$timestamp_re: .* \(ID [0-9]+\) [0-9]* pages .*, [0-9]* revs .*, ETA/", $line );
+               }
+       }
+
+
        /**
         * Step the current XML reader until node end of given name is found.
         *
diff --git a/tests/phpunit/maintenance/MaintenanceTest.php b/tests/phpunit/maintenance/MaintenanceTest.php
new file mode 100644 (file)
index 0000000..4a6f08f
--- /dev/null
@@ -0,0 +1,812 @@
+<?php
+
+// It would be great if we were able to use PHPUnit's getMockForAbstractClass
+// instead of the MaintenanceFixup hack below. However, we cannot do
+// without changing the visibility and without working around hacks in
+// Maintenance.php
+//
+// For the same reason, we cannot just use FakeMaintenance.
+
+/**
+ * makes parts of the API of Maintenance that is hidden by protected visibily
+ * visible for testing, and makes up for a stream closing hack in Maintenance.php.
+ *
+ * This class is solely used for being able to test Maintenance right now
+ * without having to apply major refactorings to fix some design issues in
+ * Maintenance.php. Before adding more functions here, please consider whether
+ * this approach is correct, or a refactoring Maintenance to separate concers
+ * is more appropriate.
+ *
+ * Upon refactoring, keep in mind that besides the maintenance scrits themselves
+ * and tests right here, also at least Extension:Maintenance make use of
+ * Maintenance.
+ *
+ * Due to a hack in Maintenance.php using register_shutdown_function, be sure to
+ * finally call simulateShutdown on MaintenanceFixup instance before a test
+ * ends.
+ *
+ */
+class MaintenanceFixup extends Maintenance {
+
+       // --- Making up for the register_shutdown_function hack in Maintenance.php
+
+       /**
+        * The test case that generated this instance.
+        *
+        * This member is motivated by allowing the destructor to check whether or not
+        * the test failed, in order to avoid unnecessary nags about omitted shutdown
+        * simulation.
+        * But as it is already available, we also usi it to flagging tests as failed
+        *
+        * @var MediaWikiTestCase
+        */
+       private $testCase;
+
+       /**
+        * shutdownSimulated === true iff simulateShutdown has done it's work
+        *
+        * @var bool
+        */
+       private $shutdownSimulated = false;
+
+       /**
+        * Simulates what Maintenance wants to happen at script's end.
+        */
+       public function simulateShutdown() {
+
+               if ( $this->shutdownSimulated ) {
+                       $this->testCase->fail( __METHOD__ . " called more than once" );
+               }
+
+               // The cleanup action.
+               $this->outputChanneled( false );
+
+               // Bookkeeping that we simulated the clean up.
+               $this->shutdownSimulated = true;
+       }
+
+       // Note that the "public" here does not change visibility
+       public function outputChanneled( $msg, $channel = null ) {
+               if ( $this->shutdownSimulated ) {
+                       if ( $msg !== false ) {
+                               $this->testCase->fail( "Already past simulated shutdown, but msg is "
+                                       . "not false. Did the hack in Maintenance.php change? Please "
+                                       . "adapt the test case or Maintenance.php" );
+                       }
+
+                       // The current call is the one registered via register_shutdown_function.
+                       // We can safely ignore it, as we simulated this one via simulateShutdown
+                       // before (if we did not, the destructor of this instance will warn about
+                       // it)
+                       return;
+               }
+
+               return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
+       }
+
+       /**
+        * Safety net around register_shutdown_function of Maintenance.php
+        */
+       public function __destruct() {
+               if ( ( ! $this->shutdownSimulated ) && ( ! $this->testCase->hasFailed() ) ) {
+                       // Someone generated a MaintenanceFixup instance without calling
+                       // simulateShutdown. We'd have to raise a PHPUnit exception to correctly
+                       // flag this illegal usage. However, we are already in a destruktor, which
+                       // would trigger undefined behaviour. Hence, we can only report to the
+                       // error output :( Hopefully people read the PHPUnit output.
+                       fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " destructed without "
+                               . "calling simulateShutdown method. Call simulateShutdown on the "
+                               . "instance before it gets destructed." );
+               }
+
+               // The following guard is required, as PHP does not offer default destructors :(
+               if ( is_callable( "parent::__destruct" ) ) {
+                       parent::__destruct();
+               }
+       }
+
+       public function __construct( MediaWikiTestCase $testCase ) {
+               parent::__construct();
+               $this->testCase = $testCase;
+       }
+
+
+
+       // --- Making protected functions visible for test
+
+       public function output( $out, $channel = null ) {
+               // Just to make PHP not nag about signature mismatches, we copied
+               // Maintenance::output signature. However, we do not use (or rely on)
+               // those variables. Instead we pass to Maintenance::output whatever we
+               // receive at runtime.
+               return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
+       }
+
+
+
+       // --- Requirements for getting instance of abstract class
+
+       public function execute() {
+               $this->testCase->fail( __METHOD__ . " called unexpectedly" );
+       }
+
+}
+
+class MaintenanceTest extends MediaWikiTestCase {
+
+
+       /**
+        * The main Maintenance instance that is used for testing.
+        *
+        * @var MaintenanceFixup
+        */
+       private $m;
+
+
+       protected function setUp() {
+               parent::setUp();
+               $this->m = new MaintenanceFixup( $this );
+       }
+
+
+       /**
+        * asserts the output before and after simulating shutdown
+        *
+        * This function simulates shutdown of self::m.
+        *
+        * @param $preShutdownOutput string: expected output before simulating shutdown
+        * @param $expectNLAppending bool: Whether or not shutdown simulation is expected
+        *            to add a newline to the output. If false, $preShutdownOutput is the
+        *            expected output after shutdown simulation. Otherwise,
+        *            $preShutdownOutput with an appended newline is the expected output
+        *            after shutdown simulation.
+        */
+       private function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
+
+               $this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
+                               "Output before shutdown simulation" );
+
+               $this->m->simulateShutdown();
+
+               $postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
+               $this->expectOutputString( $postShutdownOutput );
+       }
+
+
+       // Although the following tests do not seem to be too consistent (compare for
+       // example the newlines within the test.*StringString tests, or the
+       // test.*Intermittent.* tests), the objective of these tests is not to describe
+       // consistent behaviour, but rather currently existing behaviour.
+
+
+       function testOutputEmpty() {
+               $this->m->output( "" );
+               $this->assertOutputPrePostShutdown( "", False );
+       }
+
+       function testOutputString() {
+               $this->m->output( "foo" );
+               $this->assertOutputPrePostShutdown( "foo", False );
+       }
+
+       function testOutputStringString() {
+               $this->m->output( "foo" );
+               $this->m->output( "bar" );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputStringNL() {
+               $this->m->output( "foo\n" );
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testOutputStringNLNL() {
+               $this->m->output( "foo\n\n" );
+               $this->assertOutputPrePostShutdown( "foo\n\n", False );
+       }
+
+       function testOutputStringNLString() {
+               $this->m->output( "foo\nbar" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", False );
+       }
+
+       function testOutputStringNLStringNL() {
+               $this->m->output( "foo\nbar\n" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputStringNLStringNLLinewise() {
+               $this->m->output( "foo\n" );
+               $this->m->output( "bar\n" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputStringNLStringNLArbitrary() {
+               $this->m->output( "" );
+               $this->m->output( "foo" );
+               $this->m->output( "" );
+               $this->m->output( "\n" );
+               $this->m->output( "ba" );
+               $this->m->output( "" );
+               $this->m->output( "r\n" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputStringNLStringNLArbitraryAgain() {
+               $this->m->output( "" );
+               $this->m->output( "foo" );
+               $this->m->output( "" );
+               $this->m->output( "\nb" );
+               $this->m->output( "a" );
+               $this->m->output( "" );
+               $this->m->output( "r\n" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWNullChannelEmpty() {
+               $this->m->output( "", null );
+               $this->assertOutputPrePostShutdown( "", False );
+       }
+
+       function testOutputWNullChannelString() {
+               $this->m->output( "foo", null );
+               $this->assertOutputPrePostShutdown( "foo", False );
+       }
+
+       function testOutputWNullChannelStringString() {
+               $this->m->output( "foo", null );
+               $this->m->output( "bar", null );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputWNullChannelStringNL() {
+               $this->m->output( "foo\n", null );
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testOutputWNullChannelStringNLNL() {
+               $this->m->output( "foo\n\n", null );
+               $this->assertOutputPrePostShutdown( "foo\n\n", False );
+       }
+
+       function testOutputWNullChannelStringNLString() {
+               $this->m->output( "foo\nbar", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar", False );
+       }
+
+       function testOutputWNullChannelStringNLStringNL() {
+               $this->m->output( "foo\nbar\n", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWNullChannelStringNLStringNLLinewise() {
+               $this->m->output( "foo\n", null );
+               $this->m->output( "bar\n", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWNullChannelStringNLStringNLArbitrary() {
+               $this->m->output( "", null );
+               $this->m->output( "foo", null );
+               $this->m->output( "", null );
+               $this->m->output( "\n", null );
+               $this->m->output( "ba", null );
+               $this->m->output( "", null );
+               $this->m->output( "r\n", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWNullChannelStringNLStringNLArbitraryAgain() {
+               $this->m->output( "", null );
+               $this->m->output( "foo", null );
+               $this->m->output( "", null );
+               $this->m->output( "\nb", null );
+               $this->m->output( "a", null );
+               $this->m->output( "", null );
+               $this->m->output( "r\n", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWChannelString() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo", True );
+       }
+
+       function testOutputWChannelStringNL() {
+               $this->m->output( "foo\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo", True );
+       }
+
+       function testOutputWChannelStringNLNL() {
+               // If this test fails, note that output takes strings with double line
+               // endings (although output's implementation in this situation calls
+               // outputChanneled with a string ending in a nl ... which is not allowed
+               // according to the documentation of outputChanneled)
+               $this->m->output( "foo\n\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\n", True );
+       }
+
+       function testOutputWChannelStringNLString() {
+               $this->m->output( "foo\nbar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputWChannelStringNLStringNL() {
+               $this->m->output( "foo\nbar\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputWChannelStringNLStringNLLinewise() {
+               $this->m->output( "foo\n", "bazChannel" );
+               $this->m->output( "bar\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputWChannelStringNLStringNLArbitrary() {
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "\n", "bazChannel" );
+               $this->m->output( "ba", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "r\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputWChannelStringNLStringNLArbitraryAgain() {
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "\nb", "bazChannel" );
+               $this->m->output( "a", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "r\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputWMultipleChannelsChannelChange() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "bar", "bazChannel" );
+               $this->m->output( "qux", "quuxChannel" );
+               $this->m->output( "corge", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+       }
+
+       function testOutputWMultipleChannelsChannelChangeNL() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "bar\n", "bazChannel" );
+               $this->m->output( "qux\n", "quuxChannel" );
+               $this->m->output( "corge", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+       }
+
+       function testOutputWAndWOChannelStringStartWO() {
+               $this->m->output( "foo" );
+               $this->m->output( "bar", "bazChannel" );
+               $this->m->output( "qux" );
+               $this->m->output( "quux", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar\nquxquux", True );
+       }
+
+       function testOutputWAndWOChannelStringStartW() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "bar" );
+               $this->m->output( "qux", "bazChannel" );
+               $this->m->output( "quux" );
+               $this->assertOutputPrePostShutdown( "foo\nbarqux\nquux", False );
+       }
+
+       function testOutputWChannelTypeSwitch() {
+               $this->m->output( "foo", 1 );
+               $this->m->output( "bar", 1.0 );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputIntermittentEmpty() {
+               $this->m->output( "foo" );
+               $this->m->output( "" );
+               $this->m->output( "bar" );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputIntermittentFalse() {
+               $this->m->output( "foo" );
+               $this->m->output( false );
+               $this->m->output( "bar" );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputIntermittentFalseAfterOtherChannel() {
+               $this->m->output( "qux", "quuxChannel" );
+               $this->m->output( "foo" );
+               $this->m->output( false );
+               $this->m->output( "bar" );
+               $this->assertOutputPrePostShutdown( "qux\nfoobar", False );
+       }
+
+       function testOutputWNullChannelIntermittentEmpty() {
+               $this->m->output( "foo", null );
+               $this->m->output( "", null );
+               $this->m->output( "bar", null );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputWNullChannelIntermittentFalse() {
+               $this->m->output( "foo", null );
+               $this->m->output( false, null );
+               $this->m->output( "bar", null );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputWChannelIntermittentEmpty() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputWChannelIntermittentFalse() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( false, "bazChannel" );
+               $this->m->output( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       // Note that (per documentation) outputChanneled does take strings that end
+       // in \n, hence we do not test such strings.
+
+       function testOutputChanneledEmpty() {
+               $this->m->outputChanneled( "" );
+               $this->assertOutputPrePostShutdown( "\n", False );
+       }
+
+       function testOutputChanneledString() {
+               $this->m->outputChanneled( "foo" );
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testOutputChanneledStringString() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( "bar" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledStringNLString() {
+               $this->m->outputChanneled( "foo\nbar" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledStringNLStringNLArbitraryAgain() {
+               $this->m->outputChanneled( "" );
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( "" );
+               $this->m->outputChanneled( "\nb" );
+               $this->m->outputChanneled( "a" );
+               $this->m->outputChanneled( "" );
+               $this->m->outputChanneled( "r" );
+               $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", False );
+       }
+
+       function testOutputChanneledWNullChannelEmpty() {
+               $this->m->outputChanneled( "", null );
+               $this->assertOutputPrePostShutdown( "\n", False );
+       }
+
+       function testOutputChanneledWNullChannelString() {
+               $this->m->outputChanneled( "foo", null );
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testOutputChanneledWNullChannelStringString() {
+               $this->m->outputChanneled( "foo", null );
+               $this->m->outputChanneled( "bar", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledWNullChannelStringNLString() {
+               $this->m->outputChanneled( "foo\nbar", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledWNullChannelStringNLStringNLArbitraryAgain() {
+               $this->m->outputChanneled( "", null );
+               $this->m->outputChanneled( "foo", null );
+               $this->m->outputChanneled( "", null );
+               $this->m->outputChanneled( "\nb", null );
+               $this->m->outputChanneled( "a", null );
+               $this->m->outputChanneled( "", null );
+               $this->m->outputChanneled( "r", null );
+               $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", False );
+       }
+
+       function testOutputChanneledWChannelString() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo", True );
+       }
+
+       function testOutputChanneledWChannelStringNLString() {
+               $this->m->outputChanneled( "foo\nbar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputChanneledWChannelStringString() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputChanneledWChannelStringNLStringNLArbitraryAgain() {
+               $this->m->outputChanneled( "", "bazChannel" );
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "", "bazChannel" );
+               $this->m->outputChanneled( "\nb", "bazChannel" );
+               $this->m->outputChanneled( "a", "bazChannel" );
+               $this->m->outputChanneled( "", "bazChannel" );
+               $this->m->outputChanneled( "r", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputChanneledWMultipleChannelsChannelChange() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->m->outputChanneled( "qux", "quuxChannel" );
+               $this->m->outputChanneled( "corge", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+       }
+
+       function testOutputChanneledWMultipleChannelsChannelChangeEnclosedNull() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar", null );
+               $this->m->outputChanneled( "qux", null );
+               $this->m->outputChanneled( "corge", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", True );
+       }
+
+       function testOutputChanneledWMultipleChannelsChannelAfterNullChange() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar", null );
+               $this->m->outputChanneled( "qux", null );
+               $this->m->outputChanneled( "corge", "quuxChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", True );
+       }
+
+       function testOutputChanneledWAndWOChannelStringStartWO() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->m->outputChanneled( "qux" );
+               $this->m->outputChanneled( "quux", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux", True );
+       }
+
+       function testOutputChanneledWAndWOChannelStringStartW() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar" );
+               $this->m->outputChanneled( "qux", "bazChannel" );
+               $this->m->outputChanneled( "quux" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux\n", False );
+       }
+
+       function testOutputChanneledWChannelTypeSwitch() {
+               $this->m->outputChanneled( "foo", 1 );
+               $this->m->outputChanneled( "bar", 1.0 );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputChanneledWOChannelIntermittentEmpty() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( "" );
+               $this->m->outputChanneled( "bar" );
+               $this->assertOutputPrePostShutdown( "foo\n\nbar\n", False );
+       }
+
+       function testOutputChanneledWOChannelIntermittentFalse() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( false );
+               $this->m->outputChanneled( "bar" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledWNullChannelIntermittentEmpty() {
+               $this->m->outputChanneled( "foo", null );
+               $this->m->outputChanneled( "", null );
+               $this->m->outputChanneled( "bar", null );
+               $this->assertOutputPrePostShutdown( "foo\n\nbar\n", False );
+       }
+
+       function testOutputChanneledWNullChannelIntermittentFalse() {
+               $this->m->outputChanneled( "foo", null );
+               $this->m->outputChanneled( false, null );
+               $this->m->outputChanneled( "bar", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledWChannelIntermittentEmpty() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "", "bazChannel" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputChanneledWChannelIntermittentFalse() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( false, "bazChannel" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testCleanupChanneledClean() {
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "", False );
+       }
+
+       function testCleanupChanneledAfterOutput() {
+               $this->m->output( "foo" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo", False );
+       }
+
+       function testCleanupChanneledAfterOutputWNullChannel() {
+               $this->m->output( "foo", null );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo", False );
+       }
+
+       function testCleanupChanneledAfterOutputWChannel() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterNLOutput() {
+               $this->m->output( "foo\n" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterNLOutputWNullChannel() {
+               $this->m->output( "foo\n", null );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterNLOutputWChannel() {
+               $this->m->output( "foo\n", "bazChannel" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterOutputChanneledWOChannel() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterOutputChanneledWNullChannel() {
+               $this->m->outputChanneled( "foo", null );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterOutputChanneledWChannel() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutput() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo" );
+               $m2->output( "bar" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputWNullChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo", null );
+               $m2->output( "bar", null );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputWChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo", "bazChannel" );
+               $m2->output( "bar", "bazChannel" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar\n", True );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputWNullChannelNL() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo\n", null );
+               $m2->output( "bar\n", null );
+
+               $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputWChannelNL() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo\n", "bazChannel" );
+               $m2->output( "bar\n", "bazChannel" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar\n", True );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputChanneled() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->outputChanneled( "foo" );
+               $m2->outputChanneled( "bar" );
+
+               $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputChanneledWNullChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->outputChanneled( "foo", null );
+               $m2->outputChanneled( "bar", null );
+
+               $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputChanneledWChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $m2->outputChanneled( "bar", "bazChannel" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar\n", True );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionCleanupChanneledWChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $m2->outputChanneled( "bar", "bazChannel" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before first cleanup" );
+               $this->m->cleanupChanneled();
+               $this->assertEquals( "foobar\n", $this->getActualOutput(),
+                               "Output after first cleanup" );
+               $m2->cleanupChanneled();
+               $this->assertEquals( "foobar\n\n", $this->getActualOutput(),
+                               "Output after second cleanup" );
+
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar\n\n", False );
+       }
+
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/maintenance/backupPrefetchTest.php b/tests/phpunit/maintenance/backupPrefetchTest.php
new file mode 100644 (file)
index 0000000..9273233
--- /dev/null
@@ -0,0 +1,267 @@
+<?php
+global $IP;
+require_once( "$IP/maintenance/backupPrefetch.inc" );
+
+/**
+ * Tests for BaseDump
+ *
+ * @group Dump
+ */
+class BaseDumpTest extends MediaWikiTestCase {
+
+       /**
+        * @var BaseDump the BaseDump instance used within a test.
+        *
+        * If set, this BaseDump gets automatically closed in tearDown.
+        */
+       private $dump = null;
+
+       protected function tearDown() {
+               parent::tearDown();
+
+               if ( $this->dump !== null ) {
+                       $this->dump->close();
+               }
+       }
+
+       /**
+        * asserts that a prefetch yields an expected string
+        *
+        * @param $expected string|null: the exepcted result of the prefetch
+        * @param $page int: the page number to prefetch the text for
+        * @param $revision int: the revision number to prefetch the text for
+        */
+       private function assertPrefetchEquals( $expected, $page, $revision ) {
+               $this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
+                       "Prefetch of page $page revision $revision" );
+
+       }
+
+       function testSequential() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testSynchronizeRevisionMissToRevision() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 2, 3 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+       }
+
+       function testSynchronizeRevisionMissToPage() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 2, 40 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testSynchronizePageMiss() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 3, 40 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testPageMissAtEnd() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 6, 40 );
+       }
+
+       function testRevisionMissAtEnd() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 4, 40 );
+       }
+
+       function testSynchronizePageMissAtStart() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( null, 0, 2 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+       }
+
+       function testSynchronizeRevisionMissAtStart() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( null, 1, -2 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+       }
+
+       function testSequentialAcrossFiles() {
+               $fname1 = $this->setUpPrefetch( array( 1 ) );
+               $fname2 = $this->setUpPrefetch( array( 2, 4 ) );
+               $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testSynchronizeSkipAcrossFile() {
+               $fname1 = $this->setUpPrefetch( array( 1 ) );
+               $fname2 = $this->setUpPrefetch( array( 2 ) );
+               $fname3 = $this->setUpPrefetch( array( 4 ) );
+               $this->dump = new BaseDump( $fname1 . ";" . $fname2 . ";" . $fname3 );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testSynchronizeMissInWholeFirstFile() {
+               $fname1 = $this->setUpPrefetch( array( 1 ) );
+               $fname2 = $this->setUpPrefetch( array( 2 ) );
+               $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+       }
+
+
+       /**
+        * Constructs a temporary file that can be used for prefetching
+        *
+        * The temporary file is removed by DumpBackup upon tearDown.
+        *
+        * @param $requested_pages Array The indices of the page parts that should
+        *             go into the prefetch file. 1,2,4 are available.
+        * @return String The file name of the created temporary file
+        */
+       private function setUpPrefetch( $requested_pages = array( 1, 2, 4 ) ) {
+               // The file name, where we store the prepared prefetch file
+               $fname = $this->getNewTempFile();
+
+               // The header of every prefetch file
+               $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.6/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.6/ http://www.mediawiki.org/xml/export-0.6.xsd" version="0.6" xml:lang="en">
+  <siteinfo>
+    <sitename>wikisvn</sitename>
+    <base>http://localhost/wiki-svn/index.php/Main_Page</base>
+    <generator>MediaWiki 1.20alpha</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">Media</namespace>
+      <namespace key="-1" case="first-letter">Special</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">Talk</namespace>
+      <namespace key="2" case="first-letter">User</namespace>
+      <namespace key="3" case="first-letter">User talk</namespace>
+      <namespace key="4" case="first-letter">Wikisvn</namespace>
+      <namespace key="5" case="first-letter">Wikisvn talk</namespace>
+      <namespace key="6" case="first-letter">File</namespace>
+      <namespace key="7" case="first-letter">File talk</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template talk</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help talk</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category talk</namespace>
+    </namespaces>
+  </siteinfo>
+';
+
+
+               // An array holding the pages that are available for prefetch
+               $available_pages = array();
+
+               // Simple plain page
+               $available_pages[1] = '  <page>
+    <title>BackupDumperTestP1</title>
+    <ns>0</ns>
+    <id>1</id>
+    <revision>
+      <id>1</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP1Summary1</comment>
+      <text xml:space="preserve">BackupDumperTestP1Text1</text>
+      <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+    </revision>
+  </page>
+';
+               // Page with more than one revisions. Hole in rev ids.
+               $available_pages[2] = '  <page>
+    <title>BackupDumperTestP2</title>
+    <ns>0</ns>
+    <id>2</id>
+    <revision>
+      <id>2</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary1</comment>
+      <text xml:space="preserve">BackupDumperTestP2Text1</text>
+      <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+    </revision>
+    <revision>
+      <id>5</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary4 extra</comment>
+      <text xml:space="preserve">BackupDumperTestP2Text4 some additional Text</text>
+      <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+    </revision>
+  </page>
+';
+               // Page with id higher than previous id + 1
+               $available_pages[4] = '  <page>
+    <title>Talk:BackupDumperTestP1</title>
+    <ns>1</ns>
+    <id>4</id>
+    <revision>
+      <id>8</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>Talk BackupDumperTestP1 Summary1</comment>
+      <text xml:space="preserve">Talk about BackupDumperTestP1 Text1</text>
+      <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+    </revision>
+  </page>
+';
+
+               // The common ending for all files
+               $tail = '</mediawiki>
+';
+
+               // Putting together the content of the prefetch files
+               $content = $header;
+               foreach ( $requested_pages as $i ) {
+                       $this->assertTrue( array_key_exists( $i, $available_pages ),
+                               "Check for availability of requested page " . $i );
+                       $content .= $available_pages[ $i ];
+               }
+               $content .= $tail;
+
+               $this->assertEquals( strlen( $content ), file_put_contents(
+                               $fname, $content ), "Length of prepared prefetch" );
+
+               return $fname;
+       }
+
+}
diff --git a/tests/phpunit/maintenance/backupTextPassTest.php b/tests/phpunit/maintenance/backupTextPassTest.php
new file mode 100644 (file)
index 0000000..0dade60
--- /dev/null
@@ -0,0 +1,558 @@
+<?php
+global $IP;
+require_once( "$IP/maintenance/backup.inc" );
+require_once( "$IP/maintenance/backupTextPass.inc" );
+
+/**
+ * Tests for page dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class TextPassDumperTest extends DumpTestCase {
+
+       // We'll add several pages, revision and texts. The following variables hold the
+       // corresponding ids.
+       private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+       private $revId1_1, $textId1_1;
+       private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
+       private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
+       private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
+       private $revId4_1, $textId4_1;
+
+       function addDBData() {
+               $this->tablesUsed[] = 'page';
+               $this->tablesUsed[] = 'revision';
+               $this->tablesUsed[] = 'text';
+
+               try {
+                       // Simple page
+                       $title = Title::newFromText( 'BackupDumperTestP1' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
+                       $this->pageId1 = $page->getId();
+
+                       // Page with more than one revision
+                       $title = Title::newFromText( 'BackupDumperTestP2' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
+                       list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
+                       list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
+                       list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text4 some additional Text  ",
+                               "BackupDumperTestP2Summary4 extra " );
+                       $this->pageId2 = $page->getId();
+
+                       // Deleted page.
+                       $title = Title::newFromText( 'BackupDumperTestP3' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
+                       list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
+                               "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
+                       $this->pageId3 = $page->getId();
+                       $page->doDeleteArticle( "Testing ;)" );
+
+                       // Page from non-default namespace
+                       $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
+                               "Talk about BackupDumperTestP1 Text1",
+                               "Talk BackupDumperTestP1 Summary1" );
+                       $this->pageId4 = $page->getId();
+               } catch ( Exception $e ) {
+                       // We'd love to pass $e directly. However, ... see
+                       // documentation of exceptionFromAddDBData in
+                       // DumpTestCase
+                       $this->exceptionFromAddDBData = $e;
+               }
+
+       }
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Since we will restrict dumping by page ranges (to allow
+               // working tests, even if the db gets prepopulated by a base
+               // class), we have to assert, that the page id are consecutively
+               // increasing
+               $this->assertEquals(
+                       array( $this->pageId2, $this->pageId3, $this->pageId4 ),
+                       array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
+                       "Page ids increasing without holes" );
+
+       }
+
+       function testPlain() {
+               // Setting up the dump
+               $nameStub = $this->setUpStub();
+               $nameFull = $this->getNewTempFile();
+               $dumper = new TextPassDumper( array ( "--stub=file:" . $nameStub,
+                               "--output=file:" . $nameFull ) );
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+               // Checking for correctness of the dumped data
+               $this->assertDumpStart( $nameFull );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                       "BackupDumperTestP1Text1" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+                       "BackupDumperTestP2Text1" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                       "BackupDumperTestP2Text2" );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                       "BackupDumperTestP2Text3" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+                       "Talk about BackupDumperTestP1 Text1" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+       function testPrefetchPlain() {
+               // The mapping between ids and text, for the hits of the prefetch mock
+               $prefetchMap = array(
+                       array( $this->pageId1, $this->revId1_1, "Prefetch_________1Text1" ),
+                       array( $this->pageId2, $this->revId2_3, "Prefetch_________2Text3" )
+               );
+
+               // The mock itself
+               $prefetchMock = $this->getMock( 'BaseDump', array( 'prefetch' ), array(), '', FALSE );
+               $prefetchMock->expects( $this->exactly( 6 ) )
+                       ->method( 'prefetch' )
+                       ->will( $this->returnValueMap( $prefetchMap ) );
+
+               // Setting up of the dump
+               $nameStub = $this->setUpStub();
+               $nameFull = $this->getNewTempFile();
+               $dumper = new TextPassDumper( array ( "--stub=file:"
+                               . $nameStub, "--output=file:" . $nameFull ) );
+               $dumper->prefetch = $prefetchMock;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+               // Checking for correctness of the dumped data
+               $this->assertDumpStart( $nameFull );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               // Prefetch kicks in. This is still the SHA-1 of the original text,
+               // But the actual text (with different SHA-1) comes from prefetch.
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                       "Prefetch_________1Text1" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+                       "BackupDumperTestP2Text1" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                       "BackupDumperTestP2Text2" );
+               // Prefetch kicks in. This is still the SHA-1 of the original text,
+               // But the actual text (with different SHA-1) comes from prefetch.
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                       "Prefetch_________2Text3" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+                       "Talk about BackupDumperTestP1 Text1" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+
+       }
+
+       /**
+        * Ensures that checkpoint dumps are used and written, by successively increasing the
+        * stub size and dumping until the duration crosses a threshold.
+        *
+        * @param $checkpointFormat string: Either "file" for plain text or "gzip" for gzipped
+        *                checkpoint files.
+        */
+       private function checkpointHelper( $checkpointFormat = "file" ) {
+               // Getting temporary names
+               $nameStub = $this->getNewTempFile();
+               $nameOutputDir = $this->getNewTempDirectory();
+
+               $stderr = fopen( 'php://output', 'a' );
+               if ( $stderr === FALSE ) {
+                       $this->fail( "Could not open stream for stderr" );
+               }
+
+               $iterations = 32; // We'll start with that many iterations of revisions in stub
+               $lastDuration = 0;
+               $minDuration = 2; // We want the dump to take at least this many seconds
+               $checkpointAfter = 0.5; // Generate checkpoint after this many seconds
+
+
+               // Until a dump takes at least $minDuration seconds, perform a dump and check
+               // duration. If the dump did not take long enough increase the iteration
+               // count, to generate a bigger stub file next time.
+               while ( $lastDuration < $minDuration ) {
+
+                       // Setting up the dump
+                       wfRecursiveRemoveDir( $nameOutputDir );
+                       $this->assertTrue( wfMkdirParents( $nameOutputDir ),
+                               "Creating temporary output directory " );
+                       $this->setUpStub( $nameStub, $iterations );
+                       $dumper = new TextPassDumper( array ( "--stub=file:" . $nameStub,
+                                       "--output=" . $checkpointFormat . ":" . $nameOutputDir . "/full",
+                                       "--maxtime=1" /*This is in minutes. Fixup is below*/,
+                                       "--checkpointfile=checkpoint-%s-%s.xml.gz" ) );
+                       $dumper->setDb( $this->db );
+                       $dumper->maxTimeAllowed = $checkpointAfter; // Patching maxTime from 1 minute
+                       $dumper->stderr = $stderr;
+
+                       // The actual dump and taking time
+                       $ts_before = wfTime();
+                       $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+                       $ts_after = wfTime();
+                       $lastDuration = $ts_after - $ts_before;
+
+                       // Handling increasing the iteration count for the stubs
+                       if ( $lastDuration < $minDuration ) {
+                               $old_iterations = $iterations;
+                               if ( $lastDuration > 0.2 ) {
+                                       // lastDuration is big enough, to allow an educated guess
+                                       $factor = ( $minDuration + 0.5 ) / $lastDuration;
+                                       if ( ( $factor > 1.1 ) && ( $factor < 100 ) ) {
+                                               // educated guess is reasonable
+                                               $iterations = (int)( $iterations * $factor );
+                                       }
+                               }
+
+                               if ( $old_iterations == $iterations ) {
+                                       // Heuristics were not applied, so we just *2.
+                                       $iterations *= 2;
+                               }
+
+                               $this->assertLessThan( 50000, $iterations,
+                                       "Emergency stop against infinitely increasing iteration "
+                                       . "count ( last duration: $lastDuration )" );
+                       }
+               }
+
+               // The dump (hopefully) did take long enough to produce more than one
+               // checkpoint file.
+               //
+               // We now check all the checkpoint files for validity.
+
+               $files = scandir( $nameOutputDir );
+               $this->assertTrue( asort( $files ), "Sorting files in temporary directory" );
+               $fileOpened = false;
+               $lookingForPage = 1;
+               $checkpointFiles = 0;
+
+               // Each run of the following loop body tries to handle exactly 1 /page/ (not
+               // iteration of stub content). $i is only increased after having treated page 4.
+               for ( $i = 0 ; $i < $iterations ; ) {
+
+                       // 1. Assuring a file is opened and ready. Skipping across header if
+                       //    necessary.
+                       if ( ! $fileOpened ) {
+                               $this->assertNotEmpty( $files, "No more existing dump files, "
+                                       . "but not yet all pages found" );
+                               $fname = array_shift( $files );
+                               while ( $fname == "." || $fname == ".." ) {
+                                       $this->assertNotEmpty( $files, "No more existing dump"
+                                               . " files, but not yet all pages found" );
+                                       $fname = array_shift( $files );
+                               }
+                               if ( $checkpointFormat == "gzip" ) {
+                                       $this->gunzip( $nameOutputDir . "/" . $fname );
+                               }
+                               $this->assertDumpStart( $nameOutputDir . "/" . $fname );
+                               $fileOpened = true;
+                               $checkpointFiles++;
+                       }
+
+                       // 2. Performing a single page check
+                       switch ( $lookingForPage ) {
+                       case 1:
+                               // Page 1
+                               $this->assertPageStart( $this->pageId1 + $i * 4, NS_MAIN,
+                                       "BackupDumperTestP1" );
+                               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                                       $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                                       "BackupDumperTestP1Text1" );
+                               $this->assertPageEnd();
+
+                               $lookingForPage = 2;
+                               break;
+
+                       case 2:
+                               // Page 2
+                               $this->assertPageStart( $this->pageId2 + $i * 4, NS_MAIN,
+                                       "BackupDumperTestP2" );
+                               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                                       $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+                                       "BackupDumperTestP2Text1" );
+                               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                                       $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                                       "BackupDumperTestP2Text2" );
+                               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                                       $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                                       "BackupDumperTestP2Text3" );
+                               $this->assertRevision( $this->revId2_4,
+                                       "BackupDumperTestP2Summary4 extra",
+                                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                                       "BackupDumperTestP2Text4 some additional Text" );
+                               $this->assertPageEnd();
+
+                               $lookingForPage = 4;
+                               break;
+
+                       case 4:
+                               // Page 4
+                               $this->assertPageStart( $this->pageId4 + $i * 4, NS_TALK,
+                                       "Talk:BackupDumperTestP1" );
+                               $this->assertRevision( $this->revId4_1,
+                                       "Talk BackupDumperTestP1 Summary1",
+                                       $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+                                       "Talk about BackupDumperTestP1 Text1" );
+                               $this->assertPageEnd();
+
+                               $lookingForPage = 1;
+
+                               // We dealt with the whole iteration.
+                               $i++;
+                               break;
+
+                       default:
+                               $this->fail( "Bad setting for lookingForPage ($lookingForPage)" );
+                       }
+
+                       // 3. Checking for the end of the current checkpoint file
+                       if ( $this->xml->nodeType == XMLReader::END_ELEMENT
+                               && $this->xml->name == "mediawiki" ) {
+
+                               $this->assertDumpEnd();
+                               $fileOpened = false;
+                       }
+               }
+
+               // Assuring we completely read all files ...
+               $this->assertFalse( $fileOpened, "Currently read file still open?" );
+               $this->assertEmpty( $files, "Remaining unchecked files" );
+
+               // ... and have dealt with more than one checkpoint file
+               $this->assertGreaterThan( 1, $checkpointFiles, "# of checkpoint files" );
+
+               $this->expectETAOutput();
+       }
+
+       /**
+        * @group large
+        */
+       function testCheckpointPlain() {
+               $this->checkpointHelper();
+       }
+
+       /**
+        * tests for working checkpoint generation in gzip format work.
+        *
+        * We keep this test in addition to the simpler self::testCheckpointPlain, as there
+        * were once problems when the used sinks were DumpPipeOutputs.
+        *
+        * xmldumps-backup typically uses bzip2 instead of gzip. However, as bzip2 requires
+        * PHP extensions, we go for gzip instead, which triggers the same relevant code
+        * paths while still being testable on more systems.
+        *
+        * @group large
+        */
+       function testCheckpointGzip() {
+               $this->checkpointHelper( "gzip" );
+       }
+
+
+       /**
+        * Creates a stub file that is used for testing the text pass of dumps
+        *
+        * @param $fname string: (Optional) Absolute name of the file to write
+        *           the stub into. If this parameter is null, a new temporary
+        *           file is generated that is automatically removed upon
+        *           tearDown.
+        * @param $iterations integer: (Optional) specifies how often the block
+        *           of 3 pages should go into the stub file. The page id
+        *           increase further and further, while the revision and text
+        *           ids of the first iteration are reused. The pages of
+        *           iteration > 1 have no corresponding representation in the
+        *           database.
+        * @return string absolute filename of the stub
+        */
+       private function setUpStub( $fname = null, $iterations = 1 ) {
+               if ( $fname === null ) {
+                       $fname = $this->getNewTempFile();
+               }
+               $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.6/" '
+                       . 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
+                       . 'xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.6/ '
+                       . 'http://www.mediawiki.org/xml/export-0.6.xsd" version="0.6" xml:lang="en">
+  <siteinfo>
+    <sitename>wikisvn</sitename>
+    <base>http://localhost/wiki-svn/index.php/Main_Page</base>
+    <generator>MediaWiki 1.20alpha</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">Media</namespace>
+      <namespace key="-1" case="first-letter">Special</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">Talk</namespace>
+      <namespace key="2" case="first-letter">User</namespace>
+      <namespace key="3" case="first-letter">User talk</namespace>
+      <namespace key="4" case="first-letter">Wikisvn</namespace>
+      <namespace key="5" case="first-letter">Wikisvn talk</namespace>
+      <namespace key="6" case="first-letter">File</namespace>
+      <namespace key="7" case="first-letter">File talk</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template talk</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help talk</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category talk</namespace>
+    </namespaces>
+  </siteinfo>
+';
+               $tail = '</mediawiki>
+';
+
+               $content = $header;
+               $iterations = intval( $iterations );
+               for ( $i = 0; $i < $iterations; $i++ ) {
+
+                       $page1 = '  <page>
+    <title>BackupDumperTestP1</title>
+    <ns>0</ns>
+    <id>' . ( $this->pageId1 + $i * 4 ) . '</id>
+    <revision>
+      <id>' . $this->revId1_1 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP1Summary1</comment>
+      <text id="' . $this->textId1_1 . '" bytes="23" />
+      <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+    </revision>
+  </page>
+';
+                       $page2 = '  <page>
+    <title>BackupDumperTestP2</title>
+    <ns>0</ns>
+    <id>' . ( $this->pageId2 + $i * 4 ) . '</id>
+    <revision>
+      <id>' . $this->revId2_1 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary1</comment>
+      <text id="' . $this->textId2_1 . '" bytes="23" />
+      <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+    </revision>
+    <revision>
+      <id>' . $this->revId2_2 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary2</comment>
+      <text id="' . $this->textId2_2 . '" bytes="23" />
+      <sha1>b7vj5ks32po5m1z1t1br4o7scdwwy95</sha1>
+    </revision>
+    <revision>
+      <id>' . $this->revId2_3 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary3</comment>
+      <text id="' . $this->textId2_3 . '" bytes="23" />
+      <sha1>jfunqmh1ssfb8rs43r19w98k28gg56r</sha1>
+    </revision>
+    <revision>
+      <id>' . $this->revId2_4 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary4 extra</comment>
+      <text id="' . $this->textId2_4 . '" bytes="44" />
+      <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+    </revision>
+  </page>
+';
+                       // page 3 not in stub
+
+                       $page4 = '  <page>
+    <title>Talk:BackupDumperTestP1</title>
+    <ns>1</ns>
+    <id>' . ( $this->pageId4 + $i * 4 ) . '</id>
+    <revision>
+      <id>' . $this->revId4_1 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>Talk BackupDumperTestP1 Summary1</comment>
+      <text id="' . $this->textId4_1 . '" bytes="35" />
+      <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+    </revision>
+  </page>
+';
+                       $content .= $page1 . $page2 . $page4;
+               }
+               $content .= $tail;
+               $this->assertEquals( strlen( $content ), file_put_contents(
+                               $fname, $content ), "Length of prepared stub" );
+               return $fname;
+       }
+
+}
diff --git a/tests/phpunit/maintenance/backup_LogTest.php b/tests/phpunit/maintenance/backup_LogTest.php
new file mode 100644 (file)
index 0000000..8a8dea5
--- /dev/null
@@ -0,0 +1,227 @@
+<?php
+/**
+ * Tests for log dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class BackupDumperLoggerTest extends DumpTestCase {
+
+
+       // We'll add several log entries and users for this test. The following
+       // variables hold the corresponding ids.
+       private $userId1, $userId2;
+       private $logId1, $logId2, $logId3;
+
+       /**
+        * adds a log entry to the database.
+        *
+        * @param $type string: type of the log entry
+        * @param $subtype string: subtype of the log entry
+        * @param $user User: user that performs the logged operation
+        * @param $ns int: number of the namespace for the entry's target's title
+        * @param $title string: title of the entry's target
+        * @param $comment string: comment of the log entry
+        * @param $parameters Array: (optional) accompanying data that is attached
+        *               to the entry
+        *
+        * @return int id of the added log entry
+        */
+       private function addLogEntry( $type, $subtype, User $user, $ns, $title,
+               $comment = null, $parameters = null ) {
+
+                $logEntry = new ManualLogEntry( $type, $subtype );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( Title::newFromText( $title, $ns ) );
+                if ( $comment !== null ) {
+                       $logEntry->setComment( $comment );
+               }
+                if ( $parameters !== null ) {
+                       $logEntry->setParameters( $parameters );
+               }
+                return $logEntry->insert();
+       }
+
+       function addDBData() {
+               $this->tablesUsed[] = 'logging';
+               $this->tablesUsed[] = 'user';
+
+               try {
+                       $user1 = User::newFromName( 'BackupDumperLogUserA' );
+                       $this->userId1 = $user1->getId();
+                       if ( $this->userId1 === 0 ) {
+                               $user1->addToDatabase();
+                               $this->userId1 = $user1->getId();
+                       }
+                       $this->assertGreaterThan( 0, $this->userId1 );
+
+                       $user2 = User::newFromName( 'BackupDumperLogUserB' );
+                       $this->userId2 = $user2->getId();
+                       if ( $this->userId2 === 0 ) {
+                               $user2->addToDatabase();
+                               $this->userId2 = $user2->getId();
+                       }
+                       $this->assertGreaterThan( 0, $this->userId2 );
+
+                       $this->logId1 = $this->addLogEntry( 'type', 'subtype',
+                               $user1, NS_MAIN, "PageA" );
+                       $this->assertGreaterThan( 0, $this->logId1 );
+
+                       $this->logId2 = $this->addLogEntry( 'supress', 'delete',
+                               $user2, NS_TALK, "PageB", "SomeComment" );
+                       $this->assertGreaterThan( 0, $this->logId2 );
+
+                       $this->logId3 = $this->addLogEntry( 'move', 'delete',
+                               $user2, NS_MAIN, "PageA", "SomeOtherComment",
+                               array( 'key1' => 1,  3 => 'value3' ) );
+                       $this->assertGreaterThan( 0, $this->logId3 );
+
+               } catch ( Exception $e ) {
+                       // We'd love to pass $e directly. However, ... see
+                       // documentation of exceptionFromAddDBData in
+                       // DumpTestCase
+                       $this->exceptionFromAddDBData = $e;
+               }
+
+       }
+
+
+       /**
+        * asserts that the xml reader is at the beginning of a log entry and skips over
+        * it while analyzing it.
+        *
+        * @param $id int: id of the log entry
+        * @param $user_name string: user name of the log entry's performer
+        * @param $user_id int: user id of the log entry 's performer
+        * @param $comment string|null: comment of the log entry. If null, the comment
+        *             text is ignored.
+        * @param $type string: type of the log entry
+        * @param $subtype string: subtype of the log entry
+        * @param $title string: title of the log entry's target
+        * @param $parameters array: (optional) unserialized data accompanying the log entry
+        */
+       private function assertLogItem( $id, $user_name, $user_id, $comment, $type,
+               $subtype, $title, $parameters = array() ) {
+
+               $this->assertNodeStart( "logitem" );
+               $this->skipWhitespace();
+
+               $this->assertTextNode( "id", $id );
+               $this->assertTextNode( "timestamp", false );
+
+               $this->assertNodeStart( "contributor" );
+               $this->skipWhitespace();
+               $this->assertTextNode( "username", $user_name );
+               $this->assertTextNode( "id", $user_id );
+               $this->assertNodeEnd( "contributor" );
+               $this->skipWhitespace();
+
+               if ( $comment !== null ) {
+                       $this->assertTextNode( "comment", $comment );
+               }
+               $this->assertTextNode( "type", $type );
+               $this->assertTextNode( "action", $subtype );
+               $this->assertTextNode( "logtitle", $title );
+
+               $this->assertNodeStart( "params" );
+               $parameters_xml = unserialize( $this->xml->value );
+               $this->assertEquals( $parameters, $parameters_xml );
+               $this->assertTrue( $this->xml->read(), "Skipping past processed text of params" );
+               $this->assertNodeEnd( "params" );
+               $this->skipWhitespace();
+
+               $this->assertNodeEnd( "logitem" );
+               $this->skipWhitespace();
+       }
+
+       function testPlain () {
+               global $wgContLang;
+
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+               $dumper->startId = $this->logId1;
+               $dumper->endId = $this->logId3 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::LOGS, WikiExporter::TEXT );
+
+               // Analyzing the dumped data
+               $this->assertDumpStart( $fname );
+
+               $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
+                       $this->userId1, null, "type", "subtype", "PageA" );
+
+               $this->assertNotNull( $wgContLang, "Content language object validation" );
+               $namespace = $wgContLang->getNsText( NS_TALK );
+               $this->assertInternalType( 'string', $namespace );
+               $this->assertGreaterThan( 0, strlen( $namespace ) );
+               $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
+                       $this->userId2, "SomeComment", "supress", "delete",
+                       $namespace . ":PageB" );
+
+               $this->assertLogItem( $this->logId3, "BackupDumperLogUserB",
+                       $this->userId2, "SomeOtherComment", "move", "delete",
+                       "PageA", array( 'key1' => 1, 3 => 'value3' ) );
+
+               $this->assertDumpEnd();
+       }
+
+       function testXmlDumpsBackupUseCaseLogging() {
+               global $wgContLang;
+
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=gzip:" . $fname,
+                               "--reporting=2" ) );
+               $dumper->startId = $this->logId1;
+               $dumper->endId = $this->logId3 + 1;
+               $dumper->setDb( $this->db );
+
+               // xmldumps-backup demands reporting, although this is currently not
+               // implemented in BackupDumper, when dumping logging data. We
+               // nevertheless capture the output of the dump process already now,
+               // to be able to alert (once dumping produces reports) that this test
+               // needs updates.
+               $dumper->stderr = fopen( 'php://output', 'a' );
+               if ( $dumper->stderr === FALSE ) {
+                       $this->fail( "Could not open stream for stderr" );
+               }
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::LOGS, WikiExporter::TEXT );
+
+               $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
+
+               // Analyzing the dumped data
+               $this->gunzip( $fname );
+
+               $this->assertDumpStart( $fname );
+
+               $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
+                       $this->userId1, null, "type", "subtype", "PageA" );
+
+               $this->assertNotNull( $wgContLang, "Content language object validation" );
+               $namespace = $wgContLang->getNsText( NS_TALK );
+               $this->assertInternalType( 'string', $namespace );
+               $this->assertGreaterThan( 0, strlen( $namespace ) );
+               $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
+                       $this->userId2, "SomeComment", "supress", "delete",
+                       $namespace . ":PageB" );
+
+               $this->assertLogItem( $this->logId3, "BackupDumperLogUserB",
+                       $this->userId2, "SomeOtherComment", "move", "delete",
+                       "PageA", array( 'key1' => 1, 3 => 'value3' ) );
+
+               $this->assertDumpEnd();
+
+               // Currently, no reporting is implemented. Alert via failure, once
+               // this changes.
+               // If reporting for log dumps has been implemented, please update
+               // the following statement to catch good output
+               $this->expectOutputString( '' );
+       }
+
+}
diff --git a/tests/phpunit/maintenance/backup_PageTest.php b/tests/phpunit/maintenance/backup_PageTest.php
new file mode 100644 (file)
index 0000000..205700e
--- /dev/null
@@ -0,0 +1,389 @@
+<?php
+/**
+ * Tests for page dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class BackupDumperPageTest extends DumpTestCase {
+
+       // We'll add several pages, revision and texts. The following variables hold the
+       // corresponding ids.
+       private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+       private $revId1_1, $textId1_1;
+       private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
+       private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
+       private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
+       private $revId4_1, $textId4_1;
+
+       function addDBData() {
+               $this->tablesUsed[] = 'page';
+               $this->tablesUsed[] = 'revision';
+               $this->tablesUsed[] = 'text';
+
+               try {
+                       $title = Title::newFromText( 'BackupDumperTestP1' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
+                       $this->pageId1 = $page->getId();
+
+                       $title = Title::newFromText( 'BackupDumperTestP2' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
+                       list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
+                       list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
+                       list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text4 some additional Text  ",
+                               "BackupDumperTestP2Summary4 extra " );
+                       $this->pageId2 = $page->getId();
+
+                       $title = Title::newFromText( 'BackupDumperTestP3' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
+                       list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
+                               "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
+                       $this->pageId3 = $page->getId();
+                       $page->doDeleteArticle( "Testing ;)" );
+
+                       $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
+                               "Talk about BackupDumperTestP1 Text1",
+                               "Talk BackupDumperTestP1 Summary1" );
+                       $this->pageId4 = $page->getId();
+               } catch ( Exception $e ) {
+                       // We'd love to pass $e directly. However, ... see
+                       // documentation of exceptionFromAddDBData in
+                       // DumpTestCase
+                       $this->exceptionFromAddDBData = $e;
+               }
+
+       }
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Since we will restrict dumping by page ranges (to allow
+               // working tests, even if the db gets prepopulated by a base
+               // class), we have to assert, that the page id are consecutively
+               // increasing
+               $this->assertEquals(
+                       array( $this->pageId2, $this->pageId3, $this->pageId4 ),
+                       array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
+                       "Page ids increasing without holes" );
+
+       }
+
+       function testFullTextPlain () {
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+               // Checking the dumped data
+               $this->assertDumpStart( $fname );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                       "BackupDumperTestP1Text1" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
+                       "BackupDumperTestP2Text1" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                       "BackupDumperTestP2Text2" );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                       "BackupDumperTestP2Text3" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+                       "Talk about BackupDumperTestP1 Text1" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+       function testFullStubPlain () {
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
+
+               // Checking the dumped data
+               $this->assertDumpStart( $fname );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95" );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+       function testCurrentStubPlain () {
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
+
+               // Checking the dumped data
+               $this->assertDumpStart( $fname );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+       function testCurrentStubGzip () {
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=gzip:" . $fname ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
+
+               // Checking the dumped data
+               $this->gunzip( $fname );
+               $this->assertDumpStart( $fname );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+
+
+       function testXmlDumpsBackupUseCase () {
+               // xmldumps-backup typically performs a single dump that that writes
+               // out three files
+               // * gzipped stubs of everything (meta-history)
+               // * gzipped stubs of latest revisions of all pages (meta-current)
+               // * gzipped stubs of latest revisions of all pages of namespage 0
+               //   (articles)
+               //
+               // We reproduce such a setup with our mini fixture, although we omit
+               // chunks, and all the other gimmicks of xmldumps-backup.
+               //
+               $fnameMetaHistory = $this->getNewTempFile();
+               $fnameMetaCurrent = $this->getNewTempFile();
+               $fnameArticles = $this->getNewTempFile();
+
+               $dumper = new BackupDumper( array ( "--output=gzip:" . $fnameMetaHistory,
+                               "--output=gzip:" . $fnameMetaCurrent, "--filter=latest",
+                               "--output=gzip:" . $fnameArticles, "--filter=latest",
+                               "--filter=notalk", "--filter=namespace:!NS_USER",
+                               "--reporting=1000" ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->setDb( $this->db );
+
+               // xmldumps-backup uses reporting. We will not check the exact reported
+               // message, as they are dependent on the processing power of the used
+               // computer. We only check that reporting does not crash the dumping
+               // and that something is reported
+               $dumper->stderr = fopen( 'php://output', 'a' );
+               if ( $dumper->stderr === FALSE ) {
+                       $this->fail( "Could not open stream for stderr" );
+               }
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
+
+               $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
+
+               // Checking meta-history -------------------------------------------------
+
+               $this->gunzip( $fnameMetaHistory );
+               $this->assertDumpStart( $fnameMetaHistory );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95" );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+
+               // Checking meta-current -------------------------------------------------
+
+               $this->gunzip( $fnameMetaCurrent );
+               $this->assertDumpStart( $fnameMetaCurrent );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+
+               // Checking articles -------------------------------------------------
+
+               $this->gunzip( $fnameArticles );
+               $this->assertDumpStart( $fnameArticles );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               // -> Page is not in NS_MAIN. Hence not visible
+
+               $this->assertDumpEnd();
+
+               $this->expectETAOutput();
+       }
+
+
+
+}
diff --git a/tests/phpunit/maintenance/fetchTextTest.php b/tests/phpunit/maintenance/fetchTextTest.php
new file mode 100644 (file)
index 0000000..42a247c
--- /dev/null
@@ -0,0 +1,244 @@
+<?php
+global $IP;
+require_once( "$IP/maintenance/fetchText.php" );
+
+
+/**
+ * Mock for the input/output of FetchText
+ *
+ * FetchText internally tries to access stdin and stdout. We mock those aspects
+ * for testing.
+ */
+class SemiMockedFetchText extends FetchText {
+
+       /**
+        * @var String|null Text to pass as stdin
+        */
+       private $mockStdinText = null;
+
+       /**
+        * @var bool Whether or not a text for stdin has been provided
+        */
+       private $mockSetUp = False;
+
+       /**
+        * @var Array Invocation counters for the mocked aspects
+        */
+       private $mockInvocations = array( 'getStdin' => 0 );
+
+
+
+       /**
+        * Data for the fake stdin
+        *
+        * @param $stdin String The string to be used instead of stdin
+        */
+       function mockStdin( $stdin )
+       {
+               $this->mockStdinText = $stdin;
+               $this->mockSetUp = True;
+       }
+
+       /**
+        * Gets invocation counters for mocked methods.
+        *
+        * @return Array An array, whose keys are function names. The corresponding values
+        * denote the number of times the function has been invoked.
+        */
+       function mockGetInvocations()
+       {
+               return $this->mockInvocations;
+       }
+
+       // -----------------------------------------------------------------
+       // Mocked functions from FetchText follow.
+
+       function getStdin( $len = null )
+       {
+               $this->mockInvocations['getStdin']++;
+               if ( $len !== null ) {
+                       throw new PHPUnit_Framework_ExpectationFailedException(
+                               "Tried to get stdin with non null parameter" );
+               }
+
+               if ( ! $this->mockSetUp ) {
+                       throw new PHPUnit_Framework_ExpectationFailedException(
+                               "Tried to get stdin before setting up rerouting" );
+               }
+
+               return fopen( 'data://text/plain,' . $this->mockStdinText, 'r' );
+       }
+
+}
+
+/**
+ * TestCase for FetchText
+ *
+ * @group Database
+ * @group Dump
+ */
+class FetchTextTest extends MediaWikiTestCase {
+
+       // We add 5 Revisions for this test. Their corresponding text id's
+       // are stored in the following 5 variables.
+       private $textId1;
+       private $textId2;
+       private $textId3;
+       private $textId4;
+       private $textId5;
+
+
+       /**
+        * @var Exception|null As the current MediaWikiTestCase::run is not
+        * robust enough to recover from thrown exceptions directly, we cannot
+        * throw frow within addDBData, although it would be appropriate. Hence,
+        * we catch the exception and store it until we are in setUp and may
+        * finally rethrow the exception without crashing the test suite.
+        */
+       private $exceptionFromAddDBData;
+
+       /**
+        * @var FetchText the (mocked) FetchText that is to test
+        */
+       private $fetchText;
+
+       /**
+        * Adds a revision to a page, while returning the resuting text's id
+        *
+        * @param $page WikiPage The page to add the revision to
+        * @param $text String The revisions text
+        * @param $text String The revisions summare
+        *
+        * @throws MWExcepion
+        */
+       private function addRevision( $page, $text, $summary ) {
+               $status = $page->doEdit( $text, $summary );
+               if ( $status->isGood() ) {
+                       $value = $status->getValue();
+                       $revision = $value['revision'];
+                       $id = $revision->getTextId();
+                       if ( $id > 0 ) {
+                               return $id;
+                       }
+               }
+               throw new MWException( "Could not determine text id" );
+       }
+
+
+       function addDBData() {
+               $this->tablesUsed[] = 'page';
+               $this->tablesUsed[] = 'revision';
+               $this->tablesUsed[] = 'text';
+
+               try {
+                       $title = Title::newFromText( 'FetchTextTestPage1' );
+                       $page = WikiPage::factory( $title );
+                       $this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
+
+                       $title = Title::newFromText( 'FetchTextTestPage2' );
+                       $page = WikiPage::factory( $title );
+                       $this->textId2 = $this->addRevision( $page, "FetchTextTestPage2Text1", "FetchTextTestPage2Summary1" );
+                       $this->textId3 = $this->addRevision( $page, "FetchTextTestPage2Text2", "FetchTextTestPage2Summary2" );
+                       $this->textId4 = $this->addRevision( $page, "FetchTextTestPage2Text3", "FetchTextTestPage2Summary3" );
+                       $this->textId5 = $this->addRevision( $page, "FetchTextTestPage2Text4 some additional Text  ", "FetchTextTestPage2Summary4 extra " );
+               } catch ( Exception $e ) {
+                       // We'd love to pass $e directly. However, ... see
+                       // documentation of exceptionFromAddDBData
+                       $this->exceptionFromAddDBData = $e;
+               }
+       }
+
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Check if any Exception is stored for rethrowing from addDBData
+               if ( $this->exceptionFromAddDBData !== null ) {
+                       throw $this->exceptionFromAddDBData;
+               }
+
+               $this->fetchText = new SemiMockedFetchText();
+       }
+
+
+       /**
+        * Helper to relate FetchText's input and output
+        */
+       private function assertFilter( $input, $expectedOutput ) {
+               $this->fetchText->mockStdin( $input );
+               $this->fetchText->execute();
+               $invocations = $this->fetchText->mockGetInvocations();
+               $this->assertEquals( 1, $invocations['getStdin'],
+                       "getStdin invocation counter" );
+               $this->expectOutputString( $expectedOutput );
+       }
+
+
+
+       // Instead of the following functions, a data provider would be great.
+       // However, as data providers are evaluated /before/ addDBData, a data
+       // provider would not know the required ids.
+
+       function testExistingSimple() {
+               $this->assertFilter( $this->textId2,
+                       $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+       }
+
+       function testExistingSimpleWithNewline() {
+               $this->assertFilter( $this->textId2 . "\n",
+                       $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+       }
+
+       function testExistingSeveral() {
+               $this->assertFilter( "$this->textId1\n$this->textId5\n"
+                       . "$this->textId3\n$this->textId3",
+                       implode( "", array(
+                                       $this->textId1 . "\n23\nFetchTextTestPage1Text1",
+                                       $this->textId5 . "\n44\nFetchTextTestPage2Text4 "
+                                       . "some additional Text",
+                                       $this->textId3 . "\n23\nFetchTextTestPage2Text2",
+                                       $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+                               ) ) );
+       }
+
+       function testEmpty() {
+               $this->assertFilter( "", null );
+       }
+
+       function testNonExisting() {
+               $this->assertFilter( $this->textId5 + 10, ( $this->textId5 + 10 ) . "\n-1\n" );
+       }
+
+       function testNegativeInteger() {
+               $this->assertFilter( "-42", "-42\n-1\n" );
+       }
+
+       function testFloatingPointNumberExisting() {
+               // float -> int -> revision
+               $this->assertFilter( $this->textId3 + 0.14159,
+                       $this->textId3 . "\n23\nFetchTextTestPage2Text2" );
+       }
+
+       function testFloatingPointNumberNonExisting() {
+               $this->assertFilter( $this->textId5 + 3.14159,
+                       ( $this->textId5 + 3 ) . "\n-1\n" );
+       }
+
+       function testCharacters() {
+               $this->assertFilter( "abc", "0\n-1\n" );
+       }
+
+       function testMix() {
+               $this->assertFilter( "ab\n" . $this->textId4 . ".5cd\n\nefg\n" . $this->textId2
+                       . "\n" . $this->textId3,
+                       implode( "", array(
+                                       "0\n-1\n",
+                                       $this->textId4 . "\n23\nFetchTextTestPage2Text3",
+                                       "0\n-1\n",
+                                       "0\n-1\n",
+                                       $this->textId2 . "\n23\nFetchTextTestPage2Text1",
+                                       $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+                               ) ) );
+       }
+
+}
diff --git a/tests/phpunit/maintenance/getSlaveServerTest.php b/tests/phpunit/maintenance/getSlaveServerTest.php
new file mode 100644 (file)
index 0000000..29e7fe6
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+global $IP;
+require_once( "$IP/maintenance/getSlaveServer.php" );
+
+/**
+ * Tests for getSlaveServer
+ *
+ * @group Database
+ */
+class GetSlaveServerTest extends MediaWikiTestCase {
+
+       /**
+        * Yields a regular expression that matches a good DB server name
+        *
+        * It matches IPs or hostnames, both optionally followed by a
+        * port specification
+        *
+        * @return String the regular expression
+        */
+       private function getServerRE() {
+               if ( $this->db->getType() === 'sqlite' ) {
+                       // for SQLite, only the empty string is a good server name
+                       return '';
+               }
+
+               $octet = '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])';
+               $ip = "(($octet\.){3}$octet)";
+
+               $label = '([a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)';
+               $hostname = "($label(\.$label)*)";
+
+               return "($ip|$hostname)(:[0-9]{1,5})?";
+       }
+
+       function testPlain() {
+               $gss = new GetSlaveServer();
+               $gss->execute();
+
+               $this->expectOutputRegex( "/^" . self::getServerRE() . "\n$/D" );
+       }
+
+       function testXmlDumpsBackupUseCase() {
+               global $wgDBprefix;
+
+               global $argv;
+               $argv = array( null, "--globals" );
+
+               $gss = new GetSlaveServer();
+               $gss->loadParamsAndArgs();
+               $gss->execute();
+               $gss->globals();
+
+               // The main answer
+               $output = $this->getActualOutput();
+               $firstLineEndPos = strpos( $output,"\n");
+               if ( $firstLineEndPos === FALSE ) {
+                       $this->fail( "Could not find end of first line of output" );
+               }
+               $firstLine = substr( $output, 0 , $firstLineEndPos );
+               $this->assertRegExp( "/^" . self::getServerRE() . "$/D",
+                       $firstLine, "DB Server" );
+
+               // xmldumps-backup relies on the wgDBprefix in the output.
+               $this->expectOutputRegex( "/^[[:space:]]*\[wgDBprefix\][[:space:]]*=> "
+                       . $wgDBprefix . "$/m" );
+       }
+
+
+}
index d18b33b..61a20f1 100755 (executable)
@@ -18,6 +18,16 @@ define( 'MW_PHPUNIT_TEST', true );
 require_once( "$IP/maintenance/Maintenance.php" );
 
 class PHPUnitMaintClass extends Maintenance {
+
+       function __construct() {
+               parent::__construct();
+               $this->addOption( 'with-phpunitdir'
+                       , 'Directory to include PHPUnit from, for example when using a git fetchout from upstream. Path will be prepended to PHP `include_path`.'
+                       , false # not required
+                       , true  # need arg
+               );
+       }
+
        public function finalSetup() {
                parent::finalSetup();
 
@@ -37,7 +47,42 @@ class PHPUnitMaintClass extends Maintenance {
 
                $wgLocalisationCacheConf['storeClass'] =  'LCStore_Null';
        }
-       public function execute() { }
+
+       public function execute() {
+               global $IP;
+
+               # Make sure we have --configuration or PHPUnit might complain
+               if( !in_array( '--configuration', $_SERVER['argv'] ) ) {
+                       //Hack to eliminate the need to use the Makefile (which sucks ATM)
+                       array_splice( $_SERVER['argv'], 1, 0,
+                               array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
+               }
+
+               # --with-phpunitdir let us override the default PHPUnit version
+               if( $phpunitDir = $this->getOption( 'with-phpunitdir' ) ) {
+                       # Sanity checks
+                       if( !is_dir($phpunitDir) ) {
+                               $this->error( "--with-phpunitdir should be set to an existing directory", 1 );
+                       }
+                       if( !is_readable( $phpunitDir."/PHPUnit/Runner/Version.php" ) ) {
+                               $this->error( "No usable PHPUnit installation in $phpunitDir.\nAborting.\n", 1 );
+                       }
+
+                       # Now prepends provided PHPUnit directory
+                       $this->output( "Will attempt loading PHPUnit from `$phpunitDir`\n" );
+                       set_include_path( $phpunitDir
+                               . PATH_SEPARATOR . get_include_path() );
+
+                       # Cleanup $args array so the option and its value do not
+                       # pollute PHPUnit
+                       $key = array_search( '--with-phpunitdir', $_SERVER['argv'] );
+                       unset( $_SERVER['argv'][$key]   ); // the option
+                       unset( $_SERVER['argv'][$key+1] ); // its value
+                       $_SERVER['argv'] = array_values( $_SERVER['argv'] );
+
+               }
+       }
+
        public function getDbType() {
                return Maintenance::DB_ADMIN;
        }
@@ -46,18 +91,13 @@ class PHPUnitMaintClass extends Maintenance {
 $maintClass = 'PHPUnitMaintClass';
 require( RUN_MAINTENANCE_IF_MAIN );
 
-if( !in_array( '--configuration', $_SERVER['argv'] ) ) {
-       //Hack to eliminate the need to use the Makefile (which sucks ATM)
-       array_splice( $_SERVER['argv'], 1, 0,
-               array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
-}
-
 require_once( 'PHPUnit/Runner/Version.php' );
-if( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '<' ) ) {
-       die( 'PHPUnit 3.5 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
+
+if( PHPUnit_Runner_Version::id() !== '@package_version@'
+   && version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' ) ) {
+       die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
 }
 require_once( 'PHPUnit/Autoload.php' );
 
 require_once( "$IP/tests/TestsAutoLoader.php" );
 MediaWikiPHPUnitCommand::main();
-
index a1b47ca..093c71f 100644 (file)
@@ -42,10 +42,14 @@ $params = array_map( 'cssfilter', $_GET );
 $selector = isset( $params['selector'] ) ? $params['selector'] : '.mw-test-example';
 $property = isset( $params['prop'] ) ? $params['prop'] : 'float';
 $value = isset( $params['val'] ) ? $params['val'] : 'right';
+$wait = isset( $params['wait'] ) ? (int)$params['wait'] : 0; // seconds
+
+sleep( $wait );
 
 $css =  "
 /**
- * Generated: " . gmdate( 'r' ) .  "
+ * Generated " . gmdate( 'r' ) .  ".
+ * Waited {$wait}s.
  */
 
 $selector {
index fcdcd21..552e69e 100644 (file)
 module( 'mediawiki.Uri', QUnit.newMwEnvironment() );
 
-test( '-- Initial check', function() {
+test( '-- Initial check', function () {
+       expect( 2 );
+
+       // Ensure we have a generic URI parser if not running in a browser
+       if ( !mw.Uri ) {
+               mw.Uri = mw.UriRelative( 'http://example.com/' );
+       }
+
+       ok( mw.UriRelative, 'mw.UriRelative defined' );
+       ok( mw.Uri, 'mw.Uri defined' );
+} );
+
+$.each( [true, false], function ( i, strictMode ) {
+       test( 'Basic mw.Uri object test in ' + ( strictMode ? '' : 'non-' ) + 'strict mode for a simple HTTP URI', function () {
+               var uriString, uri;
+               expect( 2 );
+
+               uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
+               uri = new mw.Uri( uriString, {
+                       strictMode: strictMode
+               });
+
+               deepEqual(
+                       {
+                               protocol: uri.protocol,
+                               host: uri.host,
+                               port: uri.port,
+                               path: uri.path,
+                               query: uri.query,
+                               fragment: uri.fragment
+                       }, {
+                               protocol: 'http',
+                               host: 'www.ietf.org',
+                               port: undefined,
+                               path: '/rfc/rfc2396.txt',
+                               query: {},
+                               fragment: undefined
+                       },
+                       'basic object properties'
+               );
+
+               deepEqual(
+                       {
+                               userInfo: uri.getUserInfo(),
+                               authority: uri.getAuthority(),
+                               hostPort: uri.getHostPort(),
+                               queryString: uri.getQueryString(),
+                               relativePath: uri.getRelativePath(),
+                               toString: uri.toString()
+                       },
+                       {
+                               userInfo: '',
+                               authority: 'www.ietf.org',
+                               hostPort: 'www.ietf.org',
+                               queryString: '',
+                               relativePath: '/rfc/rfc2396.txt',
+                               toString: uriString
+                       },
+                       'construct composite components of URI on request'
+               );
+
+       });
+});
+
+test( 'Parse an ftp URI correctly with user and password', function () {
+       var uri;
        expect( 1 );
 
-       ok( mw.UriRelative, 'mw.Uri defined' );
+       uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
+
+       deepEqual(
+               {
+                       protocol: uri.protocol,
+                       user: uri.user,
+                       password: uri.password,
+                       host: uri.host,
+                       port: uri.port,
+                       path: uri.path,
+                       query: uri.query,
+                       fragment: uri.fragment
+               },
+               {
+                       protocol: 'ftp',
+                       user: 'usr',
+                       password: 'pwd',
+                       host: '192.0.2.16',
+                       port: undefined,
+                       path: '/',
+                       query: {},
+                       fragment: undefined
+               },
+               'basic object properties'
+       );
+} );
+
+test( 'Parse a uri with simple querystring', function () {
+       var uri;
+       expect( 1 );
+
+       uri = new mw.Uri( 'http://www.google.com/?q=uri' );
+
+       deepEqual(
+               {
+                       protocol: uri.protocol,
+                       host: uri.host,
+                       port: uri.port,
+                       path: uri.path,
+                       query: uri.query,
+                       fragment: uri.fragment,
+                       queryString: uri.getQueryString()
+               },
+               {
+                       protocol: 'http',
+                       host: 'www.google.com',
+                       port: undefined,
+                       path: '/',
+                       query: { q: 'uri' },
+                       fragment: undefined,
+                       queryString: 'q=uri'
+               },
+               'basic object properties'
+       );
+} );
+
+test( 'Handle multiple query parameter (overrideKeys on)', function () {
+       var uri;
+       expect( 5 );
+
+       uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
+               overrideKeys: true
+       });
+
+       equal( uri.query.n, '1', 'multiple parameters are parsed' );
+       equal( uri.query.m, 'bar', 'last key overrides earlier keys' );
+
+       uri.query.n = [ 'x', 'y', 'z' ];
+
+       // Verify parts and total length instead of entire string because order
+       // of iteration can vary.
+       ok( uri.toString().indexOf( 'm=bar' ), 'toString preserves other values' );
+       ok( uri.toString().indexOf( 'n=x&n=y&n=z' ), 'toString parameter includes all values of an array query parameter' );
+       equal( uri.toString().length, 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
 } );
 
-test( 'mw.Uri bug 35658', function() {
+test( 'Handle multiple query parameter (overrideKeys off)', function () {
+       var uri;
+       expect( 9 );
+
+       uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
+               overrideKeys: false
+       });
+
+       // Strict comparison so that types are also verified (n should be string '1')
+       strictEqual( uri.query.m.length, 2, 'multi-value query should be an array with 2 items' );
+       strictEqual( uri.query.m[0], 'foo', 'order and value is correct' );
+       strictEqual( uri.query.m[1], 'bar', 'order and value is correct' );
+       strictEqual( uri.query.n, '1', 'n=1 is parsed with the correct value of the expected type' );
+
+       // Change query values
+       uri.query.n = [ 'x', 'y', 'z' ];
+
+       // Verify parts and total length instead of entire string because order
+       // of iteration can vary.
+       ok( uri.toString().indexOf( 'm=foo&m=bar' ) >= 0, 'toString preserves other values' );
+       ok( uri.toString().indexOf( 'n=x&n=y&n=z' ) >= 0, 'toString parameter includes all values of an array query parameter' );
+       equal( uri.toString().length, 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
+
+       // Remove query values
+       uri.query.m.splice( 0, 1 );
+       delete uri.query.n;
+
+       equal( uri.toString(), 'http://www.example.com/dir/?m=bar', 'deletion properties' );
+
+       // Remove more query values, leaving an empty array
+       uri.query.m.splice( 0, 1 );
+       equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
+} );
+
+test( 'All-dressed URI with everything', function () {
+       var uri, queryString, relativePath;
+       expect( 11 );
+
+       uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
+
+       deepEqual(
+               {
+                       protocol: uri.protocol,
+                       user: uri.user,
+                       password: uri.password,
+                       host: uri.host,
+                       port: uri.port,
+                       path: uri.path,
+                       query: uri.query,
+                       fragment: uri.fragment
+               },
+               {
+                       protocol: 'http',
+                       user: 'auth',
+                       password: undefined,
+                       host: 'www.example.com',
+                       port: '81',
+                       path: '/dir/dir.2/index.htm',
+                       query: { q1: '0', test1: null, test2: 'value (escaped)' },
+                       fragment: 'top'
+               },
+               'basic object properties'
+       );
+
+       equal( uri.getUserInfo(), 'auth', 'user info' );
+
+       equal( uri.getAuthority(), 'auth@www.example.com:81', 'authority equal to auth@hostport' );
+
+       equal( uri.getHostPort(), 'www.example.com:81', 'hostport equal to host:port' );
+
+       queryString = uri.getQueryString();
+       ok( queryString.indexOf( 'q1=0' ) >= 0, 'query param with numbers' );
+       ok( queryString.indexOf( 'test1' ) >= 0, 'query param with null value is included' );
+       ok( queryString.indexOf( 'test1=' ) === -1, 'query param with null value does not generate equals sign' );
+       ok( queryString.indexOf( 'test2=value+%28escaped%29' ) >= 0, 'query param is url escaped' );
+
+       relativePath = uri.getRelativePath();
+       ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
+       ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
+       ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
+} );
+
+test( 'Cloning', function () {
+       var original, clone;
+       expect( 5 );
+
+       original = new mw.Uri( 'http://en.wiki.local/w/api.php?action=query&foo=bar' );
+       clone = original.clone();
+
+       deepEqual( clone, original, 'clone has equivalent properties' );
+       equal( original.toString(), clone.toString(), 'toString matches original' );
+
+       notStrictEqual( clone, original, 'clone is not the same when compared by reference' );
+
+       clone.host = 'fr.wiki.local';
+       notEqual( original.host, clone.host, 'manipulating clone did not effect original' );
+       notEqual( original.toString(), clone.toString(), 'toString no longer matches original' );
+} );
+
+test( 'Constructing mw.Uri from plain object', function () {
+       var uri;
+       expect( 3 );
+
+       uri = new mw.Uri({
+               protocol: 'http',
+               host: 'www.foo.local',
+               path: '/this'
+       });
+       equal( uri.toString(), 'http://www.foo.local/this', 'Basic properties' );
+
+       uri = new mw.Uri({
+               protocol: 'http',
+               host: 'www.foo.local',
+               path: '/this',
+               query: { hi: 'there' },
+               fragment: 'blah'
+       });
+       equal( uri.toString(), 'http://www.foo.local/this?hi=there#blah', 'More complex properties' );
+
+       raises(
+               function () {
+                       var uri = new mw.Uri({
+                               protocol: 'http',
+                               host: 'www.foo.local'
+                       });
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'Construction failed when missing required properties'
+       );
+} );
+
+test( 'Manipulate properties', function () {
+       var uriBase, uri;
+       expect( 8 );
+
+       uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
+
+       uri = uriBase.clone();
+       uri.fragment = 'frag';
+       equal( uri.toString(), 'http://en.wiki.local/w/api.php#frag', 'add a fragment' );
+
+       uri = uriBase.clone();
+       uri.host = 'fr.wiki.local';
+       uri.port = '8080';
+       equal( uri.toString(), 'http://fr.wiki.local:8080/w/api.php', 'change host and port' );
+
+       uri = uriBase.clone();
+       uri.query.foo = 'bar';
+       equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'add query arguments' );
+
+       delete uri.query.foo;
+       equal( uri.toString(), 'http://en.wiki.local/w/api.php', 'delete query arguments' );
+
+       uri = uriBase.clone();
+       uri.query.foo = 'bar';
+       equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'extend query arguments' );
+       uri.extend({
+               foo: 'quux',
+               pif: 'paf'
+       });
+       ok( uri.toString().indexOf( 'foo=quux' ) >= 0, 'extend query arguments' );
+       ok( uri.toString().indexOf( 'foo=bar' ) === -1, 'extend query arguments' );
+       ok( uri.toString().indexOf( 'pif=paf' ) >= 0 , 'extend query arguments' );
+} );
+
+test( 'Handle protocol-relative URLs', function () {
+       var UriRel, uri;
+       expect( 5 );
+
+       UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
+
+       uri = new UriRel( '//en.wiki.local/w/api.php' );
+       equal( uri.protocol, 'glork', 'create protocol-relative URLs with same protocol as document' );
+
+       uri = new UriRel( '/foo.com' );
+       equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in loose mode' );
+
+       uri = new UriRel( 'http:/foo.com' );
+       equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in loose mode' );
+
+       uri = new UriRel( '/foo.com', true );
+       equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in strict mode' );
+
+       uri = new UriRel( 'http:/foo.com', true );
+       equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
+} );
+
+test( 'Bad calls', function () {
+       var uri;
+       expect( 5 );
+
+       raises(
+               function () {
+                       new mw.Uri();
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'throw error on no arguments to constructor'
+       );
+
+       raises(
+               function () {
+                       new mw.Uri( '' );
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'throw error on empty string as argument to constructor'
+       );
+
+       raises(
+               function () {
+                       new mw.Uri( 'glaswegian penguins' );
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'throw error on non-URI as argument to constructor'
+       );
+
+       raises(
+               function () {
+                       new mw.Uri( 'foo.com/bar/baz', {
+                               strictMode: true
+                       });
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'throw error on URI without protocol or // or leading / in strict mode'
+       );
+
+       uri = new mw.Uri( 'foo.com/bar/baz', {
+               strictMode: false
+       });
+       equal( uri.toString(), 'http://foo.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
+});
+
+test( 'bug 35658', function () {
        expect( 2 );
 
-       var testProtocol = 'https://';
-       var testServer = 'foo.example.org';
-       var testPort = '3004';
-       var testPath = '/!1qy';
+       var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
 
-       var uriClass = mw.UriRelative( testProtocol + testServer + '/some/path/index.html' );
-       var uri = new uriClass( testPath );
-       var href = uri.toString();
+       testProtocol = 'https://';
+       testServer = 'foo.example.org';
+       testPort = '3004';
+       testPath = '/!1qy';
+
+       UriClass = mw.UriRelative( testProtocol + testServer + '/some/path/index.html' );
+       uri = new UriClass( testPath );
+       href = uri.toString();
        equal( href, testProtocol + testServer + testPath, 'Root-relative URL gets host & protocol supplied' );
 
-       uriClass = mw.UriRelative( testProtocol + testServer + ':' + testPort + '/some/path.php' );
-       uri = new uriClass( testPath );
+       UriClass = mw.UriRelative( testProtocol + testServer + ':' + testPort + '/some/path.php' );
+       uri = new UriClass( testPath );
        href = uri.toString();
        equal( href, testProtocol + testServer + ':' + testPort + testPath, 'Root-relative URL gets host, protocol, and port supplied' );
 
index e66cac2..fd4710f 100644 (file)
@@ -15,15 +15,16 @@ test( '-- Initial check', function() {
 });
 
 test( 'mw.Map', function() {
+       var arry, conf, funky, globalConf, nummy, someValues;
        expect(17);
 
        ok( mw.Map, 'mw.Map defined' );
 
-       var     conf = new mw.Map(),
-               // Dummy variables
-               funky = function() {},
-               arry = [],
-               nummy = 7;
+       conf = new mw.Map();
+       // Dummy variables
+       funky = function () {};
+       arry = [];
+       nummy = 7;
 
        // Tests for input validation
        strictEqual( conf.get( 'inexistantKey' ), null, 'Map.get returns null if selection was a string and the key was not found' );
@@ -36,7 +37,7 @@ test( 'mw.Map', function() {
        strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
 
        // Multiple values at once
-       var someValues = {
+       someValues = {
                'foo': 'bar',
                'lorem': 'ipsum',
                'MediaWiki': true
@@ -62,7 +63,7 @@ test( 'mw.Map', function() {
 
        ok( false === 'globalMapChecker' in window, 'new mw.Map did not store its values in the global window object by default' );
 
-       var globalConf = new mw.Map( true );
+       globalConf = new mw.Map( true );
        globalConf.set( 'anotherGlobalMapChecker', 'Hello' );
 
        ok( 'anotherGlobalMapChecker' in window, 'new mw.Map( true ) did store its values in the global window object' );
@@ -80,13 +81,14 @@ test( 'mw.config', function() {
 });
 
 test( 'mw.message & mw.messages', function() {
+       var goodbye, hello, pluralMessage;
        expect(20);
 
        ok( mw.messages, 'messages defined' );
        ok( mw.messages instanceof mw.Map, 'mw.messages instance of mw.Map' );
        ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
 
-       var hello = mw.message( 'hello' );
+       hello = mw.message( 'hello' );
 
        equal( hello.format, 'plain', 'Message property "format" defaults to "plain"' );
        strictEqual( hello.map, mw.messages, 'Message property "map" defaults to the global instance in mw.messages' );
@@ -110,7 +112,7 @@ test( 'mw.message & mw.messages', function() {
 
        strictEqual( hello.exists(), true, 'Message.exists returns true for existing messages' );
 
-       var goodbye = mw.message( 'goodbye' );
+       goodbye = mw.message( 'goodbye' );
        strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
 
        equal( goodbye.plain(), '<goodbye>', 'Message.toString returns plain <key> if format is "plain" and key does not exist' );
@@ -118,7 +120,7 @@ test( 'mw.message & mw.messages', function() {
        equal( goodbye.escaped(), '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if format is "escaped" and key does not exist' );
 
        ok( mw.messages.set( 'pluraltestmsg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
-       var pluralMessage = mw.message( 'pluraltestmsg' , 6 );
+       pluralMessage = mw.message( 'pluraltestmsg' , 6 );
        equal( pluralMessage.plain(), 'There are 6 results', 'plural get resolved when format is plain' );
        equal( pluralMessage.parse(), 'There are 6 results', 'plural get resolved when format is parse' );
 
@@ -144,9 +146,8 @@ test( 'mw.msg', function() {
 });
 
 test( 'mw.loader', function() {
-       expect(2);
-
        var isAwesomeDone;
+       expect(2);
 
        // Async ahead
        stop();
@@ -173,46 +174,83 @@ test( 'mw.loader', function() {
 });
 
 test( 'mw.loader.implement', function () {
-       expect(5 - 2);
-
-       var isJsExecuted, $element;
+       var isJsExecuted, $element, styleTestUrl;
+       expect(5);
 
        // Async ahead
        stop();
 
+       styleTestUrl = QUnit.fixurl(
+               mw.config.get( 'wgScriptPath' )
+               + '/tests/qunit/data/styleTest.css.php?'
+               + $.param({
+                       selector: '.mw-test-loaderimplement',
+                       prop: 'float',
+                       val: 'right'
+               })
+       );
+
        mw.loader.implement(
                'test.implement',
                function () {
-                       start();
+                       var styleTestTimeout, styleTestStart, styleTestSince;
 
                        strictEqual( isJsExecuted, undefined, 'javascript not executed multiple times' );
                        isJsExecuted = true;
 
                        equal( mw.loader.getState( 'test.implement' ), 'loaded', 'module state is "loaded" while implement() is executing javascript' );
-                       
+
                        $element = $( '<div class="mw-test-loaderimplement">Foo bar</div>' ).appendTo( '#qunit-fixture' );
 
-                       // @broken: equal( $element.css( 'text-align' ),'center', 'CSS stylesheet was applied in time. ("text-align: center")' );
+                       equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded before javascript execution' );
+
+                       // The @import test. This is, in a way, also an open bug for ResourceLoader
+                       // ("execute js after styles are loaded"), but browsers don't offer a way to
+                       // get a callback from when a stylesheet is loaded (that is, including any
+                       // @import rules inside).
+                       // To work around this, we'll have a little time loop to check if the styles
+                       // apply.
+                       // Note: This test originally used new Image() and onerror to get a callback
+                       // when the url is loaded, but that is fragile since it doesn't monitor the
+                       // same request as the css @import, and Safari 4 has issues with
+                       // onerror/onload not being fired at all in weird cases like this.
 
-                       // Marked broken due to a bug in qunit/index.html, via Special:JavaScriptTest/qunit it works fine
+                       styleTestTimeout = QUnit.config.testTimeout || 5000; // milliseconds
 
-                       // CSS @import is easily broken when concatenating stylesheets (bug 34669)
-                       // @broken: equal( $element.css( 'float' ), 'right', 'CSS stylesheet was applied in time via @import (bug 34669). ("float: right")' );
+                       function isCssImportApplied() {
+                               return $element.css( 'float' ) === 'right';
+                       }
+
+                       function styleTestLoop() {
+                               styleTestSince = new Date().getTime() - styleTestStart;
+                               // If it is passing or if we timed out, run the real test and stop the loop
+                               if ( isCssImportApplied() || styleTestSince > styleTestTimeout ) {
+                                       equal( $element.css( 'float' ), 'right',
+                                               'CSS stylesheet via @import was applied (after ' + styleTestSince + 'ms) (bug 34669). ("float: right")'
+                                       );
+
+                                       equal( $element.css( 'text-align' ),'center',
+                                               'CSS styles after the @import are working ("text-align: center")'
+                                       );
+
+                                       // Async done
+                                       start();
+
+                                       return;
+                               }
+                               // Otherwise, keep polling
+                               setTimeout( styleTestLoop, 100 );
+                       }
 
-                       equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded in time' );
-               
+                       // Start the loop
+                       styleTestStart = new Date().getTime();
+                       styleTestLoop();
                },
                {
                        "all": "@import url('"
-                               + QUnit.fixurl( mw.config.get( 'wgScriptPath' )
-                               + '/tests/qunit/data/styleTest.css.php?'
-                               + $.param({
-                                       selector: '.mw-test-loaderimplement',
-                                       prop: 'float',
-                                       val: 'right'
-                               }) )
+                               + styleTestUrl
                                + "');\n"
-                               + '.mw-test-loaderimplement  { text-align: center; }'
+                               + '.mw-test-loaderimplement { text-align: center; }'
                },
                {
                        "test-foobar": "Hello Foobar, $1!"
index b148715..04cf8d8 100644 (file)
@@ -24,12 +24,7 @@ class SeleniumConfig {
                        throw new MWException( "Unable to read local Selenium Settings from " . $seleniumConfigFile . "\n" );
                }
 
-               if ( !defined( 'PHP_VERSION_ID' ) ||
-                       ( PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 3 ) ) {
-                       $configArray = self::parse_5_2_ini_file( $seleniumConfigFile );
-               } else {
-                       $configArray = parse_ini_file( $seleniumConfigFile, true );
-               }
+               $configArray = parse_ini_file( $seleniumConfigFile, true );
                if ( $configArray === false ) {
                        throw new MWException( "Error parsing " . $seleniumConfigFile . "\n" );
                }
@@ -61,35 +56,6 @@ class SeleniumConfig {
                return true;
        }
 
-       /**
-        * PHP 5.2 parse_ini_file() doesn't have support for array keys.
-        * This function parses simple ini files with such syntax using just
-        * 5.2 functions.
-        */
-       private static function parse_5_2_ini_file( $ConfigFile ) {
-               $file = fopen( $ConfigFile, "rt" );
-               if ( !$file ) {
-                       return false;
-               }
-               $header = '';
-
-               $configArray = array();
-
-               while ( ( $line = fgets( $file ) ) !== false ) {
-                       $line = strtok( $line, "\r\n" );
-
-                       if ( !$line || $line[0] == ';' ) continue;
-
-                       if ( $line[0] == '[' && substr( $line, -1 ) == ']' ) {
-                               $header = substr( $line, 1, -1 );
-                               $configArray[$header] = array();
-                       } else {
-                               $configArray[$header] = array_merge_recursive( $configArray[$header], self::parse_ini_line( $line ) );
-                       }
-               }
-               return $configArray;
-       }
-
        private static function parse_ini_line( $iniLine ) {
                static $specialValues = array( 'false' => false, 'true' => true, 'null' => null );
                list( $key, $value ) = explode( '=', $iniLine, 2 );